@brandlab-digital/conformance 3.5.0 → 3.5.2

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.
@@ -23,23 +23,23 @@ export const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze({
23
23
  "kind": "brandlab-runtime-release-contract",
24
24
  "packages": {
25
25
  "@brandlab-digital/conformance": {
26
- "version": "3.5.0"
26
+ "version": "3.5.2"
27
27
  },
28
28
  "@brandlab-digital/eslint-plugin": {
29
- "version": "3.5.0"
29
+ "version": "3.5.2"
30
30
  },
31
31
  "@brandlab-digital/site-core": {
32
- "version": "3.5.0"
32
+ "version": "3.5.2"
33
33
  },
34
34
  "@brandlab-digital/site-next": {
35
- "version": "3.5.0"
35
+ "version": "3.5.2"
36
36
  }
37
37
  },
38
- "releaseVersion": "3.5.0",
38
+ "releaseVersion": "3.5.2",
39
39
  "runtime": {
40
40
  "bundler": "turbopack",
41
41
  "cacheComponents": false,
42
- "next": "16.3.8",
42
+ "next": "16.4.2",
43
43
  "nextVersionPolicy": "exact",
44
44
  "node": "24.x",
45
45
  "packageManager": "npm@11.14.1",
@@ -1 +1 @@
1
- {"version":3,"file":"current-release.js","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wEAAwE;AACxE,OAAO,EAEL,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC,MAAM,CAC7D;IACE,cAAc,EAAE;QACd,uCAAuC;QACvC,8BAA8B;QAC9B,yBAAyB;QACzB,6BAA6B;QAC7B,0BAA0B;QAC1B,4BAA4B;QAC5B,kCAAkC;QAClC,wCAAwC;QACxC,yBAAyB;KAC1B;IACD,WAAW,EAAE;QACX,WAAW,EAAE,cAAc;QAC3B,cAAc,EAAE,iBAAiB;QACjC,eAAe,EAAE,mBAAmB;QACpC,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,QAAQ;KAChB;IACD,MAAM,EAAE,mCAAmC;IAC3C,UAAU,EAAE;QACV,+BAA+B,EAAE;YAC/B,SAAS,EAAE,OAAO;SACnB;QACD,iCAAiC,EAAE;YACjC,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;KACF;IACD,gBAAgB,EAAE,OAAO;IACzB,SAAS,EAAE;QACT,SAAS,EAAE,WAAW;QACtB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EAAE,QAAQ;QAChB,mBAAmB,EAAE,OAAO;QAC5B,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,aAAa;QAC/B,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,QAAQ;QACjB,YAAY,EAAE,OAAO;KACtB;IACD,eAAe,EAAE,sCAAsC;CACxD,CAC6C,CAAC;AAE/C,sCAAsC,CAAC,gCAAgC,CAAC,CAAC","sourcesContent":["// Generated by standards/scripts/generate-conformance-current-release.mjs.\n// Each exact package release verifies its own current runtime contract.\nimport {\n type BrandlabRuntimeReleaseContract,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\n\nexport const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze(\n{\n \"capabilities\": [\n \"typed-project-business-and-route-data\",\n \"essential-search-foundations\",\n \"shared-contact-delivery\",\n \"privacy-safe-lead-analytics\",\n \"security-patched-runtime\",\n \"live-google-review-summary\",\n \"high-signal-project-verification\",\n \"packed-positive-and-negative-consumers\",\n \"changesets-oidc-release\"\n ],\n \"contracts\": {\n \"analytics\": \"analytics-v4\",\n \"architecture\": \"architecture-v7\",\n \"configuration\": \"project-config-v7\",\n \"contact\": \"contact-v4\",\n \"seo\": \"seo-v4\"\n },\n \"kind\": \"brandlab-runtime-release-contract\",\n \"packages\": {\n \"@brandlab-digital/conformance\": {\n \"version\": \"3.5.0\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"3.5.0\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"3.5.0\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"3.5.0\"\n }\n },\n \"releaseVersion\": \"3.5.0\",\n \"runtime\": {\n \"bundler\": \"turbopack\",\n \"cacheComponents\": false,\n \"next\": \"16.3.8\",\n \"nextVersionPolicy\": \"exact\",\n \"node\": \"24.x\",\n \"packageManager\": \"npm@11.14.1\",\n \"react\": \"19.2.8\",\n \"reactDom\": \"19.2.8\",\n \"router\": \"app\",\n \"sharp\": \"0.35.5\",\n \"typescript\": \"6.0.3\"\n },\n \"schemaVersion\": \"brandlab.runtime-release-contract.v1\"\n},\n) as unknown as BrandlabRuntimeReleaseContract;\n\nvalidateBrandlabRuntimeReleaseContract(BRANDLAB_CURRENT_RUNTIME_RELEASE);\n"]}
1
+ {"version":3,"file":"current-release.js","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wEAAwE;AACxE,OAAO,EAEL,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC,MAAM,CAC7D;IACE,cAAc,EAAE;QACd,uCAAuC;QACvC,8BAA8B;QAC9B,yBAAyB;QACzB,6BAA6B;QAC7B,0BAA0B;QAC1B,4BAA4B;QAC5B,kCAAkC;QAClC,wCAAwC;QACxC,yBAAyB;KAC1B;IACD,WAAW,EAAE;QACX,WAAW,EAAE,cAAc;QAC3B,cAAc,EAAE,iBAAiB;QACjC,eAAe,EAAE,mBAAmB;QACpC,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,QAAQ;KAChB;IACD,MAAM,EAAE,mCAAmC;IAC3C,UAAU,EAAE;QACV,+BAA+B,EAAE;YAC/B,SAAS,EAAE,OAAO;SACnB;QACD,iCAAiC,EAAE;YACjC,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;KACF;IACD,gBAAgB,EAAE,OAAO;IACzB,SAAS,EAAE;QACT,SAAS,EAAE,WAAW;QACtB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EAAE,QAAQ;QAChB,mBAAmB,EAAE,OAAO;QAC5B,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,aAAa;QAC/B,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,QAAQ;QACjB,YAAY,EAAE,OAAO;KACtB;IACD,eAAe,EAAE,sCAAsC;CACxD,CAC6C,CAAC;AAE/C,sCAAsC,CAAC,gCAAgC,CAAC,CAAC","sourcesContent":["// Generated by standards/scripts/generate-conformance-current-release.mjs.\n// Each exact package release verifies its own current runtime contract.\nimport {\n type BrandlabRuntimeReleaseContract,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\n\nexport const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze(\n{\n \"capabilities\": [\n \"typed-project-business-and-route-data\",\n \"essential-search-foundations\",\n \"shared-contact-delivery\",\n \"privacy-safe-lead-analytics\",\n \"security-patched-runtime\",\n \"live-google-review-summary\",\n \"high-signal-project-verification\",\n \"packed-positive-and-negative-consumers\",\n \"changesets-oidc-release\"\n ],\n \"contracts\": {\n \"analytics\": \"analytics-v4\",\n \"architecture\": \"architecture-v7\",\n \"configuration\": \"project-config-v7\",\n \"contact\": \"contact-v4\",\n \"seo\": \"seo-v4\"\n },\n \"kind\": \"brandlab-runtime-release-contract\",\n \"packages\": {\n \"@brandlab-digital/conformance\": {\n \"version\": \"3.5.2\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"3.5.2\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"3.5.2\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"3.5.2\"\n }\n },\n \"releaseVersion\": \"3.5.2\",\n \"runtime\": {\n \"bundler\": \"turbopack\",\n \"cacheComponents\": false,\n \"next\": \"16.4.2\",\n \"nextVersionPolicy\": \"exact\",\n \"node\": \"24.x\",\n \"packageManager\": \"npm@11.14.1\",\n \"react\": \"19.2.8\",\n \"reactDom\": \"19.2.8\",\n \"router\": \"app\",\n \"sharp\": \"0.35.5\",\n \"typescript\": \"6.0.3\"\n },\n \"schemaVersion\": \"brandlab.runtime-release-contract.v1\"\n},\n) as unknown as BrandlabRuntimeReleaseContract;\n\nvalidateBrandlabRuntimeReleaseContract(BRANDLAB_CURRENT_RUNTIME_RELEASE);\n"]}
@@ -17,7 +17,10 @@ export interface EngineeringCheck {
17
17
  coverage: string;
18
18
  outstandingEvidence: readonly string[];
19
19
  }
20
- /** The Vercel function region of every Brandlab site (3.2.1): Sydney. */
20
+ /**
21
+ * The Vercel function region of a Brandlab site without a hosting block (3.2.1): Sydney. From 3.4.1 brandlab.config
22
+ * `hosting` may record another origin (W5, see hosting.ts).
23
+ */
21
24
  export declare const BRANDLAB_FUNCTION_REGION = "syd1";
22
25
  /**
23
26
  * The Vercel ignored build step of every Brandlab site (3.3.3). Exit 0 skips a deployment, anything else builds it:
@@ -1 +1 @@
1
- {"version":3,"file":"engineering.d.ts","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,yBAAyB,sGAAuG,CAAC;AAE9I,oFAAoF;AACpF,eAAO,MAAM,+BAA+B,4IAC+F,CAAC;AAE5I,iFAAiF;AACjF,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASrE,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,MAAM,CAAC;AAC5D,MAAM,WAAW,kBAAkB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,0BAA0B,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AACxI,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAqBD,yEAAyE;AACzE,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAC/C;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,iOAC6K,CAAC;AAqBzN,iGAAiG;AACjG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAyBxE;AAwCD,uDAAuD;AACvD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CA2B5G"}
1
+ {"version":3,"file":"engineering.d.ts","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,yBAAyB,sGAAuG,CAAC;AAE9I,oFAAoF;AACpF,eAAO,MAAM,+BAA+B,4IAC+F,CAAC;AAE5I,iFAAiF;AACjF,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASrE,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,MAAM,CAAC;AAC5D,MAAM,WAAW,kBAAkB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,0BAA0B,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AACxI,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAqBD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,SAAiC,CAAC;AACvE;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,iOAC6K,CAAC;AAqBzN,iGAAiG;AACjG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAyBxE;AAwCD,uDAAuD;AACvD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CA2B5G"}
@@ -2,6 +2,7 @@ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
2
2
  import { join, posix } from 'node:path';
3
3
  import ts from 'typescript';
4
4
  import { globMatch } from './glob.js';
5
+ import { BRANDLAB_DEFAULT_ORIGIN_REGION, checkOriginRegion } from './hosting.js';
5
6
  import { collectBrandlabSource, createBrandlabModuleResolver, findImportedCalls, isDirectory, lineOfNode, listModuleReferences, objectPropertyValue, parseBrandlabSourceFile, walkProjectFiles, } from './source-files.js';
6
7
  import { describeCapabilities } from './static-rules.js';
7
8
  export const ENGINEERING_FAST_COMMANDS = ['typecheck', 'lint', 'test', 'check:unused', 'check:unused:production', 'check:standards'];
@@ -29,8 +30,11 @@ const CODE_OR_STYLE = /\.(?:[cm]?[jt]sx?|mdx|css)$/;
29
30
  const PASCAL_COMPONENT = /^[A-Z][A-Za-z0-9]*\.tsx$/;
30
31
  const CAMEL_MODULE = /^[a-z][A-Za-z0-9]*(?:\.d)?\.ts$/;
31
32
  const SEMVER = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
32
- /** The Vercel function region of every Brandlab site (3.2.1): Sydney. */
33
- export const BRANDLAB_FUNCTION_REGION = 'syd1';
33
+ /**
34
+ * The Vercel function region of a Brandlab site without a hosting block (3.2.1): Sydney. From 3.4.1 brandlab.config
35
+ * `hosting` may record another origin (W5, see hosting.ts).
36
+ */
37
+ export const BRANDLAB_FUNCTION_REGION = BRANDLAB_DEFAULT_ORIGIN_REGION;
34
38
  /**
35
39
  * The Vercel ignored build step of every Brandlab site (3.3.3). Exit 0 skips a deployment, anything else builds it:
36
40
  * a production deployment is skipped only when git shows every change since the last successful production
@@ -79,7 +83,7 @@ export function checkEngineeringStructure(root) {
79
83
  inspectServerBoundaries(root, capabilities, source, add);
80
84
  inspectTests(root, capabilities, add);
81
85
  inspectToolPresets(root, add);
82
- inspectDelivery(root, add);
86
+ inspectDelivery(root, config, add);
83
87
  return { status: findings.some(finding => finding.severity === 'blocker') ? 'blocked' : 'pass', findings,
84
88
  coverage: 'Static layout, naming, command, dependency-pin, tool-preset, CI, deployment and documentation structure only. This is not engineering-standard completion.',
85
89
  outstandingEvidence: ['Usage and deletion review including assets, configuration and dynamic references', 'Business data and component/style ownership review', 'Clean install, fast checks and production build', 'Full discovered technical URL estate', 'All distinct page families and important browser journeys', 'Exact-source protected Preview', 'Reporting/Ads provider cutover and authorised production verification'] };
@@ -635,7 +639,7 @@ function inspectToolPresets(root, add) {
635
639
  }
636
640
  }
637
641
  // --- CI, dependencies, Vercel and docs (section 6) ---------------------------
638
- function inspectDelivery(root, add) {
642
+ function inspectDelivery(root, config, add) {
639
643
  const workflowDirectory = join(root, '.github/workflows');
640
644
  const workflows = isDirectory(workflowDirectory) ? readdirSync(workflowDirectory).filter(name => /\.ya?ml$/.test(name)).sort() : [];
641
645
  const callers = workflows.filter(name => /uses\s*:\s*['"]?RomieDandan\/brandlab\/\.github\/workflows\/verify-next\.yml@/.test(readFileSync(join(workflowDirectory, name), 'utf8')));
@@ -663,9 +667,8 @@ function inspectDelivery(root, add) {
663
667
  catch {
664
668
  regions = undefined;
665
669
  }
666
- if (!Array.isArray(regions) || regions.length !== 1 || regions[0] !== BRANDLAB_FUNCTION_REGION) {
667
- add('vercel.json', 'vercel-region', `vercel.json runs the server functions in Sydney: "regions": ["${BRANDLAB_FUNCTION_REGION}"] (found ${regions === undefined ? 'no regions' : JSON.stringify(regions)}). The visitors are in Australia; a Washington (iad1) function adds a Pacific round trip to every request it serves.`);
668
- }
670
+ for (const message of checkOriginRegion(config, regions))
671
+ add('vercel.json', 'vercel-region', message);
669
672
  let ignoreCommand;
670
673
  try {
671
674
  ignoreCommand = vercel === null ? undefined : JSON.parse(vercel).ignoreCommand;
@@ -1 +1 @@
1
- {"version":3,"file":"engineering.js","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,GAGjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,yBAAyB,EAAE,iBAAiB,CAAU,CAAC;AAE9I,oFAAoF;AACpF,MAAM,CAAC,MAAM,+BAA+B,GAC1C,yIAAyI,CAAC;AAE5I,iFAAiF;AACjF,MAAM,CAAC,MAAM,yBAAyB,GAAqC,MAAM,CAAC,MAAM,CAAC;IACvF,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,8BAA8B;IACzC,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,YAAY;IAClB,UAAU,EAAE,iBAAiB;IAC7B,cAAc,EAAE,MAAM;IACtB,yBAAyB,EAAE,mBAAmB;IAC9C,iBAAiB,EAAE,yCAAyC;CAC7D,CAAC,CAAC;AAkBH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;AACpG,MAAM,cAAc,GAAG,oEAAoE,CAAC;AAC5F,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;AAC3F,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AAC5F,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;AACpJ,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACrE,MAAM,iBAAiB,GAAG,oNAAoN,CAAC;AAC/O,MAAM,aAAa,GAAG,6BAA6B,CAAC;AACpD,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AACpD,MAAM,YAAY,GAAG,iCAAiC,CAAC;AACvD,MAAM,MAAM,GAAG,qCAAqC,CAAC;AAErD,yEAAyE;AACzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAC/C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,8BAA8B,GACzC,sNAAsN,CAAC;AACzN,0GAA0G;AAC1G,MAAM,eAAe,GAAG,8BAA8B,CAAC;AACvD,kFAAkF;AAClF,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AACzD,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,aAAa,GAAG,oBAAoB,CAAC;AAC3C,MAAM,mBAAmB,GAAG,8EAA8E,CAAC;AAC3G,MAAM,eAAe,GAAG,uCAAuC,CAAC;AAChE;;;;GAIG;AACH,MAAM,sBAAsB,GAAgC,IAAI,GAAG,CAAC;IAClE,CAAC,eAAe,EAAE,yFAAyF,CAAC;IAC5G,CAAC,4CAA4C,EAAE,2BAA2B,CAAC;IAC3E,CAAC,mDAAmD,EAAE,kCAAkC,CAAC;IACzF,CAAC,4DAA4D,EAAE,oEAAoE,CAAC;CACrI,CAAC,CAAC;AAEH,iGAAiG;AACjG,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,iBAAiB,CAAC,KAAK,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe,EAAE,QAAkE,EAAE,EAAE,EAAE,CAChI,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7H,IAAI,GAAG,GAAoB,EAAE,CAAC;IAC9B,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,CAAC;IAC3E,MAAM,CAAC;QAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,EAAE,sCAAsC,CAAC,CAAC;IAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5H,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAE3C,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1B,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;IACvC,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,uBAAuB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACzD,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;IACtC,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9B,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE3B,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ;QACtG,QAAQ,EAAE,4JAA4J;QACtK,mBAAmB,EAAE,CAAC,kFAAkF,EAAE,oDAAoD,EAAE,iDAAiD,EAAE,sCAAsC,EAAE,2DAA2D,EAAE,gCAAgC,EAAE,uEAAuE,CAAC,EAAE,CAAC;AACza,CAAC;AAID,gFAAgF;AAEhF,SAAS,eAAe,CAAC,GAAoB,EAAE,GAAQ;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAClC,KAAK,MAAM,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,yBAAyB,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;QACpG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE;YAAE,GAAG,CAAC,cAAc,EAAE,kBAAkB,EAAE,WAAW,OAAO,WAAW,CAAC,CAAC;IACxG,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,EAAE,CAAC;QACzE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;YACvD,GAAG,CAAC,cAAc,EAAE,iBAAiB,EAAE,GAAG,IAAI,qBAAqB,QAAQ,aAAa,MAAM,KAAK,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACtC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9G,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,cAAc,EAAE,2BAA2B,EAC7C,sFAAsF,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,kCAAkC,+BAA+B,IAAI,CAAC,CAAC;QAC1L,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;QAC7B,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO;QAChC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC7D,KAAK,MAAM,SAAS,IAAI,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;gBAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACrF,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChB,KAAK,MAAM,OAAO,IAAI,yBAAyB,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,GAAG,CAAC,cAAc,EAAE,qBAAqB,EAAE,uBAAuB,OAAO,eAAe,+BAA+B,IAAI,CAAC,CAAC;IAC5J,CAAC;IACD,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,2FAA2F,CAAC,CAAC;AAC/J,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACvF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,OAAyC;IACzF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACtE,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IAC9B,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QACnC,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,GAAG;YAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACrG,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,IAAI,KAAK,IAAI;gBAAE,MAAM;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,2FAA2F;QAC3F,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YACxG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACnG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAEhF,SAAS,mBAAmB,CAAC,GAAoB,EAAE,GAAQ;IACzD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;QAAE,GAAG,CAAC,cAAc,EAAE,aAAa,EAAE,2BAA2B,CAAC,CAAC;IAC3F,MAAM,YAAY,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;IACrE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,cAAc,EAAE,aAAa,EAAE,OAAO,IAAI,uCAAuC,CAAC,CAAC;IAC1H,CAAC;IACD,2GAA2G;IAC3G,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;SACxC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;SACpH,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,qDAAqD,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3I,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;IAC/B,KAAK,MAAM,SAAS,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,GAAG,CAAC,cAAc,EAAE,yBAAyB,EAAE,GAAG,SAAS,iCAAiC,IAAI,IAAI,SAAS,YAAY,IAAI,GAAG,CAAC,CAAC;IAC/J,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC;QAAE,GAAG,CAAC,cAAc,EAAE,yBAAyB,EAAE,iFAAiF,CAAC,CAAC;IAC3K,IAAI,GAAG,CAAC,YAAY,EAAE,KAAK,IAAI,GAAG,CAAC,eAAe,EAAE,KAAK;QAAE,GAAG,CAAC,cAAc,EAAE,qBAAqB,EAAE,oGAAoG,CAAC,CAAC;AAC9M,CAAC;AAED,iFAAiF;AAEjF,SAAS,aAAa,CAAC,IAAY,EAAE,YAAqD,EAAE,GAAQ;IAClG,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;QAC/F,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,EAAE,qBAAqB,EAAE,gDAAgD,IAAI,GAAG,CAAC,CAAC;IAChI,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,wBAAwB,EAAE,CAAC;QAC5C,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,EAAE,uBAAuB,EAAE,4FAA4F,CAAC,CAAC;IACrK,CAAC;IACD,MAAM,QAAQ,GAAG;QACf,oBAAoB,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,uBAAuB;QACtH,yBAAyB,EAAE,+BAA+B,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,8BAA8B;QACrI,8BAA8B;QAC9B,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,uBAAuB,EAAE,eAAe,EAAE,8BAA8B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClH,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5E,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,uCAAuC,IAAI,GAAG,CAAC,CAAC;IAC7G,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI;QAC5B,CAAC,mBAAmB,EAAE,+EAA+E,CAAC;QACtG,CAAC,mBAAmB,EAAE,2EAA2E,CAAC;QAClG,CAAC,+BAA+B,EAAE,mFAAmF,CAAC;QACtH,CAAC,8BAA8B,EAAE,kFAAkF,CAAC;QACpH,CAAC,4BAA4B,EAAE,gFAAgF,CAAC;QAChH,CAAC,wCAAwC,EAAE,0DAA0D,CAAC;QACtG,CAAC,oDAAoD,EAAE,iCAAiC,CAAC;QACzF,CAAC,sBAAsB,EAAE,uFAAuF,CAAC;QACjH,CAAC,yBAAyB,EAAE,uFAAuF,CAAC;QACpH,CAAC,gCAAgC,EAAE,iEAAiE,CAAC;QACrG,CAAC,qCAAqC,EAAE,8DAA8D,CAAC;QACvG,CAAC,sBAAsB,EAAE,wDAAwD,CAAC;KAC1E,EAAE,CAAC;QACX,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5E,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACzC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3D,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;oBACjG,GAAG,CAAC,IAAI,EAAE,iBAAiB,EAAE,qDAAqD,CAAC,CAAC;gBACtF,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAChE,GAAG,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,IAAI,iFAAiF,CAAC,CAAC;QACzH,CAAC;IACH,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACvF,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;gBAAE,SAAS;YACvE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,EAAE,EAAE,gBAAgB,EAAE,iFAAiF,CAAC,CAAC;YAC3I,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,IAAY,EAAE,GAAQ;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,SAAS,KAAK,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO;IAC7D,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACrD,0GAA0G;QAC1G,2EAA2E;QAC3E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;YACvF,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,IAAI,eAAe,SAAS,2EAA2E,CAAC,CAAC;QAC5I,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,6FAA6F;QAC7F,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,aAAa,CAAC,CAAC;QAClH,IAAI,aAAa,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,EAAE,kBAAkB,EAAE,iEAAiE,aAAa,IAAI,CAAC,CAAC;YAClH,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,qBAAqB;gBAAE,OAAO;YAC3E,GAAG,CAAC,IAAI,EAAE,kBAAkB,EAAE,sGAAsG,CAAC,CAAC;YACtI,OAAO;QACT,CAAC;IACH,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO;IAC3E,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,4CAA4C,CAAC,CAAC;IACzE,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,uDAAuD,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,+BAA+B,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5H,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,8CAA8C,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,SAAS,oBAAoB,CAAC,IAAY,EAAE,MAA2B,EAAE,GAAQ;IAC/E,MAAM,QAAQ,GAAG,4BAA4B,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,wEAAwE,CAAC,CAAC;QACzG,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,uBAAuB,EAAE,iEAAiE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACvH,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAC/C,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACpF,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC1D,IAAI,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;oBACtF,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,uFAAuF,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,4BAA4B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IACjE,IAAI,MAAM,EAAE,CAAC;QACX,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACvC,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,SAAS,uBAAuB,CAC9B,IAAY,EACZ,YAAqD,EACrD,MAA2B,EAC3B,GAAQ;IAER,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACnD,IAAI,YAAY,CAAC,cAAc,IAAI,OAAO,EAAE,CAAC;QAC3C,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,eAAe,EAAE,oBAAoB,EAAE,GAAG,eAAe,iFAAiF,CAAC,CAAC;QAClJ,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,eAAe,EAAE,iBAAiB,EAAE,GAAG,eAAe,kHAAkH,CAAC,CAAC;QAChL,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QACrB,GAAG,CAAC,uBAAuB,EAAE,iBAAiB,EAAE,6BAA6B,eAAe,8IAA8I,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/P,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACtD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,GAAG,iBAAiB,iFAAiF,CAAC,CAAC;QACtJ,CAAC;QACD,IAAI,iBAAiB,CAAC,QAAQ,EAAE,0CAA0C,EAAE,wBAAwB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnH,GAAG,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,GAAG,iBAAiB,mFAAmF,CAAC,CAAC;QACvJ,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAClD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;YACnB,GAAG,CAAC,eAAe,EAAE,mBAAmB,EAAE,GAAG,eAAe,qGAAqG,iBAAiB,8BAA8B,EAC9M,EAAE,IAAI,EAAE,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,IAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,4KAA4K,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACxO,CAAC;IAED,MAAM,QAAQ,GAAG,4BAA4B,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnK,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC5B,KAAK,MAAM,SAAS,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,SAAS,CAAC,QAAQ;gBAAE,SAAS;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC7C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,EAAE,GAA8B,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3F,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,IAAI,EAAE,wBAAwB,EAAE,uDAAuD,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACjK,SAAS;QACX,CAAC;QACD,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,IAAI,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QACzI,IAAI,WAAW,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,sBAAsB,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,yBAAyB,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,SAAS,6EAA6E,WAAW,CAAC,SAAS,KAAK,eAAe,CAAC,CAAC,CAAC,qMAAqM,CAAC,CAAC,CAAC,kDAAkD,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1iB,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,EAAE,wBAAwB,EAAE,oEAAoE,KAAK,CAAC,IAAI,CAAC,uBAAuB,iBAAiB,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACpL,CAAC;IACH,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,SAAS,cAAc,CAAC,IAAwB;IAC9C,KAAK,MAAM,SAAS,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QACjE,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QACpG,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,IAAI,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+CAA+C;AAC/C,SAAS,iBAAiB,CAAC,IAAwB;IACjD,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAC/D,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY;QAC5D,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,SAAS,CAAC,eAAe,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;AACvG,CAAC;AAED,gFAAgF;AAChF,SAAS,YAAY,CAAC,IAAwB,EAAE,IAAY;IAC1D,KAAK,MAAM,SAAS,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QACjE,IAAI,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,KAAK,MAAM,WAAW,IAAI,SAAS,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;gBACjE,IAAI,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI;oBAAE,OAAO,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;YACtH,OAAO,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,oGAAoG;AACpG,SAAS,mBAAmB,CAAC,IAAwB;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,CAAC,IAAa,EAAE,EAAE;QAC9B,IAAI,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACzK,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7F,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,KAAK,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2EAA2E;AAC3E,SAAS,kBAAkB,CAAC,IAAwB;IAClD,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,IAAI,EAAE,sCAAsC,EAAE,oBAAoB,CAAC,EAAE,CAAC;QACzG,IAAI,UAAU,GAA8B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,UAAU,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,qBAAqB,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACzI,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,UAAU,CAAC;YAAE,SAAS;QACvE,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CACtD,CAAC,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAC;YACnF,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QACnH,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,MAAM,KAAK,GAAG,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC;YAC7C,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC;YAC1C,CAAC,CAAC,EAAE,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnD,OAAO,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,4FAA4F;AAC5F,SAAS,iBAAiB,CAAC,IAAwB;IACjD,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7K,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,QAAQ,GACZ,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,KAAK,SAAS;YAC5E,CAAC,SAAS,CAAC,YAAY,KAAK,SAAS,IAAI,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,YAAY,CAAC;gBAChF,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACjH,CAAC,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACzH,IAAI,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0FAA0F;AAC1F,SAAS,QAAQ,CAAC,IAAwB;IACxC,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;IAC5D,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAChE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9I,CAAC;AAED,SAAS,4BAA4B,CAAC,IAAwB,EAAE,GAAQ;IACtE,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC;SACvC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,iCAAiC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;SAC/G,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/J,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1I,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,yBAAyB,EACtC,GAAG,KAAK,CAAC,QAAQ,kIAAkI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/K,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAwB,EAAE,GAAQ;IACnE,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,IAAI,EAAE,2CAA2C,EAAE,sBAAsB,CAAC,EAAE,CAAC;QAChH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC9E,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACpG,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAC5C,IAAI,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC;gBAAE,OAAO,OAAO,CAAC,IAAI,CAAC;YACzD,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAClD,OAAO,IAAI,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,4BAA4B,EACzC,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,uEAAuE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAChJ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,uHAAuH;AACvH,SAAS,YAAY,CAAC,IAAwB,EAAE,IAA+B;IAC7E,MAAM,MAAM,GAAG,CAAC,UAAqC,EAA6B,EAAE;QAClF,IAAI,OAAO,GAAG,UAAU,CAAC;QACzB,OAAO,OAAO,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC7H,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;QAC/B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,KAAK,IAAI,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,KAAK,MAAM,SAAS,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QACjE,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC;YAAE,SAAS;QACjD,KAAK,MAAM,WAAW,IAAI,SAAS,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;YACjE,IAAI,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC9E,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;gBACpD,OAAO,WAAW,IAAI,EAAE,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3F,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qGAAqG;AACrG,SAAS,yBAAyB,CAAC,IAAwB,EAAE,GAAQ;IACnE,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,IAAI,EAAE,2CAA2C,EAAE,sBAAsB,CAAC,EAAE,CAAC;QAChH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,EAChC,qGAAqG,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC/I,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAC9C,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;YACrC,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;YACpB,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,uCAAuC,CAAC;YAC/G,OAAO,GAAG,KAAK,IAAI,sBAAsB,SAAS,KAAK,GAAG,CAAC;QAC7D,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,EAChC,GAAG,KAAK,0FAA0F,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACzH,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACjD,CAAC;AAED,iFAAiF;AAEjF,SAAS,YAAY,CAAC,IAAY,EAAE,YAAqD,EAAE,GAAQ;IACjG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAAE,OAAO;IAC9C,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9E,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACzC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,+DAA+D,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG;QACf,2BAA2B,EAAE,gCAAgC;QAC7D,0BAA0B,EAAE,6BAA6B,EAAE,4BAA4B;QACvF,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,8BAA8B,EAAE,2BAA2B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACtG,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,oCAAoC,IAAI,GAAG,CAAC,CAAC;IAC5G,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,EAAE,qBAAqB,EAAE,8EAA8E,CAAC,CAAC;IACnJ,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,SAAS,kBAAkB,CAAC,IAAY,EAAE,GAAQ;IAChD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC7D,IAAI,MAAM,KAAK,IAAI;QAAE,GAAG,CAAC,mBAAmB,EAAE,aAAa,EAAE,8DAA8D,CAAC,CAAC;SACxH,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAChJ,GAAG,CAAC,mBAAmB,EAAE,aAAa,EAAE,sHAAsH,CAAC,CAAC;IAClK,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACjD,IAAI,IAAI,KAAK,IAAI;QAAE,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,6DAA6D,CAAC,CAAC;SAC3G,IAAI,CAAC,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClH,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,yFAAyF,CAAC,CAAC;IAC3H,CAAC;IACD,IAAI,CAAC,CAAC,sBAAsB,EAAE,uBAAuB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,GAAG,CAAC,sBAAsB,EAAE,aAAa,EAAE,4DAA4D,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,CAAC,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,GAAG,CAAC,kBAAkB,EAAE,aAAa,EAAE,qDAAqD,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,SAAS,eAAe,CAAC,IAAY,EAAE,GAAQ;IAC7C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpI,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,+EAA+E,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACpL,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC;QACxD,GAAG,CAAC,8BAA8B,EAAE,aAAa,EAAE,iIAAiI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IACxO,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,CAAC,wBAAwB,EAAE,yBAAyB,EAAE,eAAe,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,aAAa,EAAE,kBAAkB,CAAC,EAAE,CAAC;QACxK,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,EAAE,iBAAiB,EAAE,qFAAqF,CAAC,CAAC;IACxJ,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IACvD,IAAI,cAAuB,CAAC;IAC5B,IAAI,CAAC;QAAC,cAAc,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,cAAc,GAAG,SAAS,CAAC;IAAC,CAAC;IAC/H,IAAI,cAAc,KAAK,QAAQ;QAAE,GAAG,CAAC,aAAa,EAAE,gBAAgB,EAAE,8CAA8C,CAAC,CAAC;IACtH,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QAAC,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,GAAG,SAAS,CAAC;IAAC,CAAC;IAC1G,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,wBAAwB,EAAE,CAAC;QAC/F,GAAG,CAAC,aAAa,EAAE,eAAe,EAAE,iEAAiE,wBAAwB,aAAa,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,sHAAsH,CAAC,CAAC;IAClU,CAAC;IACD,IAAI,aAAsB,CAAC;IAC3B,IAAI,CAAC;QAAC,aAAa,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,aAAa,GAAG,SAAS,CAAC;IAAC,CAAC;IAC5H,IAAI,aAAa,KAAK,8BAA8B,EAAE,CAAC;QACrD,GAAG,CAAC,aAAa,EAAE,qBAAqB,EAAE,sIAAsI,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,WAAW,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,oIAAoI,CAAC,CAAC;IACrb,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAAE,GAAG,CAAC,WAAW,EAAE,cAAc,EAAE,mGAAmG,CAAC,CAAC;IAChL,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,GAAG,CAAC,WAAW,EAAE,cAAc,EAAE,+DAA+D,CAAC,CAAC;SACtH,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,KAAK;QAAE,GAAG,CAAC,WAAW,EAAE,cAAc,EAAE,gBAAgB,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,wEAAwE,CAAC,CAAC;IACxL,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACrD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,YAAY;QAAE,GAAG,CAAC,WAAW,EAAE,cAAc,EAAE,0CAA0C,CAAC,CAAC;AACtI,CAAC;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA+B,CAAC;AAEjE,kEAAkE;AAClE,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC;YAAC,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QAAC,CAAC;QAC5E,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, posix } from 'node:path';\nimport ts from 'typescript';\nimport { globMatch } from './glob.js';\nimport {\n collectBrandlabSource,\n createBrandlabModuleResolver,\n findImportedCalls,\n isDirectory,\n lineOfNode,\n listModuleReferences,\n objectPropertyValue,\n parseBrandlabSourceFile,\n walkProjectFiles,\n type BrandlabSourceFile,\n type BrandlabSourceIndex,\n} from './source-files.js';\nimport { describeCapabilities } from './static-rules.js';\n\nexport const ENGINEERING_FAST_COMMANDS = ['typecheck', 'lint', 'test', 'check:unused', 'check:unused:production', 'check:standards'] as const;\n\n/** The exact fast verification command from the Brandlab 3.0 target (section 6). */\nexport const BRANDLAB_EXPECTED_VERIFY_SCRIPT =\n 'npm run check:standards && npm run typecheck && npm run lint && npm run test && npm run check:unused && npm run check:unused:production';\n\n/** Scripts whose exact values the 3.0 target fixes; dev and start must exist. */\nexport const BRANDLAB_EXPECTED_SCRIPTS: Readonly<Record<string, string>> = Object.freeze({\n build: 'next build',\n typecheck: 'next typegen && tsc --noEmit',\n lint: 'eslint .',\n test: 'vitest run',\n 'test:e2e': 'playwright test',\n 'check:unused': 'knip',\n 'check:unused:production': 'knip --production',\n 'check:standards': 'brandlab-verify --mode ci --engineering',\n});\n\nexport type EngineeringFindingSeverity = 'blocker' | 'info';\nexport interface EngineeringFinding { path: string; rule: string; message: string; severity: EngineeringFindingSeverity; line?: number }\nexport interface EngineeringCheck {\n status: 'pass' | 'blocked';\n findings: EngineeringFinding[];\n coverage: string;\n outstandingEvidence: readonly string[];\n}\n\ninterface PackageManifest {\n type?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nconst SRC_DIRECTORIES = new Set(['app', 'config', 'data', 'content', 'lib', 'components', 'types']);\nconst SRC_ROOT_FILES = /^(?:instrumentation(?:-client)?|proxy|mdx-components)\\.(?:ts|tsx)$/;\nconst COMPONENT_ROLES = new Set(['layout', 'ui', 'sections', 'features', 'page-families']);\nconst TEST_DIRECTORIES = new Set(['config', 'data', 'lib', 'components', 'e2e', 'support']);\nconst RETIRED_ROOT_DIRECTORIES = ['app', 'components', 'data', 'lib', 'config', 'content', 'hooks', 'context', 'utils', 'src/components/templates'];\nconst DEV_TOOLING = ['eslint', 'vitest', '@playwright/test', 'knip'];\nconst NEXT_SPECIAL_FILE = /^(?:page|layout|template|loading|error|global-error|not-found|global-not-found|forbidden|unauthorized|default|route|opengraph-image|twitter-image|icon|apple-icon|sitemap|robots|manifest)\\.(?:ts|tsx|js|jsx|mdx)$/;\nconst CODE_OR_STYLE = /\\.(?:[cm]?[jt]sx?|mdx|css)$/;\nconst PASCAL_COMPONENT = /^[A-Z][A-Za-z0-9]*\\.tsx$/;\nconst CAMEL_MODULE = /^[a-z][A-Za-z0-9]*(?:\\.d)?\\.ts$/;\nconst SEMVER = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/;\n\n/** The Vercel function region of every Brandlab site (3.2.1): Sydney. */\nexport const BRANDLAB_FUNCTION_REGION = 'syd1';\n/**\n * The Vercel ignored build step of every Brandlab site (3.3.3). Exit 0 skips a deployment, anything else builds it:\n * a production deployment is skipped only when git shows every change since the last successful production\n * deployment is in .github/, docs/ or a root Markdown file. Previews, a redeploy of the same commit, a missing or\n * unknown previous commit and any git error all build. brandlab-migrate S10 writes the same command.\n */\nexport const BRANDLAB_VERCEL_IGNORE_COMMAND =\n `[ \"$VERCEL_ENV\" = production ] && [ \"$VERCEL_GIT_PREVIOUS_SHA\" != \"$VERCEL_GIT_COMMIT_SHA\" ] && git diff --quiet \"$VERCEL_GIT_PREVIOUS_SHA\" HEAD -- . ':!.github' ':!docs' ':(exclude,glob)*.md' && exit 0 || exit 1`;\n/** The contact route's delivery options (labels, email style, attachment policy): server-only (3.2.1). */\nconst CONTACT_RUNTIME = 'src/config/contactRuntime.ts';\n/** The business facts' evidence (defineBrandlabBusiness): server-only (3.2.1). */\nconst BUSINESS_EVIDENCE = 'src/data/businessEvidence.ts';\nconst BUSINESS_VALUES = 'src/data/business.ts';\nconst SITE_IDENTITY = 'src/config/site.ts';\nconst BUSINESS_FACT_CALLS = /\\b(?:defineBrandlabBusiness|verifiedFact|unknownFact|notApplicableFact)\\s*\\(/;\nconst GEOGRAPHY_ENTRY = '@brandlab-digital/site-core/geography';\n/**\n * Package entries a browser bundle cannot resolve from 3.3.3 (their exports map `browser` to null): the geography\n * registries and website-location policies, which the location estate reads, and the server halves of contact and reviews\n * (3.5.0 adds the Business Profile reviews feed client).\n */\nconst SERVER_PACKAGE_ENTRIES: ReadonlyMap<string, string> = new Map([\n [GEOGRAPHY_ENTRY, 'The Brandlab geography registry and website-location policy (server data, about 190 KB)'],\n ['@brandlab-digital/site-next/contact/server', 'The contact route runtime'],\n ['@brandlab-digital/site-next/google-reviews/server', 'The Google reviews route runtime'],\n ['@brandlab-digital/site-next/google-business-reviews/server', 'The Business Profile reviews feed client (it reads the feed token)'],\n]);\n\n/** Opt-in structural check. Static success must never masquerade as whole-project acceptance. */\nexport function checkEngineeringStructure(root: string): EngineeringCheck {\n directoryListings.clear();\n const findings: EngineeringFinding[] = [];\n const add = (path: string, rule: string, message: string, extra: { severity?: EngineeringFindingSeverity; line?: number } = {}) =>\n findings.push({ path, rule, message, severity: extra.severity ?? 'blocker', ...(extra.line ? { line: extra.line } : {}) });\n let pkg: PackageManifest = {};\n try { pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')); }\n catch { add('package.json', 'package-readable', 'A readable package.json is required.'); }\n const config = existsSync(join(root, 'brandlab.config.ts')) ? readFileSync(join(root, 'brandlab.config.ts'), 'utf8') : null;\n const capabilities = describeCapabilities(root, config);\n\n const source = collectBrandlabSource(root);\n\n inspectCommands(pkg, add);\n inspectDependencies(pkg, add);\n inspectLayout(root, capabilities, add);\n inspectSourceModules(root, source, add);\n inspectServerBoundaries(root, capabilities, source, add);\n inspectTests(root, capabilities, add);\n inspectToolPresets(root, add);\n inspectDelivery(root, add);\n\n return { status: findings.some(finding => finding.severity === 'blocker') ? 'blocked' : 'pass', findings,\n coverage: 'Static layout, naming, command, dependency-pin, tool-preset, CI, deployment and documentation structure only. This is not engineering-standard completion.',\n outstandingEvidence: ['Usage and deletion review including assets, configuration and dynamic references', 'Business data and component/style ownership review', 'Clean install, fast checks and production build', 'Full discovered technical URL estate', 'All distinct page families and important browser journeys', 'Exact-source protected Preview', 'Reporting/Ads provider cutover and authorised production verification'] };\n}\n\ntype Add = (path: string, rule: string, message: string, extra?: { severity?: EngineeringFindingSeverity; line?: number }) => void;\n\n// --- commands (section 6) ----------------------------------------------------\n\nfunction inspectCommands(pkg: PackageManifest, add: Add) {\n const scripts = pkg.scripts ?? {};\n for (const command of ['dev', 'start', ...ENGINEERING_FAST_COMMANDS, 'verify', 'build', 'test:e2e']) {\n if (!scripts[command]?.trim()) add('package.json', 'command-contract', `Missing ${command} command.`);\n }\n for (const [name, expected] of Object.entries(BRANDLAB_EXPECTED_SCRIPTS)) {\n const actual = scripts[name]?.trim();\n if (actual && actual.replace(/\\s+/g, ' ') !== expected) {\n add('package.json', 'script-contract', `${name} must be exactly \"${expected}\" (found \"${actual}\").`);\n }\n }\n const verify = scripts.verify?.trim();\n if (verify) {\n const unrecognised = splitCommandChain(verify).filter(segment => scriptReferences(segment, scripts) === null);\n if (unrecognised.length > 0) {\n add('package.json', 'verification-command-form',\n `verify may only chain package scripts (npm run <script>, npm test, run-s, run-p); \"${unrecognised.join('\", \"')}\" is not recognised. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n }\n const reachable = new Set<string>();\n const visit = (name: string) => {\n if (reachable.has(name)) return;\n reachable.add(name);\n for (const segment of splitCommandChain(scripts[name] ?? '')) {\n for (const reference of scriptReferences(segment, scripts) ?? []) visit(reference);\n }\n };\n visit('verify');\n for (const command of ENGINEERING_FAST_COMMANDS) {\n if (!reachable.has(command)) add('package.json', 'verification-wiring', `verify must execute ${command}. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n if (reachable.has('build')) add('package.json', 'single-build', 'Keep the production build separate from fast verify; run it once for the final candidate.');\n}\n\n/** Split a shell command on its chaining operators. */\nexport function splitCommandChain(command: string): string[] {\n return command.split(/&&|\\|\\||[;|&]/).map(segment => segment.trim()).filter(Boolean);\n}\n\n/**\n * The package scripts one command segment runs, or null when the segment is\n * not a recognised script invocation (npm run, npm test, run-s, run-p, npm-run-all).\n */\nexport function scriptReferences(segment: string, scripts: Readonly<Record<string, string>>): string[] | null {\n const words = segment.split(/\\s+/).filter(Boolean);\n while (words[0] && /^[A-Z_][A-Z0-9_]*=/.test(words[0])) words.shift();\n const [tool, ...rest] = words;\n if (tool === 'npm') {\n const [subcommand, ...args] = rest;\n if (subcommand === 'test' || subcommand === 't') return ['test'];\n if (subcommand === 'start' || subcommand === 'stop' || subcommand === 'restart') return [subcommand];\n if (subcommand === 'run' || subcommand === 'run-script') {\n const name = args.find(arg => !arg.startsWith('-'));\n return name ? [name] : null;\n }\n return null;\n }\n if (tool === 'run-s' || tool === 'run-p' || tool === 'npm-run-all') {\n const patterns: string[] = [];\n for (const word of rest) {\n if (word === '--') break;\n if (!word.startsWith('-')) patterns.push(word.replace(/^['\"]|['\"]$/g, ''));\n }\n if (patterns.length === 0) return null;\n // npm-run-all globs: `*` stays within one `:` segment; a whole `**` segment spans several.\n return patterns.flatMap(pattern => pattern.includes('*') || pattern.includes('?') || pattern.includes('[')\n ? Object.keys(scripts).filter(name => globMatch(pattern, name, { separator: ':', globstar: true }))\n : [pattern]);\n }\n return null;\n}\n\n// --- dependencies (section 1) ------------------------------------------------\n\nfunction inspectDependencies(pkg: PackageManifest, add: Add) {\n if (pkg.type !== 'module') add('package.json', 'module-type', 'Declare \"type\": \"module\".');\n const dependencies = { ...pkg.dependencies, ...pkg.devDependencies };\n for (const tool of DEV_TOOLING) {\n const spec = pkg.devDependencies?.[tool];\n if (!spec || !SEMVER.test(spec)) add('package.json', 'dev-tooling', `Pin ${tool} exactly as a development dependency.`);\n }\n // Packed preflight binds the four Brandlab packages to local file: archives; the evaluator verifies those.\n const ranges = Object.entries(dependencies)\n .filter(([name, spec]) => !SEMVER.test(spec) && !(name.startsWith('@brandlab-digital/') && spec.startsWith('file:')))\n .map(([name, spec]) => `${name}@${spec}`);\n if (ranges.length > 0) add('package.json', 'exact-pins', `Pin every dependency to the exact locked version: ${ranges.sort().join(', ')}.`);\n const next = dependencies.next;\n for (const companion of ['eslint-config-next', '@next/mdx']) {\n const spec = dependencies[companion];\n if (spec && spec !== next) add('package.json', 'framework-companion-pin', `${companion} must equal the next version (${next ?? 'missing'}); found ${spec}.`);\n }\n if (!dependencies['eslint-config-next']) add('package.json', 'framework-companion-pin', 'Declare eslint-config-next at the exact next version for brandlab.configs.next.');\n if (pkg.dependencies?.sharp || pkg.devDependencies?.sharp) add('package.json', 'sharp-override-only', 'Remove the direct sharp dependency; the release-owned overrides.sharp pin is the only declaration.');\n}\n\n// --- layout and naming (section 2) --------------------------------------------\n\nfunction inspectLayout(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n for (const path of ['src/app', 'src/config', 'src/data', 'src/lib', 'src/components', 'tests']) {\n if (!isDirectory(join(root, path))) add(path, 'source-organisation', `Place the corresponding implementation under ${path}.`);\n }\n for (const path of RETIRED_ROOT_DIRECTORIES) {\n if (existsSync(join(root, path))) add(path, 'retired-source-layout', 'Migrate consumers to the current src responsibilities and remove the superseded directory.');\n }\n const required = [\n 'src/config/site.ts', 'src/config/analytics.ts', 'src/data/business.ts', 'src/data/routes.ts', 'src/data/redirects.ts',\n 'src/lib/seo/metadata.ts', 'src/instrumentation-client.ts', 'src/app/layout.tsx', 'src/app/robots.ts', 'src/app/sitemap.xml/route.ts',\n 'src/data/businessEvidence.ts',\n ...(capabilities.contactEnabled ? ['src/config/contact.ts', CONTACT_RUNTIME, 'src/app/api/contact/route.ts'] : []),\n ...(capabilities.reviewsEnabled ? ['src/config/reviews.ts'] : []),\n ...(capabilities.locationsDeclared ? ['src/data/locations/estate.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'owner-file', `The 3.0 layout places this owner at ${path}.`);\n }\n for (const [path, message] of [\n ['src/config/env.ts', 'Remove the local environment parser; site configuration is a source constant.'],\n ['src/lib/analytics', 'Remove the local analytics layer; installBrandlabInstrumentation owns it.'],\n ['src/lib/contact/definition.ts', 'Remove the local contact definition; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/constants.ts', 'Remove the local contact constants; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/runtime.ts', 'Remove the local contact runtime; POST uses createBrandlabContactRouteHandler.'],\n ['src/components/analytics/GoogleTag.tsx', 'Render BrandlabGoogleTag directly in src/app/layout.tsx.'],\n ['src/components/analytics/CoreWebVitalsReporter.tsx', 'Remove the web-vitals reporter.'],\n ['src/lib/seo/sitemaps', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/sitemaps.ts', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/schema/sanitize.ts', 'Remove the local schema sanitiser; the packages own sanitising.'],\n ['src/lib/seo/schema/SchemaScript.tsx', 'Import SchemaScript from @brandlab-digital/site-next/schema.'],\n ['src/lib/seo/index.ts', 'Remove the SEO barrel and import each module directly.'],\n ] as const) {\n if (existsSync(join(root, path))) add(path, 'retired-file', message);\n }\n\n if (isDirectory(join(root, 'src'))) {\n for (const entry of readdirSync(join(root, 'src'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n const path = `src/${entry.name}`;\n if (entry.isDirectory() && SRC_DIRECTORIES.has(entry.name)) {\n if (entry.name === 'types' && walkProjectFiles(root, path).some(file => !file.endsWith('.d.ts'))) {\n add(path, 'standard-layout', 'src/types may hold only ambient .d.ts declarations.');\n }\n continue;\n }\n if (entry.isFile() && SRC_ROOT_FILES.test(entry.name)) continue;\n add(path, 'standard-layout', `${path} is outside the standard layout (src/{app,config,data,content,lib,components}).`);\n }\n }\n if (isDirectory(join(root, 'src/components'))) {\n for (const entry of readdirSync(join(root, 'src/components'), { withFileTypes: true })) {\n if (entry.name.startsWith('.') || entry.name === 'templates') continue;\n if (!entry.isDirectory() || !COMPONENT_ROLES.has(entry.name)) {\n add(`src/components/${entry.name}`, 'component-role', 'Components belong to one role: layout, ui, sections, features or page-families.');\n }\n }\n }\n for (const path of walkProjectFiles(root, 'src')) inspectFileName(root, path, add);\n}\n\nfunction inspectFileName(root: string, path: string, add: Add) {\n const name = posix.basename(path);\n const directory = posix.dirname(path);\n if (directory === 'src' && SRC_ROOT_FILES.test(name)) return;\n if (name.endsWith('.module.css')) {\n const component = name.replace(/\\.module\\.css$/, '');\n // Exact names from the directory listing: existsSync is case-insensitive on macOS but not on the Linux CI\n // (a button.module.css beside Button.tsx passed locally and failed in CI).\n const siblings = directoryEntries(join(root, directory));\n if (!['tsx', 'ts', 'jsx'].some(extension => siblings.has(`${component}.${extension}`))) {\n add(path, 'file-naming', `Keep ${name} beside the ${component} component it styles (the file names must match exactly, including case).`);\n }\n return;\n }\n if (path.startsWith('src/app/')) {\n // Images, fonts and metadata assets are framework-consumed; only code and styles are placed.\n if (!CODE_OR_STYLE.test(name)) return;\n const segments = path.split('/');\n const privateFolder = segments.slice(2, -1).find(segment => segment.startsWith('_') && segment !== '_components');\n if (privateFolder) {\n add(path, 'route-local-code', `Route-local code belongs in src/app/<route>/_components/, not ${privateFolder}/.`);\n return;\n }\n if (!segments.includes('_components')) {\n if (NEXT_SPECIAL_FILE.test(name) || path === 'src/app/globals.css') return;\n add(path, 'route-local-code', 'Route-local code belongs in src/app/<route>/_components/; framework files keep their reserved names.');\n return;\n }\n }\n if (!/\\.(?:ts|tsx)$/.test(name) || path.startsWith('src/content/')) return;\n if (name.endsWith('.tsx') && !PASCAL_COMPONENT.test(name)) {\n add(path, 'file-naming', 'Components use PascalCase .tsx file names.');\n } else if (name.endsWith('.ts') && !CAMEL_MODULE.test(name)) {\n add(path, 'file-naming', 'Data and helper modules use camelCase .ts file names.');\n }\n if (path.startsWith('src/components/page-families/') && name.endsWith('.tsx') && !/^[A-Z][A-Za-z0-9]*Page\\.tsx$/.test(name)) {\n add(path, 'file-naming', 'Page families are named <RouteKind>Page.tsx.');\n }\n}\n\n// --- module structure: barrels, ui data imports, estate ----------------------\n\nfunction inspectSourceModules(root: string, source: BrandlabSourceIndex, add: Add) {\n const resolver = createBrandlabModuleResolver(root, new Set(source.byPath.keys()));\n for (const file of source.files.filter(candidate => candidate.path.startsWith('src/'))) {\n const references = listModuleReferences(file);\n const forwarding = forwardingExports(file);\n if (isBarrel(file)) {\n add(file.path, 'no-barrels', 'This module only re-exports other modules; import each owner directly.');\n } else {\n for (const line of forwarding) {\n add(file.path, 'no-forwarding-exports', 'This export forwards another module; import the owner directly.', { line });\n }\n }\n if (file.path.startsWith('src/components/ui/')) {\n for (const reference of references.filter(candidate => candidate.kind !== 'export')) {\n const resolved = resolver(file.path, reference.specifier);\n if (resolved?.startsWith('src/data/') || /^@\\/data(?:\\/|$)/.test(reference.specifier)) {\n add(file.path, 'ui-imports-data', 'UI primitives never import data modules; pass prepared props from a section or route.', { line: reference.line });\n }\n }\n }\n inspectRegistryDerivedEstate(file, add);\n }\n const estate = source.byPath.get('src/data/locations/estate.ts');\n if (estate) {\n inspectRetainedExclusions(estate, add);\n inspectSiteOwnedLocations(estate, add);\n }\n}\n\n// --- server-only boundaries (3.2.1) ------------------------------------------\n\n/**\n * What a browser bundle must never carry. The contact route's delivery options and\n * the business evidence live in server-only modules, alias hosts in next.config, and\n * no module a client component reaches imports a server-only module or holds an\n * evidence record. (Next's build also refuses a client import of `server-only`; this\n * names the chain before a build is needed.) From 3.3.3 no module a client component\n * reaches imports the geography registry (site-core/geography, which the location\n * estate reads) or a package server entry: a browser bundle cannot resolve them.\n */\nfunction inspectServerBoundaries(\n root: string,\n capabilities: ReturnType<typeof describeCapabilities>,\n source: BrandlabSourceIndex,\n add: Add,\n) {\n const contact = source.byPath.get('src/config/contact.ts');\n const runtime = source.byPath.get(CONTACT_RUNTIME);\n if (capabilities.contactEnabled && runtime) {\n if (!importsServerOnly(runtime)) {\n add(CONTACT_RUNTIME, 'server-only-module', `${CONTACT_RUNTIME} imports 'server-only', so no client component can bundle the delivery options.`);\n }\n if (!declaresName(runtime, 'contactRuntime')) {\n add(CONTACT_RUNTIME, 'contact-runtime', `${CONTACT_RUNTIME} exports contactRuntime (the labels, email style and attachment policy createBrandlabContactRouteHandler takes).`);\n }\n }\n const moved = contact ? declaresName(contact, 'contactRuntime') : undefined;\n if (contact && moved) {\n add('src/config/contact.ts', 'contact-runtime', `contactRuntime belongs in ${CONTACT_RUNTIME}: the contact form imports src/config/contact.ts, so everything contactRuntime reads (the site identity, business data) reaches the browser.`, { line: moved });\n }\n\n const evidence = source.byPath.get(BUSINESS_EVIDENCE);\n if (evidence) {\n if (!importsServerOnly(evidence)) {\n add(BUSINESS_EVIDENCE, 'server-only-module', `${BUSINESS_EVIDENCE} imports 'server-only', so no client component can bundle the evidence records.`);\n }\n if (findImportedCalls(evidence, /^@brandlab-digital\\/site-core\\/business$/, 'defineBrandlabBusiness').length === 0) {\n add(BUSINESS_EVIDENCE, 'business-evidence', `${BUSINESS_EVIDENCE} declares the business facts with defineBrandlabBusiness, each with its evidence.`);\n }\n }\n const values = source.byPath.get(BUSINESS_VALUES);\n if (values) {\n const call = BUSINESS_FACT_CALLS.exec(values.executable);\n const record = evidenceRecordLines(values)[0];\n if (call || record) {\n add(BUSINESS_VALUES, 'business-evidence', `${BUSINESS_VALUES} holds the display values only (businessFacts); defineBrandlabBusiness and the evidence belong in ${BUSINESS_EVIDENCE}, which stays on the server.`,\n { line: record ?? lineAtIndex(values.text, call!.index) });\n }\n }\n\n const site = source.byPath.get(SITE_IDENTITY);\n const aliasHosts = site ? declaredAliasHosts(site) : undefined;\n if (aliasHosts) {\n add(SITE_IDENTITY, 'alias-hosts', 'Declare the alias hosts in next.config.ts with defineBrandlabNextConfig({ aliasHosts }): client components import the site identity, so its alias hosts reach the browser.', { line: aliasHosts });\n }\n\n const resolver = createBrandlabModuleResolver(root, new Set(source.byPath.keys()));\n const reached = new Map<string, string | null>();\n const queue = source.files.filter(file => file.path.startsWith('src/') && (isClientModule(file) || /^src\\/instrumentation-client\\.[cm]?[jt]sx?$/.test(file.path)));\n for (const file of queue) reached.set(file.path, null);\n while (queue.length > 0) {\n const file = queue.shift()!;\n for (const reference of listModuleReferences(file)) {\n if (reference.typeOnly) continue;\n const target = resolver(file.path, reference.specifier);\n if (!target || reached.has(target)) continue;\n reached.set(target, file.path);\n const next = source.byPath.get(target);\n if (next) queue.push(next);\n }\n }\n const chain = (path: string) => {\n const steps: string[] = [];\n for (let at: string | null | undefined = path; at; at = reached.get(at)) steps.unshift(at);\n return steps.join(' → ');\n };\n for (const path of [...reached.keys()].sort()) {\n const file = source.byPath.get(path);\n if (!file) continue;\n if (importsServerOnly(file)) {\n add(path, 'client-bundle-boundary', `A client component imports this server-only module (${chain(path)}); pass what it needs as props from a server component.`);\n continue;\n }\n const serverEntry = listModuleReferences(file).find(reference => !reference.typeOnly && SERVER_PACKAGE_ENTRIES.has(reference.specifier));\n if (serverEntry) {\n add(path, 'client-bundle-boundary', `${SERVER_PACKAGE_ENTRIES.get(serverEntry.specifier)} reaches the browser (${chain(path)} → ${serverEntry.specifier}), and from 3.3.3 a browser bundle cannot resolve it, so the build fails. ${serverEntry.specifier === GEOGRAPHY_ENTRY ? 'Build the location lists a client component shows (navigation, service areas) in a server component and pass them as plain props; keep error pages and the analytics binding free of location data.' : 'Keep it in server components and route handlers.'}`, { line: serverEntry.line });\n continue;\n }\n const record = evidenceRecordLines(file)[0];\n if (record) {\n add(path, 'client-bundle-boundary', `An evidence record (sourceKind, verifiedAt) reaches the browser (${chain(path)}); keep evidence in ${BUSINESS_EVIDENCE}.`, { line: record });\n }\n }\n}\n\n/** A module whose directive prologue says 'use client'. */\nfunction isClientModule(file: BrandlabSourceFile): boolean {\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (!ts.isExpressionStatement(statement) || !ts.isStringLiteral(statement.expression)) return false;\n if (statement.expression.text === 'use client') return true;\n }\n return false;\n}\n\n/** `import 'server-only'` at the top level. */\nfunction importsServerOnly(file: BrandlabSourceFile): boolean {\n return parseBrandlabSourceFile(file).statements.some(statement =>\n ts.isImportDeclaration(statement) && !statement.importClause &&\n ts.isStringLiteral(statement.moduleSpecifier) && statement.moduleSpecifier.text === 'server-only');\n}\n\n/** The line of a top-level declaration of `name`, if the module declares it. */\nfunction declaresName(file: BrandlabSourceFile, name: string): number | undefined {\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.name.text === name) return lineOfNode(file, statement);\n }\n } else if ((ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) && statement.name?.text === name) {\n return lineOfNode(file, statement);\n }\n }\n return undefined;\n}\n\n/** Lines of object literals that are evidence records: they name both sourceKind and verifiedAt. */\nfunction evidenceRecordLines(file: BrandlabSourceFile): number[] {\n const lines: number[] = [];\n const visit = (node: ts.Node) => {\n if (ts.isObjectLiteralExpression(node)) {\n const names = new Set(node.properties.map(property => property.name && (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) ? property.name.text : ''));\n if (names.has('sourceKind') && names.has('verifiedAt')) lines.push(lineOfNode(file, node));\n }\n ts.forEachChild(node, visit);\n };\n visit(parseBrandlabSourceFile(file));\n return lines;\n}\n\n/** The line of a non-empty `aliasHosts` in the defineBrandlabSite call. */\nfunction declaredAliasHosts(file: BrandlabSourceFile): number | undefined {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/site$/, 'defineBrandlabSite')) {\n let definition: ts.Expression | undefined = call.arguments[0];\n while (definition && (ts.isAsExpression(definition) || ts.isSatisfiesExpression(definition) || ts.isParenthesizedExpression(definition))) {\n definition = definition.expression;\n }\n if (!definition || !ts.isObjectLiteralExpression(definition)) continue;\n const property = definition.properties.find(candidate =>\n (ts.isPropertyAssignment(candidate) || ts.isShorthandPropertyAssignment(candidate)) &&\n (ts.isIdentifier(candidate.name) || ts.isStringLiteral(candidate.name)) && candidate.name.text === 'aliasHosts');\n if (!property) continue;\n const array = ts.isPropertyAssignment(property)\n ? arrayLiteral(file, property.initializer)\n : ts.isShorthandPropertyAssignment(property) ? arrayLiteral(file, property.name) : undefined;\n if (array && array.elements.length === 0) continue;\n return lineOfNode(file, property);\n }\n return undefined;\n}\n\n/** Lines of `export ... from` statements and exports of names this module only imported. */\nfunction forwardingExports(file: BrandlabSourceFile): number[] {\n const source = parseBrandlabSourceFile(file);\n const imported = new Set(listModuleReferences(file).filter(reference => reference.kind === 'import').flatMap(reference => reference.bindings.map(binding => binding.local)));\n const lines: number[] = [];\n for (const statement of source.statements) {\n const forwards =\n (ts.isExportDeclaration(statement) && (statement.moduleSpecifier !== undefined ||\n (statement.exportClause !== undefined && ts.isNamedExports(statement.exportClause) &&\n statement.exportClause.elements.some(element => imported.has((element.propertyName ?? element.name).text))))) ||\n (ts.isExportAssignment(statement) && ts.isIdentifier(statement.expression) && imported.has(statement.expression.text));\n if (forwards) lines.push(lineOfNode(file, statement));\n }\n return lines;\n}\n\n/** A module with no declarations or statements of its own besides imports and exports. */\nfunction isBarrel(file: BrandlabSourceFile): boolean {\n const statements = parseBrandlabSourceFile(file).statements;\n return statements.length > 0 && forwardingExports(file).length > 0 &&\n statements.every(statement => ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement) || ts.isExportAssignment(statement));\n}\n\nfunction inspectRegistryDerivedEstate(file: BrandlabSourceFile, add: Add) {\n const derived = listModuleReferences(file)\n .filter(reference => reference.kind === 'import' && /^@brandlab-digital\\/site-core\\//.test(reference.specifier))\n .flatMap(reference => reference.bindings.filter(binding => /WebsiteSuburbs$/.test(binding.imported)).map(binding => ({ ...binding, line: reference.line })));\n const namespaceUse = file.executable.match(/\\.\\s*([a-z][A-Za-z]*WebsiteSuburbs)\\b/);\n const first = derived[0] ?? (namespaceUse ? { imported: namespaceUse[1]!, line: lineAtIndex(file.text, namespaceUse.index ?? 0) } : null);\n if (!first) return;\n add(file.path, 'estate-registry-derived',\n `${first.imported} is a registry candidate list; the published estate in src/data/locations/estate.ts must be literal data, never derived from it.`, { line: first.line });\n}\n\nfunction inspectRetainedExclusions(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const retained = objectPropertyValue(call.arguments[0], 'retainedExclusions');\n if (!retained || !ts.isArrayLiteralExpression(retained) || retained.elements.length === 0) continue;\n const slugs = retained.elements.map(element => {\n if (ts.isStringLiteralLike(element)) return element.text;\n const slug = objectPropertyValue(element, 'slug');\n return slug && ts.isStringLiteralLike(slug) ? slug.text : null;\n }).filter((slug): slug is string => Boolean(slug));\n add(file.path, 'estate-retained-exclusions',\n `${retained.elements.length} policy-excluded location(s) stay published for a later SEO decision${slugs.length ? `: ${slugs.join(', ')}` : ''}.`,\n { severity: 'info', line: lineOfNode(file, retained) });\n }\n}\n\n/** An array literal, directly or through a top-level `const name = [...]` (optionally `as const`) in the same file. */\nfunction arrayLiteral(file: BrandlabSourceFile, node: ts.Expression | undefined): ts.ArrayLiteralExpression | undefined {\n const unwrap = (expression: ts.Expression | undefined): ts.Expression | undefined => {\n let current = expression;\n while (current && (ts.isAsExpression(current) || ts.isSatisfiesExpression(current) || ts.isParenthesizedExpression(current))) {\n current = current.expression;\n }\n return current;\n };\n const value = unwrap(node);\n if (value && ts.isArrayLiteralExpression(value)) return value;\n if (!value || !ts.isIdentifier(value)) return undefined;\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (!ts.isVariableStatement(statement)) continue;\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.name.text === value.text) {\n const initializer = unwrap(declaration.initializer);\n return initializer && ts.isArrayLiteralExpression(initializer) ? initializer : undefined;\n }\n }\n }\n return undefined;\n}\n\n/** Report the locations the site publishes outside the shared registry, with each group's reason. */\nfunction inspectSiteOwnedLocations(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const declared = objectPropertyValue(call.arguments[0], 'siteOwned');\n if (!declared) continue;\n const groups = arrayLiteral(file, declared);\n if (!groups) {\n add(file.path, 'estate-site-owned',\n 'siteOwned must be literal data in src/data/locations/estate.ts: [{ reason, slugs }], never derived.', { line: lineOfNode(file, declared) });\n continue;\n }\n if (groups.elements.length === 0) continue;\n let total = 0;\n const summaries = groups.elements.map(element => {\n const reason = objectPropertyValue(element, 'reason');\n const slugs = arrayLiteral(file, objectPropertyValue(element, 'slugs'));\n const count = slugs?.elements.length;\n total += count ?? 0;\n const label = reason && ts.isStringLiteralLike(reason) ? reason.text : 'a reason that is not a string literal';\n return `${count ?? 'an unknown number of'} for \"${label}\"`;\n });\n add(file.path, 'estate-site-owned',\n `${total} location(s) are published outside the shared geography registry, declared site-owned: ${summaries.join('; ')}.`,\n { severity: 'info', line: lineOfNode(file, groups) });\n }\n}\n\nfunction lineAtIndex(text: string, index: number): number {\n return text.slice(0, index).split('\\n').length;\n}\n\n// --- tests (sections 2 and 6) -------------------------------------------------\n\nfunction inspectTests(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n if (!isDirectory(join(root, 'tests'))) return;\n for (const entry of readdirSync(join(root, 'tests'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n if (!entry.isDirectory() || !TEST_DIRECTORIES.has(entry.name)) {\n add(`tests/${entry.name}`, 'test-layout', 'Tests live in tests/{config,data,lib,components,e2e,support}.');\n }\n }\n const required = [\n 'tests/data/routes.test.ts', 'tests/config/analytics.test.ts',\n 'tests/e2e/estate.spec.ts', 'tests/e2e/analytics.spec.ts', 'tests/e2e/families.spec.ts',\n ...(capabilities.contactEnabled ? ['tests/config/contact.test.ts', 'tests/e2e/contact.spec.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'shared-tests', `The shared 3.0 test set includes ${path}.`);\n }\n for (const path of walkProjectFiles(root, 'tests')) {\n if (/-darwin\\.png$/.test(path)) add(path, 'committed-snapshots', 'Delete committed darwin snapshots; rendered checks run against the CI build.');\n }\n}\n\n// --- dev presets (section 4) -------------------------------------------------\n\nfunction inspectToolPresets(root: string, add: Add) {\n const eslint = readOptional(join(root, 'eslint.config.mjs'));\n if (eslint === null) add('eslint.config.mjs', 'tool-preset', 'Add eslint.config.mjs: export default brandlab.configs.next.');\n else if (!/@brandlab-digital\\/eslint-plugin/.test(eslint) || !/export\\s+default\\s+[A-Za-z_$][\\w$]*\\.configs\\.next\\s*;?\\s*$/.test(eslint.trim())) {\n add('eslint.config.mjs', 'tool-preset', 'eslint.config.mjs is exactly `export default brandlab.configs.next` (imported from @brandlab-digital/eslint-plugin).');\n }\n const knip = readOptional(join(root, 'knip.ts'));\n if (knip === null) add('knip.ts', 'tool-preset', 'Add knip.ts: export default brandlabKnip({ mdx?, entry? }).');\n else if (!/@brandlab-digital\\/conformance\\/knip/.test(knip) || !/export\\s+default\\s+brandlabKnip\\s*\\(/.test(knip)) {\n add('knip.ts', 'tool-preset', 'knip.ts exports brandlabKnip({ mdx?, entry? }) from @brandlab-digital/conformance/knip.');\n }\n if (!['playwright.config.ts', 'playwright.config.mts'].some(name => existsSync(join(root, name)))) {\n add('playwright.config.ts', 'tool-preset', 'Add the Playwright configuration for the shared e2e specs.');\n }\n if (!['vitest.config.ts', 'vitest.config.mts'].some(name => existsSync(join(root, name)))) {\n add('vitest.config.ts', 'tool-preset', 'Add the Vitest configuration for the binding tests.');\n }\n}\n\n// --- CI, dependencies, Vercel and docs (section 6) ---------------------------\n\nfunction inspectDelivery(root: string, add: Add) {\n const workflowDirectory = join(root, '.github/workflows');\n const workflows = isDirectory(workflowDirectory) ? readdirSync(workflowDirectory).filter(name => /\\.ya?ml$/.test(name)).sort() : [];\n const callers = workflows.filter(name => /uses\\s*:\\s*['\"]?RomieDandan\\/brandlab\\/\\.github\\/workflows\\/verify-next\\.yml@/.test(readFileSync(join(workflowDirectory, name), 'utf8')));\n if (callers.length !== 1 || callers[0] !== 'verify.yml') {\n add('.github/workflows/verify.yml', 'ci-workflow', `Exactly one .github/workflows/verify.yml calls RomieDandan/brandlab/.github/workflows/verify-next.yml at the fleet SHA (found ${callers.length ? callers.join(', ') : 'none'}).`);\n }\n for (const path of ['.github/dependabot.yml', '.github/dependabot.yaml', 'renovate.json', 'renovate.json5', '.github/renovate.json', '.renovaterc', '.renovaterc.json']) {\n if (existsSync(join(root, path))) add(path, 'dependency-bots', 'Exact pins move with Brandlab releases; remove Dependabot/Renovate version updates.');\n }\n const vercel = readOptional(join(root, 'vercel.json'));\n let installCommand: unknown;\n try { installCommand = vercel === null ? undefined : JSON.parse(vercel).installCommand; } catch { installCommand = undefined; }\n if (installCommand !== 'npm ci') add('vercel.json', 'vercel-install', 'vercel.json sets installCommand to \"npm ci\".');\n let regions: unknown;\n try { regions = vercel === null ? undefined : JSON.parse(vercel).regions; } catch { regions = undefined; }\n if (!Array.isArray(regions) || regions.length !== 1 || regions[0] !== BRANDLAB_FUNCTION_REGION) {\n add('vercel.json', 'vercel-region', `vercel.json runs the server functions in Sydney: \"regions\": [\"${BRANDLAB_FUNCTION_REGION}\"] (found ${regions === undefined ? 'no regions' : JSON.stringify(regions)}). The visitors are in Australia; a Washington (iad1) function adds a Pacific round trip to every request it serves.`);\n }\n let ignoreCommand: unknown;\n try { ignoreCommand = vercel === null ? undefined : JSON.parse(vercel).ignoreCommand; } catch { ignoreCommand = undefined; }\n if (ignoreCommand !== BRANDLAB_VERCEL_IGNORE_COMMAND) {\n add('vercel.json', 'vercel-ignore-build', `vercel.json skips a production build only when a push changes nothing but .github/, docs/ or root Markdown files: \"ignoreCommand\": ${JSON.stringify(BRANDLAB_VERCEL_IGNORE_COMMAND)} (found ${ignoreCommand === undefined ? 'none' : JSON.stringify(ignoreCommand)}). A CI-only change otherwise rebuilds production and empties its CDN cache; previews and anything git cannot compare still build.`);\n }\n\n if (!existsSync(join(root, 'README.md'))) add('README.md', 'project-docs', 'Add the generated README.md (commands, architecture, environment names, deployment and rollback).');\n const agents = join(root, 'AGENTS.md');\n if (!existsSync(agents)) add('AGENTS.md', 'project-docs', 'Add AGENTS.md with the fixed sources of truth and guardrails.');\n else if (statSync(agents).size > 3_584) add('AGENTS.md', 'project-docs', `AGENTS.md is ${statSync(agents).size} bytes; keep it to about 3 KB and archive history to the control repo.`);\n const claude = readOptional(join(root, 'CLAUDE.md'));\n if (claude === null || claude.trim() !== '@AGENTS.md') add('CLAUDE.md', 'project-docs', 'CLAUDE.md is the single line @AGENTS.md.');\n}\n\nconst directoryListings = new Map<string, ReadonlySet<string>>();\n\n/** The exact file names in a directory (cached per check run). */\nfunction directoryEntries(path: string): ReadonlySet<string> {\n let entries = directoryListings.get(path);\n if (!entries) {\n try { entries = new Set(readdirSync(path)); } catch { entries = new Set(); }\n directoryListings.set(path, entries);\n }\n return entries;\n}\n\nfunction readOptional(path: string): string | null {\n return existsSync(path) ? readFileSync(path, 'utf8') : null;\n}\n"]}
1
+ {"version":3,"file":"engineering.js","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, posix } from 'node:path';\nimport ts from 'typescript';\nimport { globMatch } from './glob.js';\nimport { BRANDLAB_DEFAULT_ORIGIN_REGION, checkOriginRegion } from './hosting.js';\nimport {\n collectBrandlabSource,\n createBrandlabModuleResolver,\n findImportedCalls,\n isDirectory,\n lineOfNode,\n listModuleReferences,\n objectPropertyValue,\n parseBrandlabSourceFile,\n walkProjectFiles,\n type BrandlabSourceFile,\n type BrandlabSourceIndex,\n} from './source-files.js';\nimport { describeCapabilities } from './static-rules.js';\n\nexport const ENGINEERING_FAST_COMMANDS = ['typecheck', 'lint', 'test', 'check:unused', 'check:unused:production', 'check:standards'] as const;\n\n/** The exact fast verification command from the Brandlab 3.0 target (section 6). */\nexport const BRANDLAB_EXPECTED_VERIFY_SCRIPT =\n 'npm run check:standards && npm run typecheck && npm run lint && npm run test && npm run check:unused && npm run check:unused:production';\n\n/** Scripts whose exact values the 3.0 target fixes; dev and start must exist. */\nexport const BRANDLAB_EXPECTED_SCRIPTS: Readonly<Record<string, string>> = Object.freeze({\n build: 'next build',\n typecheck: 'next typegen && tsc --noEmit',\n lint: 'eslint .',\n test: 'vitest run',\n 'test:e2e': 'playwright test',\n 'check:unused': 'knip',\n 'check:unused:production': 'knip --production',\n 'check:standards': 'brandlab-verify --mode ci --engineering',\n});\n\nexport type EngineeringFindingSeverity = 'blocker' | 'info';\nexport interface EngineeringFinding { path: string; rule: string; message: string; severity: EngineeringFindingSeverity; line?: number }\nexport interface EngineeringCheck {\n status: 'pass' | 'blocked';\n findings: EngineeringFinding[];\n coverage: string;\n outstandingEvidence: readonly string[];\n}\n\ninterface PackageManifest {\n type?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nconst SRC_DIRECTORIES = new Set(['app', 'config', 'data', 'content', 'lib', 'components', 'types']);\nconst SRC_ROOT_FILES = /^(?:instrumentation(?:-client)?|proxy|mdx-components)\\.(?:ts|tsx)$/;\nconst COMPONENT_ROLES = new Set(['layout', 'ui', 'sections', 'features', 'page-families']);\nconst TEST_DIRECTORIES = new Set(['config', 'data', 'lib', 'components', 'e2e', 'support']);\nconst RETIRED_ROOT_DIRECTORIES = ['app', 'components', 'data', 'lib', 'config', 'content', 'hooks', 'context', 'utils', 'src/components/templates'];\nconst DEV_TOOLING = ['eslint', 'vitest', '@playwright/test', 'knip'];\nconst NEXT_SPECIAL_FILE = /^(?:page|layout|template|loading|error|global-error|not-found|global-not-found|forbidden|unauthorized|default|route|opengraph-image|twitter-image|icon|apple-icon|sitemap|robots|manifest)\\.(?:ts|tsx|js|jsx|mdx)$/;\nconst CODE_OR_STYLE = /\\.(?:[cm]?[jt]sx?|mdx|css)$/;\nconst PASCAL_COMPONENT = /^[A-Z][A-Za-z0-9]*\\.tsx$/;\nconst CAMEL_MODULE = /^[a-z][A-Za-z0-9]*(?:\\.d)?\\.ts$/;\nconst SEMVER = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/;\n\n/**\n * The Vercel function region of a Brandlab site without a hosting block (3.2.1): Sydney. From 3.4.1 brandlab.config\n * `hosting` may record another origin (W5, see hosting.ts).\n */\nexport const BRANDLAB_FUNCTION_REGION = BRANDLAB_DEFAULT_ORIGIN_REGION;\n/**\n * The Vercel ignored build step of every Brandlab site (3.3.3). Exit 0 skips a deployment, anything else builds it:\n * a production deployment is skipped only when git shows every change since the last successful production\n * deployment is in .github/, docs/ or a root Markdown file. Previews, a redeploy of the same commit, a missing or\n * unknown previous commit and any git error all build. brandlab-migrate S10 writes the same command.\n */\nexport const BRANDLAB_VERCEL_IGNORE_COMMAND =\n `[ \"$VERCEL_ENV\" = production ] && [ \"$VERCEL_GIT_PREVIOUS_SHA\" != \"$VERCEL_GIT_COMMIT_SHA\" ] && git diff --quiet \"$VERCEL_GIT_PREVIOUS_SHA\" HEAD -- . ':!.github' ':!docs' ':(exclude,glob)*.md' && exit 0 || exit 1`;\n/** The contact route's delivery options (labels, email style, attachment policy): server-only (3.2.1). */\nconst CONTACT_RUNTIME = 'src/config/contactRuntime.ts';\n/** The business facts' evidence (defineBrandlabBusiness): server-only (3.2.1). */\nconst BUSINESS_EVIDENCE = 'src/data/businessEvidence.ts';\nconst BUSINESS_VALUES = 'src/data/business.ts';\nconst SITE_IDENTITY = 'src/config/site.ts';\nconst BUSINESS_FACT_CALLS = /\\b(?:defineBrandlabBusiness|verifiedFact|unknownFact|notApplicableFact)\\s*\\(/;\nconst GEOGRAPHY_ENTRY = '@brandlab-digital/site-core/geography';\n/**\n * Package entries a browser bundle cannot resolve from 3.3.3 (their exports map `browser` to null): the geography\n * registries and website-location policies, which the location estate reads, and the server halves of contact and reviews\n * (3.5.0 adds the Business Profile reviews feed client).\n */\nconst SERVER_PACKAGE_ENTRIES: ReadonlyMap<string, string> = new Map([\n [GEOGRAPHY_ENTRY, 'The Brandlab geography registry and website-location policy (server data, about 190 KB)'],\n ['@brandlab-digital/site-next/contact/server', 'The contact route runtime'],\n ['@brandlab-digital/site-next/google-reviews/server', 'The Google reviews route runtime'],\n ['@brandlab-digital/site-next/google-business-reviews/server', 'The Business Profile reviews feed client (it reads the feed token)'],\n]);\n\n/** Opt-in structural check. Static success must never masquerade as whole-project acceptance. */\nexport function checkEngineeringStructure(root: string): EngineeringCheck {\n directoryListings.clear();\n const findings: EngineeringFinding[] = [];\n const add = (path: string, rule: string, message: string, extra: { severity?: EngineeringFindingSeverity; line?: number } = {}) =>\n findings.push({ path, rule, message, severity: extra.severity ?? 'blocker', ...(extra.line ? { line: extra.line } : {}) });\n let pkg: PackageManifest = {};\n try { pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')); }\n catch { add('package.json', 'package-readable', 'A readable package.json is required.'); }\n const config = existsSync(join(root, 'brandlab.config.ts')) ? readFileSync(join(root, 'brandlab.config.ts'), 'utf8') : null;\n const capabilities = describeCapabilities(root, config);\n\n const source = collectBrandlabSource(root);\n\n inspectCommands(pkg, add);\n inspectDependencies(pkg, add);\n inspectLayout(root, capabilities, add);\n inspectSourceModules(root, source, add);\n inspectServerBoundaries(root, capabilities, source, add);\n inspectTests(root, capabilities, add);\n inspectToolPresets(root, add);\n inspectDelivery(root, config, add);\n\n return { status: findings.some(finding => finding.severity === 'blocker') ? 'blocked' : 'pass', findings,\n coverage: 'Static layout, naming, command, dependency-pin, tool-preset, CI, deployment and documentation structure only. This is not engineering-standard completion.',\n outstandingEvidence: ['Usage and deletion review including assets, configuration and dynamic references', 'Business data and component/style ownership review', 'Clean install, fast checks and production build', 'Full discovered technical URL estate', 'All distinct page families and important browser journeys', 'Exact-source protected Preview', 'Reporting/Ads provider cutover and authorised production verification'] };\n}\n\ntype Add = (path: string, rule: string, message: string, extra?: { severity?: EngineeringFindingSeverity; line?: number }) => void;\n\n// --- commands (section 6) ----------------------------------------------------\n\nfunction inspectCommands(pkg: PackageManifest, add: Add) {\n const scripts = pkg.scripts ?? {};\n for (const command of ['dev', 'start', ...ENGINEERING_FAST_COMMANDS, 'verify', 'build', 'test:e2e']) {\n if (!scripts[command]?.trim()) add('package.json', 'command-contract', `Missing ${command} command.`);\n }\n for (const [name, expected] of Object.entries(BRANDLAB_EXPECTED_SCRIPTS)) {\n const actual = scripts[name]?.trim();\n if (actual && actual.replace(/\\s+/g, ' ') !== expected) {\n add('package.json', 'script-contract', `${name} must be exactly \"${expected}\" (found \"${actual}\").`);\n }\n }\n const verify = scripts.verify?.trim();\n if (verify) {\n const unrecognised = splitCommandChain(verify).filter(segment => scriptReferences(segment, scripts) === null);\n if (unrecognised.length > 0) {\n add('package.json', 'verification-command-form',\n `verify may only chain package scripts (npm run <script>, npm test, run-s, run-p); \"${unrecognised.join('\", \"')}\" is not recognised. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n }\n const reachable = new Set<string>();\n const visit = (name: string) => {\n if (reachable.has(name)) return;\n reachable.add(name);\n for (const segment of splitCommandChain(scripts[name] ?? '')) {\n for (const reference of scriptReferences(segment, scripts) ?? []) visit(reference);\n }\n };\n visit('verify');\n for (const command of ENGINEERING_FAST_COMMANDS) {\n if (!reachable.has(command)) add('package.json', 'verification-wiring', `verify must execute ${command}. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n if (reachable.has('build')) add('package.json', 'single-build', 'Keep the production build separate from fast verify; run it once for the final candidate.');\n}\n\n/** Split a shell command on its chaining operators. */\nexport function splitCommandChain(command: string): string[] {\n return command.split(/&&|\\|\\||[;|&]/).map(segment => segment.trim()).filter(Boolean);\n}\n\n/**\n * The package scripts one command segment runs, or null when the segment is\n * not a recognised script invocation (npm run, npm test, run-s, run-p, npm-run-all).\n */\nexport function scriptReferences(segment: string, scripts: Readonly<Record<string, string>>): string[] | null {\n const words = segment.split(/\\s+/).filter(Boolean);\n while (words[0] && /^[A-Z_][A-Z0-9_]*=/.test(words[0])) words.shift();\n const [tool, ...rest] = words;\n if (tool === 'npm') {\n const [subcommand, ...args] = rest;\n if (subcommand === 'test' || subcommand === 't') return ['test'];\n if (subcommand === 'start' || subcommand === 'stop' || subcommand === 'restart') return [subcommand];\n if (subcommand === 'run' || subcommand === 'run-script') {\n const name = args.find(arg => !arg.startsWith('-'));\n return name ? [name] : null;\n }\n return null;\n }\n if (tool === 'run-s' || tool === 'run-p' || tool === 'npm-run-all') {\n const patterns: string[] = [];\n for (const word of rest) {\n if (word === '--') break;\n if (!word.startsWith('-')) patterns.push(word.replace(/^['\"]|['\"]$/g, ''));\n }\n if (patterns.length === 0) return null;\n // npm-run-all globs: `*` stays within one `:` segment; a whole `**` segment spans several.\n return patterns.flatMap(pattern => pattern.includes('*') || pattern.includes('?') || pattern.includes('[')\n ? Object.keys(scripts).filter(name => globMatch(pattern, name, { separator: ':', globstar: true }))\n : [pattern]);\n }\n return null;\n}\n\n// --- dependencies (section 1) ------------------------------------------------\n\nfunction inspectDependencies(pkg: PackageManifest, add: Add) {\n if (pkg.type !== 'module') add('package.json', 'module-type', 'Declare \"type\": \"module\".');\n const dependencies = { ...pkg.dependencies, ...pkg.devDependencies };\n for (const tool of DEV_TOOLING) {\n const spec = pkg.devDependencies?.[tool];\n if (!spec || !SEMVER.test(spec)) add('package.json', 'dev-tooling', `Pin ${tool} exactly as a development dependency.`);\n }\n // Packed preflight binds the four Brandlab packages to local file: archives; the evaluator verifies those.\n const ranges = Object.entries(dependencies)\n .filter(([name, spec]) => !SEMVER.test(spec) && !(name.startsWith('@brandlab-digital/') && spec.startsWith('file:')))\n .map(([name, spec]) => `${name}@${spec}`);\n if (ranges.length > 0) add('package.json', 'exact-pins', `Pin every dependency to the exact locked version: ${ranges.sort().join(', ')}.`);\n const next = dependencies.next;\n for (const companion of ['eslint-config-next', '@next/mdx']) {\n const spec = dependencies[companion];\n if (spec && spec !== next) add('package.json', 'framework-companion-pin', `${companion} must equal the next version (${next ?? 'missing'}); found ${spec}.`);\n }\n if (!dependencies['eslint-config-next']) add('package.json', 'framework-companion-pin', 'Declare eslint-config-next at the exact next version for brandlab.configs.next.');\n if (pkg.dependencies?.sharp || pkg.devDependencies?.sharp) add('package.json', 'sharp-override-only', 'Remove the direct sharp dependency; the release-owned overrides.sharp pin is the only declaration.');\n}\n\n// --- layout and naming (section 2) --------------------------------------------\n\nfunction inspectLayout(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n for (const path of ['src/app', 'src/config', 'src/data', 'src/lib', 'src/components', 'tests']) {\n if (!isDirectory(join(root, path))) add(path, 'source-organisation', `Place the corresponding implementation under ${path}.`);\n }\n for (const path of RETIRED_ROOT_DIRECTORIES) {\n if (existsSync(join(root, path))) add(path, 'retired-source-layout', 'Migrate consumers to the current src responsibilities and remove the superseded directory.');\n }\n const required = [\n 'src/config/site.ts', 'src/config/analytics.ts', 'src/data/business.ts', 'src/data/routes.ts', 'src/data/redirects.ts',\n 'src/lib/seo/metadata.ts', 'src/instrumentation-client.ts', 'src/app/layout.tsx', 'src/app/robots.ts', 'src/app/sitemap.xml/route.ts',\n 'src/data/businessEvidence.ts',\n ...(capabilities.contactEnabled ? ['src/config/contact.ts', CONTACT_RUNTIME, 'src/app/api/contact/route.ts'] : []),\n ...(capabilities.reviewsEnabled ? ['src/config/reviews.ts'] : []),\n ...(capabilities.locationsDeclared ? ['src/data/locations/estate.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'owner-file', `The 3.0 layout places this owner at ${path}.`);\n }\n for (const [path, message] of [\n ['src/config/env.ts', 'Remove the local environment parser; site configuration is a source constant.'],\n ['src/lib/analytics', 'Remove the local analytics layer; installBrandlabInstrumentation owns it.'],\n ['src/lib/contact/definition.ts', 'Remove the local contact definition; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/constants.ts', 'Remove the local contact constants; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/runtime.ts', 'Remove the local contact runtime; POST uses createBrandlabContactRouteHandler.'],\n ['src/components/analytics/GoogleTag.tsx', 'Render BrandlabGoogleTag directly in src/app/layout.tsx.'],\n ['src/components/analytics/CoreWebVitalsReporter.tsx', 'Remove the web-vitals reporter.'],\n ['src/lib/seo/sitemaps', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/sitemaps.ts', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/schema/sanitize.ts', 'Remove the local schema sanitiser; the packages own sanitising.'],\n ['src/lib/seo/schema/SchemaScript.tsx', 'Import SchemaScript from @brandlab-digital/site-next/schema.'],\n ['src/lib/seo/index.ts', 'Remove the SEO barrel and import each module directly.'],\n ] as const) {\n if (existsSync(join(root, path))) add(path, 'retired-file', message);\n }\n\n if (isDirectory(join(root, 'src'))) {\n for (const entry of readdirSync(join(root, 'src'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n const path = `src/${entry.name}`;\n if (entry.isDirectory() && SRC_DIRECTORIES.has(entry.name)) {\n if (entry.name === 'types' && walkProjectFiles(root, path).some(file => !file.endsWith('.d.ts'))) {\n add(path, 'standard-layout', 'src/types may hold only ambient .d.ts declarations.');\n }\n continue;\n }\n if (entry.isFile() && SRC_ROOT_FILES.test(entry.name)) continue;\n add(path, 'standard-layout', `${path} is outside the standard layout (src/{app,config,data,content,lib,components}).`);\n }\n }\n if (isDirectory(join(root, 'src/components'))) {\n for (const entry of readdirSync(join(root, 'src/components'), { withFileTypes: true })) {\n if (entry.name.startsWith('.') || entry.name === 'templates') continue;\n if (!entry.isDirectory() || !COMPONENT_ROLES.has(entry.name)) {\n add(`src/components/${entry.name}`, 'component-role', 'Components belong to one role: layout, ui, sections, features or page-families.');\n }\n }\n }\n for (const path of walkProjectFiles(root, 'src')) inspectFileName(root, path, add);\n}\n\nfunction inspectFileName(root: string, path: string, add: Add) {\n const name = posix.basename(path);\n const directory = posix.dirname(path);\n if (directory === 'src' && SRC_ROOT_FILES.test(name)) return;\n if (name.endsWith('.module.css')) {\n const component = name.replace(/\\.module\\.css$/, '');\n // Exact names from the directory listing: existsSync is case-insensitive on macOS but not on the Linux CI\n // (a button.module.css beside Button.tsx passed locally and failed in CI).\n const siblings = directoryEntries(join(root, directory));\n if (!['tsx', 'ts', 'jsx'].some(extension => siblings.has(`${component}.${extension}`))) {\n add(path, 'file-naming', `Keep ${name} beside the ${component} component it styles (the file names must match exactly, including case).`);\n }\n return;\n }\n if (path.startsWith('src/app/')) {\n // Images, fonts and metadata assets are framework-consumed; only code and styles are placed.\n if (!CODE_OR_STYLE.test(name)) return;\n const segments = path.split('/');\n const privateFolder = segments.slice(2, -1).find(segment => segment.startsWith('_') && segment !== '_components');\n if (privateFolder) {\n add(path, 'route-local-code', `Route-local code belongs in src/app/<route>/_components/, not ${privateFolder}/.`);\n return;\n }\n if (!segments.includes('_components')) {\n if (NEXT_SPECIAL_FILE.test(name) || path === 'src/app/globals.css') return;\n add(path, 'route-local-code', 'Route-local code belongs in src/app/<route>/_components/; framework files keep their reserved names.');\n return;\n }\n }\n if (!/\\.(?:ts|tsx)$/.test(name) || path.startsWith('src/content/')) return;\n if (name.endsWith('.tsx') && !PASCAL_COMPONENT.test(name)) {\n add(path, 'file-naming', 'Components use PascalCase .tsx file names.');\n } else if (name.endsWith('.ts') && !CAMEL_MODULE.test(name)) {\n add(path, 'file-naming', 'Data and helper modules use camelCase .ts file names.');\n }\n if (path.startsWith('src/components/page-families/') && name.endsWith('.tsx') && !/^[A-Z][A-Za-z0-9]*Page\\.tsx$/.test(name)) {\n add(path, 'file-naming', 'Page families are named <RouteKind>Page.tsx.');\n }\n}\n\n// --- module structure: barrels, ui data imports, estate ----------------------\n\nfunction inspectSourceModules(root: string, source: BrandlabSourceIndex, add: Add) {\n const resolver = createBrandlabModuleResolver(root, new Set(source.byPath.keys()));\n for (const file of source.files.filter(candidate => candidate.path.startsWith('src/'))) {\n const references = listModuleReferences(file);\n const forwarding = forwardingExports(file);\n if (isBarrel(file)) {\n add(file.path, 'no-barrels', 'This module only re-exports other modules; import each owner directly.');\n } else {\n for (const line of forwarding) {\n add(file.path, 'no-forwarding-exports', 'This export forwards another module; import the owner directly.', { line });\n }\n }\n if (file.path.startsWith('src/components/ui/')) {\n for (const reference of references.filter(candidate => candidate.kind !== 'export')) {\n const resolved = resolver(file.path, reference.specifier);\n if (resolved?.startsWith('src/data/') || /^@\\/data(?:\\/|$)/.test(reference.specifier)) {\n add(file.path, 'ui-imports-data', 'UI primitives never import data modules; pass prepared props from a section or route.', { line: reference.line });\n }\n }\n }\n inspectRegistryDerivedEstate(file, add);\n }\n const estate = source.byPath.get('src/data/locations/estate.ts');\n if (estate) {\n inspectRetainedExclusions(estate, add);\n inspectSiteOwnedLocations(estate, add);\n }\n}\n\n// --- server-only boundaries (3.2.1) ------------------------------------------\n\n/**\n * What a browser bundle must never carry. The contact route's delivery options and\n * the business evidence live in server-only modules, alias hosts in next.config, and\n * no module a client component reaches imports a server-only module or holds an\n * evidence record. (Next's build also refuses a client import of `server-only`; this\n * names the chain before a build is needed.) From 3.3.3 no module a client component\n * reaches imports the geography registry (site-core/geography, which the location\n * estate reads) or a package server entry: a browser bundle cannot resolve them.\n */\nfunction inspectServerBoundaries(\n root: string,\n capabilities: ReturnType<typeof describeCapabilities>,\n source: BrandlabSourceIndex,\n add: Add,\n) {\n const contact = source.byPath.get('src/config/contact.ts');\n const runtime = source.byPath.get(CONTACT_RUNTIME);\n if (capabilities.contactEnabled && runtime) {\n if (!importsServerOnly(runtime)) {\n add(CONTACT_RUNTIME, 'server-only-module', `${CONTACT_RUNTIME} imports 'server-only', so no client component can bundle the delivery options.`);\n }\n if (!declaresName(runtime, 'contactRuntime')) {\n add(CONTACT_RUNTIME, 'contact-runtime', `${CONTACT_RUNTIME} exports contactRuntime (the labels, email style and attachment policy createBrandlabContactRouteHandler takes).`);\n }\n }\n const moved = contact ? declaresName(contact, 'contactRuntime') : undefined;\n if (contact && moved) {\n add('src/config/contact.ts', 'contact-runtime', `contactRuntime belongs in ${CONTACT_RUNTIME}: the contact form imports src/config/contact.ts, so everything contactRuntime reads (the site identity, business data) reaches the browser.`, { line: moved });\n }\n\n const evidence = source.byPath.get(BUSINESS_EVIDENCE);\n if (evidence) {\n if (!importsServerOnly(evidence)) {\n add(BUSINESS_EVIDENCE, 'server-only-module', `${BUSINESS_EVIDENCE} imports 'server-only', so no client component can bundle the evidence records.`);\n }\n if (findImportedCalls(evidence, /^@brandlab-digital\\/site-core\\/business$/, 'defineBrandlabBusiness').length === 0) {\n add(BUSINESS_EVIDENCE, 'business-evidence', `${BUSINESS_EVIDENCE} declares the business facts with defineBrandlabBusiness, each with its evidence.`);\n }\n }\n const values = source.byPath.get(BUSINESS_VALUES);\n if (values) {\n const call = BUSINESS_FACT_CALLS.exec(values.executable);\n const record = evidenceRecordLines(values)[0];\n if (call || record) {\n add(BUSINESS_VALUES, 'business-evidence', `${BUSINESS_VALUES} holds the display values only (businessFacts); defineBrandlabBusiness and the evidence belong in ${BUSINESS_EVIDENCE}, which stays on the server.`,\n { line: record ?? lineAtIndex(values.text, call!.index) });\n }\n }\n\n const site = source.byPath.get(SITE_IDENTITY);\n const aliasHosts = site ? declaredAliasHosts(site) : undefined;\n if (aliasHosts) {\n add(SITE_IDENTITY, 'alias-hosts', 'Declare the alias hosts in next.config.ts with defineBrandlabNextConfig({ aliasHosts }): client components import the site identity, so its alias hosts reach the browser.', { line: aliasHosts });\n }\n\n const resolver = createBrandlabModuleResolver(root, new Set(source.byPath.keys()));\n const reached = new Map<string, string | null>();\n const queue = source.files.filter(file => file.path.startsWith('src/') && (isClientModule(file) || /^src\\/instrumentation-client\\.[cm]?[jt]sx?$/.test(file.path)));\n for (const file of queue) reached.set(file.path, null);\n while (queue.length > 0) {\n const file = queue.shift()!;\n for (const reference of listModuleReferences(file)) {\n if (reference.typeOnly) continue;\n const target = resolver(file.path, reference.specifier);\n if (!target || reached.has(target)) continue;\n reached.set(target, file.path);\n const next = source.byPath.get(target);\n if (next) queue.push(next);\n }\n }\n const chain = (path: string) => {\n const steps: string[] = [];\n for (let at: string | null | undefined = path; at; at = reached.get(at)) steps.unshift(at);\n return steps.join(' → ');\n };\n for (const path of [...reached.keys()].sort()) {\n const file = source.byPath.get(path);\n if (!file) continue;\n if (importsServerOnly(file)) {\n add(path, 'client-bundle-boundary', `A client component imports this server-only module (${chain(path)}); pass what it needs as props from a server component.`);\n continue;\n }\n const serverEntry = listModuleReferences(file).find(reference => !reference.typeOnly && SERVER_PACKAGE_ENTRIES.has(reference.specifier));\n if (serverEntry) {\n add(path, 'client-bundle-boundary', `${SERVER_PACKAGE_ENTRIES.get(serverEntry.specifier)} reaches the browser (${chain(path)} → ${serverEntry.specifier}), and from 3.3.3 a browser bundle cannot resolve it, so the build fails. ${serverEntry.specifier === GEOGRAPHY_ENTRY ? 'Build the location lists a client component shows (navigation, service areas) in a server component and pass them as plain props; keep error pages and the analytics binding free of location data.' : 'Keep it in server components and route handlers.'}`, { line: serverEntry.line });\n continue;\n }\n const record = evidenceRecordLines(file)[0];\n if (record) {\n add(path, 'client-bundle-boundary', `An evidence record (sourceKind, verifiedAt) reaches the browser (${chain(path)}); keep evidence in ${BUSINESS_EVIDENCE}.`, { line: record });\n }\n }\n}\n\n/** A module whose directive prologue says 'use client'. */\nfunction isClientModule(file: BrandlabSourceFile): boolean {\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (!ts.isExpressionStatement(statement) || !ts.isStringLiteral(statement.expression)) return false;\n if (statement.expression.text === 'use client') return true;\n }\n return false;\n}\n\n/** `import 'server-only'` at the top level. */\nfunction importsServerOnly(file: BrandlabSourceFile): boolean {\n return parseBrandlabSourceFile(file).statements.some(statement =>\n ts.isImportDeclaration(statement) && !statement.importClause &&\n ts.isStringLiteral(statement.moduleSpecifier) && statement.moduleSpecifier.text === 'server-only');\n}\n\n/** The line of a top-level declaration of `name`, if the module declares it. */\nfunction declaresName(file: BrandlabSourceFile, name: string): number | undefined {\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.name.text === name) return lineOfNode(file, statement);\n }\n } else if ((ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) && statement.name?.text === name) {\n return lineOfNode(file, statement);\n }\n }\n return undefined;\n}\n\n/** Lines of object literals that are evidence records: they name both sourceKind and verifiedAt. */\nfunction evidenceRecordLines(file: BrandlabSourceFile): number[] {\n const lines: number[] = [];\n const visit = (node: ts.Node) => {\n if (ts.isObjectLiteralExpression(node)) {\n const names = new Set(node.properties.map(property => property.name && (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) ? property.name.text : ''));\n if (names.has('sourceKind') && names.has('verifiedAt')) lines.push(lineOfNode(file, node));\n }\n ts.forEachChild(node, visit);\n };\n visit(parseBrandlabSourceFile(file));\n return lines;\n}\n\n/** The line of a non-empty `aliasHosts` in the defineBrandlabSite call. */\nfunction declaredAliasHosts(file: BrandlabSourceFile): number | undefined {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/site$/, 'defineBrandlabSite')) {\n let definition: ts.Expression | undefined = call.arguments[0];\n while (definition && (ts.isAsExpression(definition) || ts.isSatisfiesExpression(definition) || ts.isParenthesizedExpression(definition))) {\n definition = definition.expression;\n }\n if (!definition || !ts.isObjectLiteralExpression(definition)) continue;\n const property = definition.properties.find(candidate =>\n (ts.isPropertyAssignment(candidate) || ts.isShorthandPropertyAssignment(candidate)) &&\n (ts.isIdentifier(candidate.name) || ts.isStringLiteral(candidate.name)) && candidate.name.text === 'aliasHosts');\n if (!property) continue;\n const array = ts.isPropertyAssignment(property)\n ? arrayLiteral(file, property.initializer)\n : ts.isShorthandPropertyAssignment(property) ? arrayLiteral(file, property.name) : undefined;\n if (array && array.elements.length === 0) continue;\n return lineOfNode(file, property);\n }\n return undefined;\n}\n\n/** Lines of `export ... from` statements and exports of names this module only imported. */\nfunction forwardingExports(file: BrandlabSourceFile): number[] {\n const source = parseBrandlabSourceFile(file);\n const imported = new Set(listModuleReferences(file).filter(reference => reference.kind === 'import').flatMap(reference => reference.bindings.map(binding => binding.local)));\n const lines: number[] = [];\n for (const statement of source.statements) {\n const forwards =\n (ts.isExportDeclaration(statement) && (statement.moduleSpecifier !== undefined ||\n (statement.exportClause !== undefined && ts.isNamedExports(statement.exportClause) &&\n statement.exportClause.elements.some(element => imported.has((element.propertyName ?? element.name).text))))) ||\n (ts.isExportAssignment(statement) && ts.isIdentifier(statement.expression) && imported.has(statement.expression.text));\n if (forwards) lines.push(lineOfNode(file, statement));\n }\n return lines;\n}\n\n/** A module with no declarations or statements of its own besides imports and exports. */\nfunction isBarrel(file: BrandlabSourceFile): boolean {\n const statements = parseBrandlabSourceFile(file).statements;\n return statements.length > 0 && forwardingExports(file).length > 0 &&\n statements.every(statement => ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement) || ts.isExportAssignment(statement));\n}\n\nfunction inspectRegistryDerivedEstate(file: BrandlabSourceFile, add: Add) {\n const derived = listModuleReferences(file)\n .filter(reference => reference.kind === 'import' && /^@brandlab-digital\\/site-core\\//.test(reference.specifier))\n .flatMap(reference => reference.bindings.filter(binding => /WebsiteSuburbs$/.test(binding.imported)).map(binding => ({ ...binding, line: reference.line })));\n const namespaceUse = file.executable.match(/\\.\\s*([a-z][A-Za-z]*WebsiteSuburbs)\\b/);\n const first = derived[0] ?? (namespaceUse ? { imported: namespaceUse[1]!, line: lineAtIndex(file.text, namespaceUse.index ?? 0) } : null);\n if (!first) return;\n add(file.path, 'estate-registry-derived',\n `${first.imported} is a registry candidate list; the published estate in src/data/locations/estate.ts must be literal data, never derived from it.`, { line: first.line });\n}\n\nfunction inspectRetainedExclusions(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const retained = objectPropertyValue(call.arguments[0], 'retainedExclusions');\n if (!retained || !ts.isArrayLiteralExpression(retained) || retained.elements.length === 0) continue;\n const slugs = retained.elements.map(element => {\n if (ts.isStringLiteralLike(element)) return element.text;\n const slug = objectPropertyValue(element, 'slug');\n return slug && ts.isStringLiteralLike(slug) ? slug.text : null;\n }).filter((slug): slug is string => Boolean(slug));\n add(file.path, 'estate-retained-exclusions',\n `${retained.elements.length} policy-excluded location(s) stay published for a later SEO decision${slugs.length ? `: ${slugs.join(', ')}` : ''}.`,\n { severity: 'info', line: lineOfNode(file, retained) });\n }\n}\n\n/** An array literal, directly or through a top-level `const name = [...]` (optionally `as const`) in the same file. */\nfunction arrayLiteral(file: BrandlabSourceFile, node: ts.Expression | undefined): ts.ArrayLiteralExpression | undefined {\n const unwrap = (expression: ts.Expression | undefined): ts.Expression | undefined => {\n let current = expression;\n while (current && (ts.isAsExpression(current) || ts.isSatisfiesExpression(current) || ts.isParenthesizedExpression(current))) {\n current = current.expression;\n }\n return current;\n };\n const value = unwrap(node);\n if (value && ts.isArrayLiteralExpression(value)) return value;\n if (!value || !ts.isIdentifier(value)) return undefined;\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (!ts.isVariableStatement(statement)) continue;\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.name.text === value.text) {\n const initializer = unwrap(declaration.initializer);\n return initializer && ts.isArrayLiteralExpression(initializer) ? initializer : undefined;\n }\n }\n }\n return undefined;\n}\n\n/** Report the locations the site publishes outside the shared registry, with each group's reason. */\nfunction inspectSiteOwnedLocations(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const declared = objectPropertyValue(call.arguments[0], 'siteOwned');\n if (!declared) continue;\n const groups = arrayLiteral(file, declared);\n if (!groups) {\n add(file.path, 'estate-site-owned',\n 'siteOwned must be literal data in src/data/locations/estate.ts: [{ reason, slugs }], never derived.', { line: lineOfNode(file, declared) });\n continue;\n }\n if (groups.elements.length === 0) continue;\n let total = 0;\n const summaries = groups.elements.map(element => {\n const reason = objectPropertyValue(element, 'reason');\n const slugs = arrayLiteral(file, objectPropertyValue(element, 'slugs'));\n const count = slugs?.elements.length;\n total += count ?? 0;\n const label = reason && ts.isStringLiteralLike(reason) ? reason.text : 'a reason that is not a string literal';\n return `${count ?? 'an unknown number of'} for \"${label}\"`;\n });\n add(file.path, 'estate-site-owned',\n `${total} location(s) are published outside the shared geography registry, declared site-owned: ${summaries.join('; ')}.`,\n { severity: 'info', line: lineOfNode(file, groups) });\n }\n}\n\nfunction lineAtIndex(text: string, index: number): number {\n return text.slice(0, index).split('\\n').length;\n}\n\n// --- tests (sections 2 and 6) -------------------------------------------------\n\nfunction inspectTests(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n if (!isDirectory(join(root, 'tests'))) return;\n for (const entry of readdirSync(join(root, 'tests'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n if (!entry.isDirectory() || !TEST_DIRECTORIES.has(entry.name)) {\n add(`tests/${entry.name}`, 'test-layout', 'Tests live in tests/{config,data,lib,components,e2e,support}.');\n }\n }\n const required = [\n 'tests/data/routes.test.ts', 'tests/config/analytics.test.ts',\n 'tests/e2e/estate.spec.ts', 'tests/e2e/analytics.spec.ts', 'tests/e2e/families.spec.ts',\n ...(capabilities.contactEnabled ? ['tests/config/contact.test.ts', 'tests/e2e/contact.spec.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'shared-tests', `The shared 3.0 test set includes ${path}.`);\n }\n for (const path of walkProjectFiles(root, 'tests')) {\n if (/-darwin\\.png$/.test(path)) add(path, 'committed-snapshots', 'Delete committed darwin snapshots; rendered checks run against the CI build.');\n }\n}\n\n// --- dev presets (section 4) -------------------------------------------------\n\nfunction inspectToolPresets(root: string, add: Add) {\n const eslint = readOptional(join(root, 'eslint.config.mjs'));\n if (eslint === null) add('eslint.config.mjs', 'tool-preset', 'Add eslint.config.mjs: export default brandlab.configs.next.');\n else if (!/@brandlab-digital\\/eslint-plugin/.test(eslint) || !/export\\s+default\\s+[A-Za-z_$][\\w$]*\\.configs\\.next\\s*;?\\s*$/.test(eslint.trim())) {\n add('eslint.config.mjs', 'tool-preset', 'eslint.config.mjs is exactly `export default brandlab.configs.next` (imported from @brandlab-digital/eslint-plugin).');\n }\n const knip = readOptional(join(root, 'knip.ts'));\n if (knip === null) add('knip.ts', 'tool-preset', 'Add knip.ts: export default brandlabKnip({ mdx?, entry? }).');\n else if (!/@brandlab-digital\\/conformance\\/knip/.test(knip) || !/export\\s+default\\s+brandlabKnip\\s*\\(/.test(knip)) {\n add('knip.ts', 'tool-preset', 'knip.ts exports brandlabKnip({ mdx?, entry? }) from @brandlab-digital/conformance/knip.');\n }\n if (!['playwright.config.ts', 'playwright.config.mts'].some(name => existsSync(join(root, name)))) {\n add('playwright.config.ts', 'tool-preset', 'Add the Playwright configuration for the shared e2e specs.');\n }\n if (!['vitest.config.ts', 'vitest.config.mts'].some(name => existsSync(join(root, name)))) {\n add('vitest.config.ts', 'tool-preset', 'Add the Vitest configuration for the binding tests.');\n }\n}\n\n// --- CI, dependencies, Vercel and docs (section 6) ---------------------------\n\nfunction inspectDelivery(root: string, config: string | null, add: Add) {\n const workflowDirectory = join(root, '.github/workflows');\n const workflows = isDirectory(workflowDirectory) ? readdirSync(workflowDirectory).filter(name => /\\.ya?ml$/.test(name)).sort() : [];\n const callers = workflows.filter(name => /uses\\s*:\\s*['\"]?RomieDandan\\/brandlab\\/\\.github\\/workflows\\/verify-next\\.yml@/.test(readFileSync(join(workflowDirectory, name), 'utf8')));\n if (callers.length !== 1 || callers[0] !== 'verify.yml') {\n add('.github/workflows/verify.yml', 'ci-workflow', `Exactly one .github/workflows/verify.yml calls RomieDandan/brandlab/.github/workflows/verify-next.yml at the fleet SHA (found ${callers.length ? callers.join(', ') : 'none'}).`);\n }\n for (const path of ['.github/dependabot.yml', '.github/dependabot.yaml', 'renovate.json', 'renovate.json5', '.github/renovate.json', '.renovaterc', '.renovaterc.json']) {\n if (existsSync(join(root, path))) add(path, 'dependency-bots', 'Exact pins move with Brandlab releases; remove Dependabot/Renovate version updates.');\n }\n const vercel = readOptional(join(root, 'vercel.json'));\n let installCommand: unknown;\n try { installCommand = vercel === null ? undefined : JSON.parse(vercel).installCommand; } catch { installCommand = undefined; }\n if (installCommand !== 'npm ci') add('vercel.json', 'vercel-install', 'vercel.json sets installCommand to \"npm ci\".');\n let regions: unknown;\n try { regions = vercel === null ? undefined : JSON.parse(vercel).regions; } catch { regions = undefined; }\n for (const message of checkOriginRegion(config, regions)) add('vercel.json', 'vercel-region', message);\n let ignoreCommand: unknown;\n try { ignoreCommand = vercel === null ? undefined : JSON.parse(vercel).ignoreCommand; } catch { ignoreCommand = undefined; }\n if (ignoreCommand !== BRANDLAB_VERCEL_IGNORE_COMMAND) {\n add('vercel.json', 'vercel-ignore-build', `vercel.json skips a production build only when a push changes nothing but .github/, docs/ or root Markdown files: \"ignoreCommand\": ${JSON.stringify(BRANDLAB_VERCEL_IGNORE_COMMAND)} (found ${ignoreCommand === undefined ? 'none' : JSON.stringify(ignoreCommand)}). A CI-only change otherwise rebuilds production and empties its CDN cache; previews and anything git cannot compare still build.`);\n }\n\n if (!existsSync(join(root, 'README.md'))) add('README.md', 'project-docs', 'Add the generated README.md (commands, architecture, environment names, deployment and rollback).');\n const agents = join(root, 'AGENTS.md');\n if (!existsSync(agents)) add('AGENTS.md', 'project-docs', 'Add AGENTS.md with the fixed sources of truth and guardrails.');\n else if (statSync(agents).size > 3_584) add('AGENTS.md', 'project-docs', `AGENTS.md is ${statSync(agents).size} bytes; keep it to about 3 KB and archive history to the control repo.`);\n const claude = readOptional(join(root, 'CLAUDE.md'));\n if (claude === null || claude.trim() !== '@AGENTS.md') add('CLAUDE.md', 'project-docs', 'CLAUDE.md is the single line @AGENTS.md.');\n}\n\nconst directoryListings = new Map<string, ReadonlySet<string>>();\n\n/** The exact file names in a directory (cached per check run). */\nfunction directoryEntries(path: string): ReadonlySet<string> {\n let entries = directoryListings.get(path);\n if (!entries) {\n try { entries = new Set(readdirSync(path)); } catch { entries = new Set(); }\n directoryListings.set(path, entries);\n }\n return entries;\n}\n\nfunction readOptional(path: string): string | null {\n return existsSync(path) ? readFileSync(path, 'utf8') : null;\n}\n"]}
@@ -0,0 +1,27 @@
1
+ /** The origin region when brandlab.config declares no hosting block. */
2
+ export declare const BRANDLAB_DEFAULT_ORIGIN_REGION = "syd1";
3
+ /** The longest a recorded origin-region decision may run before review, in days. */
4
+ export declare const BRANDLAB_ORIGIN_DECISION_MAX_DAYS = 183;
5
+ export type BrandlabHostingRead = {
6
+ status: 'absent';
7
+ } | {
8
+ status: 'not-literal';
9
+ } | {
10
+ status: 'declared';
11
+ hosting: unknown;
12
+ };
13
+ /** The `hosting` property of the defineBrandlabProject({ ... }) literal in brandlab.config.ts. */
14
+ export declare function readBrandlabHosting(configText: string | null): BrandlabHostingRead;
15
+ /** The regions a hosting block asks for, or null when originRegion is not one Brandlab accepts. */
16
+ export declare function hostingOriginRegions(hosting: unknown): readonly string[] | null;
17
+ /** Mirror of site-core's checkBrandlabHosting: every problem with a hosting block (empty when valid). */
18
+ export declare function checkHostingRecord(hosting: unknown): string[];
19
+ /** Whether two region lists name the same regions, ignoring order (duplicates never match). */
20
+ export declare function sameRegions(actual: unknown, expected: readonly string[]): boolean;
21
+ /**
22
+ * The origin-region problems for one project (W5): vercel.json regions must equal hosting.originRegion, a non-Sydney
23
+ * origin needs a valid decision record, and the gate fails once that record's reviewBy (a UTC date) has passed.
24
+ * Without a hosting block Sydney is required, exactly as 3.4.0.
25
+ */
26
+ export declare function checkOriginRegion(configText: string | null, vercelRegions: unknown, now?: Date): string[];
27
+ //# sourceMappingURL=hosting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosting.d.ts","sourceRoot":"","sources":["../src/hosting.ts"],"names":[],"mappings":"AAQA,wEAAwE;AACxE,eAAO,MAAM,8BAA8B,SAAS,CAAC;AACrD,oFAAoF;AACpF,eAAO,MAAM,iCAAiC,MAAM,CAAC;AAErD,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpB;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAiC7C,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,mBAAmB,CAuBlF;AAgBD,mGAAmG;AACnG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAK/E;AAED,yGAAyG;AACzG,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CA8C7D;AAED,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAIjF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,EAAE,CA2BrH"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * The origin region a site records in brandlab.config `hosting` (3.4.1, W5), read statically from the config text.
3
+ *
4
+ * Conformance compiles without the other packages (the operations evaluator builds it from source alone), so
5
+ * site-core's checkBrandlabHosting is mirrored here; hosting.test.ts keeps the two identical.
6
+ */
7
+ import ts from 'typescript';
8
+ /** The origin region when brandlab.config declares no hosting block. */
9
+ export const BRANDLAB_DEFAULT_ORIGIN_REGION = 'syd1';
10
+ /** The longest a recorded origin-region decision may run before review, in days. */
11
+ export const BRANDLAB_ORIGIN_DECISION_MAX_DAYS = 183;
12
+ const NOT_LITERAL = Symbol('not-literal');
13
+ /** The literal value of an expression (strings, numbers, arrays, plain objects), or NOT_LITERAL. */
14
+ function literalValue(node) {
15
+ while (ts.isParenthesizedExpression(node) || ts.isAsExpression(node) || ts.isSatisfiesExpression(node) || ts.isTypeAssertionExpression(node)) {
16
+ node = node.expression;
17
+ }
18
+ if (ts.isStringLiteralLike(node))
19
+ return node.text;
20
+ if (ts.isNumericLiteral(node))
21
+ return Number(node.text);
22
+ if (ts.isPrefixUnaryExpression(node) && node.operator === ts.SyntaxKind.MinusToken && ts.isNumericLiteral(node.operand)) {
23
+ return -Number(node.operand.text);
24
+ }
25
+ if (ts.isArrayLiteralExpression(node)) {
26
+ const values = node.elements.map(element => ts.isSpreadElement(element) ? NOT_LITERAL : literalValue(element));
27
+ return values.includes(NOT_LITERAL) ? NOT_LITERAL : values;
28
+ }
29
+ if (ts.isObjectLiteralExpression(node)) {
30
+ const value = {};
31
+ for (const property of node.properties) {
32
+ if (!ts.isPropertyAssignment(property))
33
+ return NOT_LITERAL;
34
+ const key = property.name;
35
+ if (!ts.isIdentifier(key) && !ts.isStringLiteralLike(key))
36
+ return NOT_LITERAL;
37
+ const inner = literalValue(property.initializer);
38
+ if (inner === NOT_LITERAL)
39
+ return NOT_LITERAL;
40
+ value[key.text] = inner;
41
+ }
42
+ return value;
43
+ }
44
+ return NOT_LITERAL;
45
+ }
46
+ /** The `hosting` property of the defineBrandlabProject({ ... }) literal in brandlab.config.ts. */
47
+ export function readBrandlabHosting(configText) {
48
+ if (configText === null)
49
+ return { status: 'absent' };
50
+ const source = ts.createSourceFile('brandlab.config.ts', configText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
51
+ let found;
52
+ const visit = (node) => {
53
+ if (found)
54
+ return;
55
+ if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === 'defineBrandlabProject') {
56
+ const [argument] = node.arguments;
57
+ if (argument && ts.isObjectLiteralExpression(argument)) {
58
+ for (const property of argument.properties) {
59
+ const name = property.name && (ts.isIdentifier(property.name) || ts.isStringLiteralLike(property.name)) ? property.name.text : null;
60
+ if (name !== 'hosting')
61
+ continue;
62
+ found = ts.isPropertyAssignment(property) ? property.initializer : ts.factory.createIdentifier('hosting');
63
+ }
64
+ }
65
+ return;
66
+ }
67
+ ts.forEachChild(node, visit);
68
+ };
69
+ visit(source);
70
+ if (!found)
71
+ return { status: 'absent' };
72
+ const hosting = literalValue(found);
73
+ return hosting === NOT_LITERAL ? { status: 'not-literal' } : { status: 'declared', hosting };
74
+ }
75
+ const ISO_DATE = /^(\d{4})-(\d{2})-(\d{2})$/;
76
+ const DAY_MS = 86_400_000;
77
+ /** Milliseconds since the epoch at UTC midnight for a real YYYY-MM-DD date, or null. */
78
+ function isoDateUtc(value) {
79
+ if (typeof value !== 'string')
80
+ return null;
81
+ const match = ISO_DATE.exec(value);
82
+ if (!match)
83
+ return null;
84
+ const [year, month, day] = [Number(match[1]), Number(match[2]), Number(match[3])];
85
+ const time = Date.UTC(year, month - 1, day);
86
+ const date = new Date(time);
87
+ return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day ? time : null;
88
+ }
89
+ /** The regions a hosting block asks for, or null when originRegion is not one Brandlab accepts. */
90
+ export function hostingOriginRegions(hosting) {
91
+ const originRegion = hosting && typeof hosting === 'object' ? hosting.originRegion : undefined;
92
+ if (originRegion === 'syd1' || originRegion === 'iad1')
93
+ return [originRegion];
94
+ if (Array.isArray(originRegion) && originRegion.length === 2 && originRegion[0] === 'syd1' && originRegion[1] === 'iad1')
95
+ return ['syd1', 'iad1'];
96
+ return null;
97
+ }
98
+ /** Mirror of site-core's checkBrandlabHosting: every problem with a hosting block (empty when valid). */
99
+ export function checkHostingRecord(hosting) {
100
+ if (!hosting || typeof hosting !== 'object' || Array.isArray(hosting)) {
101
+ return ['hosting must be an object with originRegion.'];
102
+ }
103
+ const problems = [];
104
+ const unsupported = Object.keys(hosting).filter(key => key !== 'originRegion' && key !== 'decision');
105
+ if (unsupported.length > 0)
106
+ problems.push(`hosting contains unsupported keys: ${unsupported.join(', ')}.`);
107
+ const { originRegion, decision } = hosting;
108
+ const known = hostingOriginRegions(hosting) !== null;
109
+ if (!known) {
110
+ problems.push(`hosting.originRegion must be 'syd1', 'iad1' or ['syd1', 'iad1'] (found ${JSON.stringify(originRegion)}).`);
111
+ }
112
+ if (decision === undefined) {
113
+ if (known && originRegion !== 'syd1') {
114
+ problems.push('hosting.decision is required for an origin other than syd1 (rule origin-region-v1).');
115
+ }
116
+ return problems;
117
+ }
118
+ if (!decision || typeof decision !== 'object' || Array.isArray(decision)) {
119
+ problems.push('hosting.decision must be an object.');
120
+ return problems;
121
+ }
122
+ const record = decision;
123
+ const allowed = ['rule', 'decidedOn', 'evidence', 'savingUsdPerCycle', 'coldMissDeltaMs', 'reviewBy'];
124
+ const extra = Object.keys(record).filter(key => !allowed.includes(key));
125
+ if (extra.length > 0)
126
+ problems.push(`hosting.decision contains unsupported keys: ${extra.join(', ')}.`);
127
+ if (record.rule !== 'origin-region-v1')
128
+ problems.push("hosting.decision.rule must be 'origin-region-v1'.");
129
+ if (typeof record.evidence !== 'string' || !record.evidence.trim()) {
130
+ problems.push('hosting.decision.evidence cannot be empty.');
131
+ }
132
+ for (const field of ['savingUsdPerCycle', 'coldMissDeltaMs']) {
133
+ if (typeof record[field] !== 'number' || !Number.isFinite(record[field])) {
134
+ problems.push(`hosting.decision.${field} must be a finite number.`);
135
+ }
136
+ }
137
+ const decidedOn = isoDateUtc(record.decidedOn);
138
+ const reviewBy = isoDateUtc(record.reviewBy);
139
+ if (decidedOn === null)
140
+ problems.push('hosting.decision.decidedOn must be a real YYYY-MM-DD date.');
141
+ if (reviewBy === null)
142
+ problems.push('hosting.decision.reviewBy must be a real YYYY-MM-DD date.');
143
+ if (decidedOn !== null && reviewBy !== null) {
144
+ if (reviewBy < decidedOn)
145
+ problems.push('hosting.decision.reviewBy cannot be before decidedOn.');
146
+ else if (reviewBy - decidedOn > BRANDLAB_ORIGIN_DECISION_MAX_DAYS * DAY_MS) {
147
+ problems.push(`hosting.decision.reviewBy must be no more than ${BRANDLAB_ORIGIN_DECISION_MAX_DAYS} days after decidedOn.`);
148
+ }
149
+ }
150
+ return problems;
151
+ }
152
+ /** Whether two region lists name the same regions, ignoring order (duplicates never match). */
153
+ export function sameRegions(actual, expected) {
154
+ if (!Array.isArray(actual) || actual.length !== expected.length)
155
+ return false;
156
+ if (new Set(actual).size !== actual.length)
157
+ return false;
158
+ return expected.every(region => actual.includes(region));
159
+ }
160
+ /**
161
+ * The origin-region problems for one project (W5): vercel.json regions must equal hosting.originRegion, a non-Sydney
162
+ * origin needs a valid decision record, and the gate fails once that record's reviewBy (a UTC date) has passed.
163
+ * Without a hosting block Sydney is required, exactly as 3.4.0.
164
+ */
165
+ export function checkOriginRegion(configText, vercelRegions, now = new Date()) {
166
+ const found = vercelRegions === undefined ? 'no regions' : JSON.stringify(vercelRegions);
167
+ const tradeOff = 'Visitors are in Australia: a Washington (iad1) origin adds a Pacific round trip only to function calls and edge misses; edge cache hits are unchanged.';
168
+ const read = readBrandlabHosting(configText);
169
+ if (read.status === 'not-literal') {
170
+ return [`brandlab.config.ts declares hosting as something other than a literal object, so the origin region cannot be checked. Write hosting: { originRegion, decision } inline.`];
171
+ }
172
+ if (read.status === 'absent') {
173
+ return sameRegions(vercelRegions, [BRANDLAB_DEFAULT_ORIGIN_REGION]) ? [] : [
174
+ `vercel.json runs the server functions in Sydney: "regions": ["${BRANDLAB_DEFAULT_ORIGIN_REGION}"] (found ${found}). ${tradeOff} Another origin needs a recorded hosting decision in brandlab.config.ts (rule origin-region-v1).`,
175
+ ];
176
+ }
177
+ const problems = checkHostingRecord(read.hosting).map(problem => `brandlab.config.ts ${problem}`);
178
+ const expected = hostingOriginRegions(read.hosting);
179
+ if (expected && !sameRegions(vercelRegions, expected)) {
180
+ problems.push(`vercel.json "regions" must equal brandlab.config hosting.originRegion: ${JSON.stringify(expected)} (found ${found}).`);
181
+ }
182
+ const decision = read.hosting.decision;
183
+ const reviewBy = decision && typeof decision === 'object' ? decision.reviewBy : undefined;
184
+ const sydneyOnly = expected !== null && expected.length === 1 && expected[0] === BRANDLAB_DEFAULT_ORIGIN_REGION;
185
+ if (!sydneyOnly && typeof reviewBy === 'string' && isoDateUtc(reviewBy) !== null) {
186
+ const today = now.toISOString().slice(0, 10);
187
+ if (today > reviewBy) {
188
+ problems.push(`The origin-region decision was due for review on ${reviewBy} (today is ${today} UTC). ${tradeOff} Review it against origin-region-v1 and record a new decidedOn and reviewBy, or return to "syd1".`);
189
+ }
190
+ }
191
+ return problems;
192
+ }
193
+ //# sourceMappingURL=hosting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosting.js","sourceRoot":"","sources":["../src/hosting.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The origin region a site records in brandlab.config `hosting` (3.4.1, W5), read statically from the config text.\n *\n * Conformance compiles without the other packages (the operations evaluator builds it from source alone), so\n * site-core's checkBrandlabHosting is mirrored here; hosting.test.ts keeps the two identical.\n */\nimport ts from 'typescript';\n\n/** The origin region when brandlab.config declares no hosting block. */\nexport const BRANDLAB_DEFAULT_ORIGIN_REGION = 'syd1';\n/** The longest a recorded origin-region decision may run before review, in days. */\nexport const BRANDLAB_ORIGIN_DECISION_MAX_DAYS = 183;\n\nexport type BrandlabHostingRead =\n | { status: 'absent' }\n | { status: 'not-literal' }\n | { status: 'declared'; hosting: unknown };\n\nconst NOT_LITERAL = Symbol('not-literal');\n\n/** The literal value of an expression (strings, numbers, arrays, plain objects), or NOT_LITERAL. */\nfunction literalValue(node: ts.Expression): unknown {\n while (ts.isParenthesizedExpression(node) || ts.isAsExpression(node) || ts.isSatisfiesExpression(node) || ts.isTypeAssertionExpression(node)) {\n node = node.expression;\n }\n if (ts.isStringLiteralLike(node)) return node.text;\n if (ts.isNumericLiteral(node)) return Number(node.text);\n if (ts.isPrefixUnaryExpression(node) && node.operator === ts.SyntaxKind.MinusToken && ts.isNumericLiteral(node.operand)) {\n return -Number(node.operand.text);\n }\n if (ts.isArrayLiteralExpression(node)) {\n const values = node.elements.map(element => ts.isSpreadElement(element) ? NOT_LITERAL : literalValue(element));\n return values.includes(NOT_LITERAL) ? NOT_LITERAL : values;\n }\n if (ts.isObjectLiteralExpression(node)) {\n const value: Record<string, unknown> = {};\n for (const property of node.properties) {\n if (!ts.isPropertyAssignment(property)) return NOT_LITERAL;\n const key = property.name;\n if (!ts.isIdentifier(key) && !ts.isStringLiteralLike(key)) return NOT_LITERAL;\n const inner = literalValue(property.initializer);\n if (inner === NOT_LITERAL) return NOT_LITERAL;\n value[key.text] = inner;\n }\n return value;\n }\n return NOT_LITERAL;\n}\n\n/** The `hosting` property of the defineBrandlabProject({ ... }) literal in brandlab.config.ts. */\nexport function readBrandlabHosting(configText: string | null): BrandlabHostingRead {\n if (configText === null) return { status: 'absent' };\n const source = ts.createSourceFile('brandlab.config.ts', configText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);\n let found: ts.Expression | undefined;\n const visit = (node: ts.Node) => {\n if (found) return;\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === 'defineBrandlabProject') {\n const [argument] = node.arguments;\n if (argument && ts.isObjectLiteralExpression(argument)) {\n for (const property of argument.properties) {\n const name = property.name && (ts.isIdentifier(property.name) || ts.isStringLiteralLike(property.name)) ? property.name.text : null;\n if (name !== 'hosting') continue;\n found = ts.isPropertyAssignment(property) ? property.initializer : ts.factory.createIdentifier('hosting');\n }\n }\n return;\n }\n ts.forEachChild(node, visit);\n };\n visit(source);\n if (!found) return { status: 'absent' };\n const hosting = literalValue(found);\n return hosting === NOT_LITERAL ? { status: 'not-literal' } : { status: 'declared', hosting };\n}\n\nconst ISO_DATE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst DAY_MS = 86_400_000;\n\n/** Milliseconds since the epoch at UTC midnight for a real YYYY-MM-DD date, or null. */\nfunction isoDateUtc(value: unknown): number | null {\n if (typeof value !== 'string') return null;\n const match = ISO_DATE.exec(value);\n if (!match) return null;\n const [year, month, day] = [Number(match[1]), Number(match[2]), Number(match[3])];\n const time = Date.UTC(year, month - 1, day);\n const date = new Date(time);\n return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day ? time : null;\n}\n\n/** The regions a hosting block asks for, or null when originRegion is not one Brandlab accepts. */\nexport function hostingOriginRegions(hosting: unknown): readonly string[] | null {\n const originRegion = hosting && typeof hosting === 'object' ? (hosting as { originRegion?: unknown }).originRegion : undefined;\n if (originRegion === 'syd1' || originRegion === 'iad1') return [originRegion];\n if (Array.isArray(originRegion) && originRegion.length === 2 && originRegion[0] === 'syd1' && originRegion[1] === 'iad1') return ['syd1', 'iad1'];\n return null;\n}\n\n/** Mirror of site-core's checkBrandlabHosting: every problem with a hosting block (empty when valid). */\nexport function checkHostingRecord(hosting: unknown): string[] {\n if (!hosting || typeof hosting !== 'object' || Array.isArray(hosting)) {\n return ['hosting must be an object with originRegion.'];\n }\n const problems: string[] = [];\n const unsupported = Object.keys(hosting).filter(key => key !== 'originRegion' && key !== 'decision');\n if (unsupported.length > 0) problems.push(`hosting contains unsupported keys: ${unsupported.join(', ')}.`);\n const { originRegion, decision } = hosting as { originRegion?: unknown; decision?: unknown };\n const known = hostingOriginRegions(hosting) !== null;\n if (!known) {\n problems.push(`hosting.originRegion must be 'syd1', 'iad1' or ['syd1', 'iad1'] (found ${JSON.stringify(originRegion)}).`);\n }\n if (decision === undefined) {\n if (known && originRegion !== 'syd1') {\n problems.push('hosting.decision is required for an origin other than syd1 (rule origin-region-v1).');\n }\n return problems;\n }\n if (!decision || typeof decision !== 'object' || Array.isArray(decision)) {\n problems.push('hosting.decision must be an object.');\n return problems;\n }\n const record = decision as Record<string, unknown>;\n const allowed = ['rule', 'decidedOn', 'evidence', 'savingUsdPerCycle', 'coldMissDeltaMs', 'reviewBy'];\n const extra = Object.keys(record).filter(key => !allowed.includes(key));\n if (extra.length > 0) problems.push(`hosting.decision contains unsupported keys: ${extra.join(', ')}.`);\n if (record.rule !== 'origin-region-v1') problems.push(\"hosting.decision.rule must be 'origin-region-v1'.\");\n if (typeof record.evidence !== 'string' || !record.evidence.trim()) {\n problems.push('hosting.decision.evidence cannot be empty.');\n }\n for (const field of ['savingUsdPerCycle', 'coldMissDeltaMs'] as const) {\n if (typeof record[field] !== 'number' || !Number.isFinite(record[field])) {\n problems.push(`hosting.decision.${field} must be a finite number.`);\n }\n }\n const decidedOn = isoDateUtc(record.decidedOn);\n const reviewBy = isoDateUtc(record.reviewBy);\n if (decidedOn === null) problems.push('hosting.decision.decidedOn must be a real YYYY-MM-DD date.');\n if (reviewBy === null) problems.push('hosting.decision.reviewBy must be a real YYYY-MM-DD date.');\n if (decidedOn !== null && reviewBy !== null) {\n if (reviewBy < decidedOn) problems.push('hosting.decision.reviewBy cannot be before decidedOn.');\n else if (reviewBy - decidedOn > BRANDLAB_ORIGIN_DECISION_MAX_DAYS * DAY_MS) {\n problems.push(`hosting.decision.reviewBy must be no more than ${BRANDLAB_ORIGIN_DECISION_MAX_DAYS} days after decidedOn.`);\n }\n }\n return problems;\n}\n\n/** Whether two region lists name the same regions, ignoring order (duplicates never match). */\nexport function sameRegions(actual: unknown, expected: readonly string[]): boolean {\n if (!Array.isArray(actual) || actual.length !== expected.length) return false;\n if (new Set(actual).size !== actual.length) return false;\n return expected.every(region => actual.includes(region));\n}\n\n/**\n * The origin-region problems for one project (W5): vercel.json regions must equal hosting.originRegion, a non-Sydney\n * origin needs a valid decision record, and the gate fails once that record's reviewBy (a UTC date) has passed.\n * Without a hosting block Sydney is required, exactly as 3.4.0.\n */\nexport function checkOriginRegion(configText: string | null, vercelRegions: unknown, now: Date = new Date()): string[] {\n const found = vercelRegions === undefined ? 'no regions' : JSON.stringify(vercelRegions);\n const tradeOff = 'Visitors are in Australia: a Washington (iad1) origin adds a Pacific round trip only to function calls and edge misses; edge cache hits are unchanged.';\n const read = readBrandlabHosting(configText);\n if (read.status === 'not-literal') {\n return [`brandlab.config.ts declares hosting as something other than a literal object, so the origin region cannot be checked. Write hosting: { originRegion, decision } inline.`];\n }\n if (read.status === 'absent') {\n return sameRegions(vercelRegions, [BRANDLAB_DEFAULT_ORIGIN_REGION]) ? [] : [\n `vercel.json runs the server functions in Sydney: \"regions\": [\"${BRANDLAB_DEFAULT_ORIGIN_REGION}\"] (found ${found}). ${tradeOff} Another origin needs a recorded hosting decision in brandlab.config.ts (rule origin-region-v1).`,\n ];\n }\n const problems = checkHostingRecord(read.hosting).map(problem => `brandlab.config.ts ${problem}`);\n const expected = hostingOriginRegions(read.hosting);\n if (expected && !sameRegions(vercelRegions, expected)) {\n problems.push(`vercel.json \"regions\" must equal brandlab.config hosting.originRegion: ${JSON.stringify(expected)} (found ${found}).`);\n }\n const decision = (read.hosting as { decision?: { reviewBy?: unknown } }).decision;\n const reviewBy = decision && typeof decision === 'object' ? decision.reviewBy : undefined;\n const sydneyOnly = expected !== null && expected.length === 1 && expected[0] === BRANDLAB_DEFAULT_ORIGIN_REGION;\n if (!sydneyOnly && typeof reviewBy === 'string' && isoDateUtc(reviewBy) !== null) {\n const today = now.toISOString().slice(0, 10);\n if (today > reviewBy) {\n problems.push(`The origin-region decision was due for review on ${reviewBy} (today is ${today} UTC). ${tradeOff} Review it against origin-region-v1 and record a new decidedOn and reviewBy, or return to \"syd1\".`);\n }\n }\n return problems;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brandlab-digital/conformance",
3
- "version": "3.5.0",
3
+ "version": "3.5.2",
4
4
  "license": "UNLICENSED",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,7 +25,7 @@
25
25
  "typecheck": "tsc --noEmit -p tsconfig.json"
26
26
  },
27
27
  "dependencies": {
28
- "@brandlab-digital/site-core": "3.5.0",
28
+ "@brandlab-digital/site-core": "3.5.2",
29
29
  "typescript": "6.0.3"
30
30
  },
31
31
  "peerDependencies": {