@restforgejs/platform 4.2.8 → 4.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/SECURITY.md +83 -4
  2. package/bin/sdf-tools.exe +0 -0
  3. package/build-info.json +2 -2
  4. package/cli/consumer-deploy.js +1 -1
  5. package/cli/consumer.js +1 -1
  6. package/generators/cli/dashboard/create.js +4 -1
  7. package/generators/cli/endpoint/create.js +1 -1
  8. package/generators/cli/key/generate.js +2 -1
  9. package/generators/cli/key/revoke.js +2 -1
  10. package/generators/cli/payload/diff.js +3 -2
  11. package/generators/cli/payload/generate.js +3 -2
  12. package/generators/cli/payload/sync.js +3 -2
  13. package/generators/cli/payload/validate.js +3 -2
  14. package/generators/cli/processor/create.js +14 -3
  15. package/generators/cli/project/delete.js +2 -1
  16. package/generators/cli/query/validate.js +3 -2
  17. package/generators/cli/schema/apply.js +3 -2
  18. package/generators/cli/schema/describe.js +3 -2
  19. package/generators/cli/schema/diff.js +3 -2
  20. package/generators/cli/schema/introspect.js +3 -2
  21. package/generators/cli/schema/list.js +3 -2
  22. package/generators/cli/schema/migrate.js +3 -2
  23. package/generators/lib/migration/audit-table-runner.js +213 -215
  24. package/generators/lib/templates/dashboard-catalog.js +1 -437
  25. package/generators/lib/templates/db-connection-env.js +1 -212
  26. package/generators/lib/templates/dbschema-catalog.js +1 -489
  27. package/generators/lib/templates/field-validation-catalog.js +1 -531
  28. package/generators/lib/templates/mysql-template.js +1 -3863
  29. package/generators/lib/templates/oracle-template.js +1 -3915
  30. package/generators/lib/templates/postgres-template.js +1 -5838
  31. package/generators/lib/templates/query-declarative-catalog.js +1 -199
  32. package/generators/lib/templates/sqlite-template.js +1 -3440
  33. package/generators/lib/utils/env-manager.js +6 -0
  34. package/generators/lib/utils/path-validator.js +71 -0
  35. package/generators/lib/validators/payload-validator.js +1 -2
  36. package/integrity-manifest.json +28 -10
  37. package/package.json +11 -3
  38. package/scripts/verify-integrity.js +1 -1
  39. package/server.js +1 -1
  40. package/src/components/handlers/adjust_handler.js +1 -1
  41. package/src/components/handlers/audit_handler.js +1 -1
  42. package/src/components/handlers/delete_handler.js +1 -1
  43. package/src/components/handlers/export_handler.js +1 -1
  44. package/src/components/handlers/import_handler.js +1 -1
  45. package/src/components/handlers/insert_handler.js +1 -1
  46. package/src/components/handlers/update_handler.js +1 -1
  47. package/src/components/handlers/upload_handler.js +1 -1
  48. package/src/components/handlers/workflow_handler.js +1 -1
  49. package/src/components/integrations/webhook.js +1 -1
  50. package/src/consumers/baseConsumer.js +1 -1
  51. package/src/consumers/declarativeMapper.js +1 -1
  52. package/src/consumers/handlers/apiHandler.js +1 -1
  53. package/src/consumers/handlers/consoleHandler.js +1 -1
  54. package/src/consumers/handlers/databaseHandler.js +1 -1
  55. package/src/consumers/handlers/index.js +1 -1
  56. package/src/consumers/handlers/kafkaHandler.js +1 -1
  57. package/src/consumers/index.js +1 -1
  58. package/src/consumers/messageTransformer.js +1 -1
  59. package/src/consumers/validator.js +1 -1
  60. package/src/core/db/dialect/base-dialect.js +1 -1
  61. package/src/core/db/dialect/index.js +1 -1
  62. package/src/core/db/dialect/mysql-dialect.js +1 -1
  63. package/src/core/db/dialect/oracle-dialect.js +1 -1
  64. package/src/core/db/dialect/postgres-dialect.js +1 -1
  65. package/src/core/db/dialect/sqlite-dialect.js +1 -1
  66. package/src/core/db/flatten-helper.js +1 -1
  67. package/src/core/db/query-builder-error.js +1 -1
  68. package/src/core/db/query-builder.js +1 -1
  69. package/src/core/db/relation-helper.js +1 -1
  70. package/src/core/handlers/delete_handler.js +1 -1
  71. package/src/core/handlers/insert_handler.js +1 -1
  72. package/src/core/handlers/update_handler.js +1 -1
  73. package/src/core/models/base-model.js +1 -1
  74. package/src/core/utils/cache-manager.js +1 -1
  75. package/src/core/utils/component-engine.js +1 -1
  76. package/src/core/utils/context-builder.js +1 -1
  77. package/src/core/utils/datetime-formatter.js +1 -1
  78. package/src/core/utils/datetime-parser.js +1 -1
  79. package/src/core/utils/db.js +1 -1
  80. package/src/core/utils/logger.js +1 -1
  81. package/src/core/utils/payload-loader.js +1 -1
  82. package/src/core/utils/security-checks.js +1 -1
  83. package/src/middleware/body-options.js +1 -1
  84. package/src/middleware/cors.js +1 -1
  85. package/src/middleware/idempotency.js +1 -1
  86. package/src/middleware/rate-limiter.js +1 -1
  87. package/src/middleware/request-logger.js +1 -1
  88. package/src/middleware/security-headers.js +1 -1
  89. package/src/models/base-model-mysql.js +1 -1
  90. package/src/models/base-model-oracle.js +1 -1
  91. package/src/models/base-model-sqlite.js +1 -1
  92. package/src/models/base-model.js +1 -1
  93. package/src/pro/caching/redis-client.js +1 -1
  94. package/src/pro/caching/redis-helper.js +1 -1
  95. package/src/pro/consumers/baseConsumer.js +1 -1
  96. package/src/pro/consumers/declarativeMapper.js +1 -1
  97. package/src/pro/consumers/handlers/apiHandler.js +1 -1
  98. package/src/pro/consumers/handlers/consoleHandler.js +1 -1
  99. package/src/pro/consumers/handlers/databaseHandler.js +1 -1
  100. package/src/pro/consumers/handlers/index.js +1 -1
  101. package/src/pro/consumers/handlers/kafkaHandler.js +1 -1
  102. package/src/pro/consumers/index.js +1 -1
  103. package/src/pro/consumers/messageTransformer.js +1 -1
  104. package/src/pro/consumers/validator.js +1 -1
  105. package/src/pro/database/base-model-mysql.js +1 -1
  106. package/src/pro/database/base-model-oracle.js +1 -1
  107. package/src/pro/database/base-model-sqlite.js +1 -1
  108. package/src/pro/database/db-mysql.js +1 -1
  109. package/src/pro/database/db-oracle.js +1 -1
  110. package/src/pro/database/db-sqlite.js +1 -1
  111. package/src/pro/excel/excel-generator.js +1 -1
  112. package/src/pro/excel/excel-parser.js +1 -1
  113. package/src/pro/excel/export-service.js +1 -1
  114. package/src/pro/excel/export_handler.js +1 -1
  115. package/src/pro/excel/import-service.js +1 -1
  116. package/src/pro/excel/import-validator.js +1 -1
  117. package/src/pro/excel/import_handler.js +1 -1
  118. package/src/pro/excel/upsert-builder.js +1 -1
  119. package/src/pro/idgen/idgen-routes.js +1 -1
  120. package/src/pro/integrations/lookup-resolver.js +1 -1
  121. package/src/pro/integrations/upload-handler-v2.js +1 -1
  122. package/src/pro/integrations/upload-handler.js +1 -1
  123. package/src/pro/integrations/webhook.js +1 -1
  124. package/src/pro/locking/lock-routes.js +1 -1
  125. package/src/pro/locking/resource-lock-manager.js +1 -1
  126. package/src/pro/messaging/kafkaConsumerService.js +1 -1
  127. package/src/pro/messaging/kafkaService.js +1 -1
  128. package/src/pro/messaging/messagehubService.js +1 -1
  129. package/src/pro/messaging/rabbitmqService.js +1 -1
  130. package/src/pro/scheduler/job-manager.js +1 -1
  131. package/src/pro/scheduler/job-routes.js +1 -1
  132. package/src/pro/scheduler/job-validator.js +1 -1
  133. package/src/pro/storage/base-storage-provider.js +1 -1
  134. package/src/pro/storage/file-metadata-helper.js +1 -1
  135. package/src/pro/storage/index.js +1 -1
  136. package/src/pro/storage/local-storage-provider.js +1 -1
  137. package/src/pro/storage/s3-storage-provider.js +1 -1
  138. package/src/pro/storage/upload-cleanup-job.js +1 -1
  139. package/src/pro/storage/upload-cleanup-scheduler.js +1 -1
  140. package/src/pro/storage/upload-pending-tracker.js +1 -1
  141. package/src/pro/websocket/broadcast-helper.js +1 -1
  142. package/src/pro/websocket/index.js +1 -1
  143. package/src/pro/websocket/livesync-server.js +1 -1
  144. package/src/pro/websocket/ws-broadcaster.js +1 -1
  145. package/src/services/export-service.js +1 -1
  146. package/src/services/import-service.js +1 -1
  147. package/src/services/kafkaConsumerService.js +1 -1
  148. package/src/services/kafkaService.js +1 -1
  149. package/src/services/messagehubService.js +1 -1
  150. package/src/services/rabbitmqService.js +1 -1
  151. package/src/utils/cache-invalidation-registry.js +1 -1
  152. package/src/utils/cache-manager.js +1 -1
  153. package/src/utils/component-engine.js +1 -1
  154. package/src/utils/config-extractor.js +1 -1
  155. package/src/utils/consumerLogger.js +1 -1
  156. package/src/utils/context-builder.js +1 -1
  157. package/src/utils/dashboard-helpers.js +1 -1
  158. package/src/utils/dateHelper.js +1 -1
  159. package/src/utils/datetime-formatter.js +1 -1
  160. package/src/utils/datetime-parser.js +1 -1
  161. package/src/utils/db-bootstrap.js +1 -1
  162. package/src/utils/db-mysql.js +1 -1
  163. package/src/utils/db-oracle.js +1 -1
  164. package/src/utils/db-sqlite.js +1 -1
  165. package/src/utils/db.js +1 -1
  166. package/src/utils/demo-generator.js +1 -1
  167. package/src/utils/excel-generator.js +1 -1
  168. package/src/utils/excel-parser.js +1 -1
  169. package/src/utils/file-watcher.js +1 -1
  170. package/src/utils/id-generator.js +1 -1
  171. package/src/utils/idempotency-manager.js +1 -1
  172. package/src/utils/import-validator.js +1 -1
  173. package/src/utils/license-client.js +1 -1
  174. package/src/utils/lock-manager.js +1 -1
  175. package/src/utils/logger.js +1 -1
  176. package/src/utils/lookup-resolver.js +1 -1
  177. package/src/utils/payload-loader.js +1 -1
  178. package/src/utils/processor-response.js +1 -1
  179. package/src/utils/rabbitmq.js +1 -1
  180. package/src/utils/redis-client.js +1 -1
  181. package/src/utils/redis-helper.js +1 -1
  182. package/src/utils/request-scope.js +1 -1
  183. package/src/utils/security-checks.js +1 -1
  184. package/src/utils/service-resolver.js +1 -1
  185. package/src/utils/shutdown-coordinator.js +1 -1
  186. package/src/utils/trusted-keys.js +1 -1
  187. package/src/utils/upload-handler.js +1 -1
  188. package/src/utils/upsert-builder.js +1 -1
  189. package/src/utils/workflow-hook-executor.js +1 -1
  190. package/generators/metadata/global.json +0 -58
  191. package/generators/metadata/test-mysql-workbench.json +0 -118
  192. package/generators/metadata/test-mysql.json +0 -56
  193. package/generators/metadata/test-oracle-workbench.json +0 -118
  194. package/generators/metadata/test-oracle.json +0 -56
  195. package/generators/metadata/test-pg-workbench.json +0 -118
  196. package/generators/metadata/test-pg.json +0 -56
  197. package/generators/scripts/obfuscate-source.js +0 -356
  198. package/generators/scripts/validate-catalog.js +0 -430
  199. package/generators/scripts/validate-dbschema-catalog.js +0 -708
  200. package/generators/tests/baseline/mysql/mini_inventory_item/src/models/mini-inventory/item.js +0 -944
  201. package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
  202. package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory.js +0 -336
  203. package/generators/tests/baseline/oracle/mini_inventory_item/src/models/mini-inventory/item.js +0 -1002
  204. package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
  205. package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory.js +0 -336
  206. package/generators/tests/baseline/postgres/mini_inventory_item/src/models/mini-inventory/item.js +0 -1333
  207. package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory/item.js +0 -1173
  208. package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory.js +0 -496
  209. package/generators/tests/fixtures/payloads/custom-sensitive.json +0 -27
  210. package/generators/tests/fixtures/payloads/dynamic-search-optout.json +0 -23
  211. package/generators/tests/fixtures/payloads/login-with-password.json +0 -22
  212. package/generators/tests/fixtures/payloads/order-process.json +0 -52
  213. package/generators/tests/fixtures/payloads/with-inline-sql.json +0 -26
  214. package/generators/tests/integration-tahap4b/README.md +0 -145
  215. package/generators/tests/integration-tahap4b/run-concurrent.js +0 -77
  216. package/generators/tests/integration-tahap4b/seed.sql +0 -53
  217. package/generators/tests/integration-tahap4b/verify.sql +0 -110
  218. package/generators/tests/unit/cli/create-dashboard.test.js +0 -505
  219. package/generators/tests/unit/cli/create-processor.test.js +0 -319
  220. package/generators/tests/unit/cli/dispatch-dashboard.test.js +0 -149
  221. package/generators/tests/unit/lib/dashboard-generator.test.js +0 -895
  222. package/generators/tests/unit/lib/dashboard-validator.test.js +0 -354
  223. package/generators/tests/unit/lib/dbschema-kit/apply-executor.test.js +0 -437
  224. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-introspect.test.js +0 -393
  225. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-generate-ddl.test.js +0 -104
  226. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-init.test.js +0 -119
  227. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-list.test.js +0 -48
  228. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-migrate.test.js +0 -175
  229. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-validate.test.js +0 -102
  230. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-models.test.js +0 -43
  231. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/all-schemas-listing.js +0 -84
  232. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/connection-error.js +0 -13
  233. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/empty.js +0 -12
  234. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/multi-schema.js +0 -124
  235. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/single-schema-inventory.js +0 -64
  236. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/two-tables.js +0 -66
  237. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/connection-error.js +0 -9
  238. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/partial.js +0 -29
  239. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/rollback.js +0 -26
  240. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/success.js +0 -43
  241. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/audit/events.js +0 -18
  242. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/inventory/products.js +0 -9
  243. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/users.js +0 -8
  244. package/generators/tests/unit/lib/dbschema-kit/connection.test.js +0 -112
  245. package/generators/tests/unit/lib/dbschema-kit/ddl-generator.test.js +0 -205
  246. package/generators/tests/unit/lib/dbschema-kit/define-model.test.js +0 -56
  247. package/generators/tests/unit/lib/dbschema-kit/dialect/index.test.js +0 -46
  248. package/generators/tests/unit/lib/dbschema-kit/dialect/mysql.test.js +0 -126
  249. package/generators/tests/unit/lib/dbschema-kit/dialect/oracle.test.js +0 -126
  250. package/generators/tests/unit/lib/dbschema-kit/dialect/postgres.test.js +0 -131
  251. package/generators/tests/unit/lib/dbschema-kit/dialect/sqlite.test.js +0 -126
  252. package/generators/tests/unit/lib/dbschema-kit/driver-loader.test.js +0 -93
  253. package/generators/tests/unit/lib/dbschema-kit/emitters/create-index.test.js +0 -173
  254. package/generators/tests/unit/lib/dbschema-kit/emitters/create-table.test.js +0 -376
  255. package/generators/tests/unit/lib/dbschema-kit/emitters/drop-table.test.js +0 -78
  256. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/invalid-dialect.env +0 -6
  257. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-dialect.env +0 -5
  258. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-host.env +0 -5
  259. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/oracle-valid.env +0 -6
  260. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/postgres-valid.env +0 -7
  261. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/sqlite-valid.env +0 -2
  262. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/category.js +0 -11
  263. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/item_product.js +0 -11
  264. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound.js +0 -24
  265. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound_item.js +0 -28
  266. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/supplier.js +0 -9
  267. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/warehouse.js +0 -9
  268. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-invalid/orphan.js +0 -17
  269. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/category.js +0 -11
  270. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/item_product.js +0 -11
  271. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/supplier.js +0 -9
  272. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/warehouse.js +0 -9
  273. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound.js +0 -24
  274. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound_item.js +0 -28
  275. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/audit/events.js +0 -18
  276. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/inventory/products.js +0 -9
  277. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/public/users.js +0 -9
  278. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/extra/category.js +0 -8
  279. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/master/category.js +0 -8
  280. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/bar.js +0 -8
  281. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/foo.js +0 -8
  282. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/empty-folder/README.md +0 -1
  283. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-export/plain.js +0 -3
  284. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-schema/bad.js +0 -6
  285. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/legacy-pattern/legacy.js +0 -12
  286. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/audit/products.js +0 -9
  287. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/inventory/products.js +0 -9
  288. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/a/products.js +0 -8
  289. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/b/products.js +0 -8
  290. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/nested-deep/a/b/c/deep_table.js +0 -8
  291. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/.hidden/ignored.js +0 -7
  292. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/category.js +0 -8
  293. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/supplier.js +0 -8
  294. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound.js +0 -8
  295. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound_item.js +0 -8
  296. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/category.js +0 -8
  297. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/item_product.js +0 -9
  298. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-single/category.js +0 -8
  299. package/generators/tests/unit/lib/dbschema-kit/integration.test.js +0 -217
  300. package/generators/tests/unit/lib/dbschema-kit/introspect-mapper.test.js +0 -403
  301. package/generators/tests/unit/lib/dbschema-kit/ir-builder.test.js +0 -390
  302. package/generators/tests/unit/lib/dbschema-kit/loader.test.js +0 -128
  303. package/generators/tests/unit/lib/dbschema-kit/naming.test.js +0 -170
  304. package/generators/tests/unit/lib/dbschema-kit/parser/shorthand-parser.test.js +0 -237
  305. package/generators/tests/unit/lib/dbschema-kit/schema-printer.test.js +0 -251
  306. package/generators/tests/unit/lib/dbschema-kit/statement-modifier.test.js +0 -105
  307. package/generators/tests/unit/lib/dbschema-kit/statement-splitter.test.js +0 -165
  308. package/generators/tests/unit/lib/dbschema-kit/topological-sort.test.js +0 -135
  309. package/generators/tests/unit/lib/dbschema-kit/validator/check-compatibility-validator.test.js +0 -373
  310. package/generators/tests/unit/lib/dbschema-kit/validator/circular-relation-validator.test.js +0 -454
  311. package/generators/tests/unit/lib/dbschema-kit/validator/cross-model-validator.test.js +0 -512
  312. package/generators/tests/unit/lib/dbschema-kit/validator/enhanced-validate-integration.test.js +0 -390
  313. package/generators/tests/unit/lib/dbschema-kit/validator/naming-convention-validator.test.js +0 -306
  314. package/generators/tests/unit/lib/dbschema-kit/validator/schema-validator.test.js +0 -443
  315. package/generators/tests/unit/lib/dbschema-kit/validator/type-compatibility-validator.test.js +0 -440
  316. package/generators/tests/unit/lib/dbschema-kit/validator/validator-reporter.test.js +0 -172
  317. package/generators/tests/unit/lib/metadata-manager-dashboard.test.js +0 -256
  318. package/generators/tests/unit/lib/payload-validator-fieldpolicy.test.js +0 -240
  319. package/generators/tests/unit/lib/processor-validation-generator.test.js +0 -300
  320. package/generators/tests/unit/lib/sensitive-field-masker.test.js +0 -170
  321. package/generators/tests/unit/lib/sql-table-extractor.test.js +0 -119
  322. package/scripts/generate-integrity-manifest.js +0 -124
  323. package/scripts/snapshot-cli-contracts.js +0 -194
  324. package/scripts/verify-publish.js +0 -56
@@ -1,489 +1 @@
1
- 'use strict';
2
-
3
- /**
4
- * Authoritative source for dbschema-catalog content.
5
- * Used by:
6
- * - cli/dbschema-catalog.js (CLI introspection command)
7
- * - (future) MCP server tool for dbschema-kit grounding
8
- *
9
- * SINGLE SOURCE OF TRUTH: Modify only this file when adding/changing
10
- * dbschema-kit defineModel API spec. Keep in sync with:
11
- * - lib/dbschema-kit/define-model.js
12
- * - lib/dbschema-kit/parser/shorthand-parser.js
13
- * - lib/dbschema-kit/validator/schema-validator.js
14
- * - lib/dbschema-kit/validator/cross-model-validator.js
15
- * - lib/dbschema-kit/ir-builder.js
16
- * - lib/dbschema-kit/naming.js
17
- *
18
- * Reference: docs/schema-definition.md (single source of truth, human-readable)
19
- *
20
- * @module lib/templates/dbschema-catalog
21
- */
22
-
23
- const SCHEMA_VERSION = '1.0';
24
- const SOURCE = 'dbschema-catalog';
25
- const DOCUMENTATION_URL = 'https://restforge.dev/docs/cli/schema-definition';
26
-
27
- // ============================================================================
28
- // DEFINE MODEL OPTIONS
29
- // ============================================================================
30
-
31
- // Note: defineModel signature is `defineModel(tableName, options)`.
32
- // `tableName` is a positional first argument (snake_case), not a property of `options`.
33
- // Schema files use factory pattern:
34
- // module.exports = ({ defineModel }) => defineModel('table_name', { fields: { ... } });
35
- // Auto-derive from filename happens at the CLI loader level, not in defineModel itself.
36
- const DEFINE_MODEL_OPTIONS = [
37
- {
38
- name: 'schema',
39
- required: false,
40
- type: 'string|null',
41
- description: 'Database schema namespace (multi-schema database).',
42
- notes: 'null or empty string means default schema.'
43
- },
44
- {
45
- name: 'fields',
46
- required: true,
47
- type: 'object',
48
- description: 'Object of field definitions in shorthand string format.',
49
- example: '{ id: "string:36 pk", name: "string:255 notnull" }'
50
- },
51
- {
52
- name: 'primaryKey',
53
- required: false,
54
- type: 'string|array',
55
- description: 'Override primary key. Single field name or composite array.',
56
- notes: 'Auto-detected from field shorthand "pk" when not specified.'
57
- },
58
- {
59
- name: 'relations',
60
- required: false,
61
- type: 'object',
62
- description: 'Inter-table relations (belongsTo, hasOne, hasMany).',
63
- example: '{ category: { type: "belongsTo", references: "category(id)" } }'
64
- },
65
- {
66
- name: 'indexes',
67
- required: false,
68
- type: 'array',
69
- description: 'Non-unique indexes. Each entry is array of column names or object { name, columns }.',
70
- example: '[["status", "created_at"]]'
71
- },
72
- {
73
- name: 'uniques',
74
- required: false,
75
- type: 'array',
76
- description: 'Unique constraints (single or composite).',
77
- example: '[["category_code"], ["tenant_id", "category_code"]]'
78
- },
79
- {
80
- name: 'checks',
81
- required: false,
82
- type: 'array',
83
- description: 'CHECK constraints. Each entry uses operator-as-key shape: { name?, field, <operator>: <value> } where <operator> is one of checkOperations (in, eq, neq, gt, gte, lt, lte). The internal IR shape after ir-builder normalization is { name?, field, op, value }, but that is NOT the user input format.',
84
- example: '[{ field: "status", in: ["active", "inactive"] }, { field: "qty", gte: 0 }]'
85
- }
86
- ];
87
-
88
- // ============================================================================
89
- // FIELD TYPES (10 entries)
90
- // Source: lib/dbschema-kit/parser/shorthand-parser.js (VALID_TYPES)
91
- // ============================================================================
92
-
93
- const FIELD_TYPES = [
94
- {
95
- name: 'string',
96
- description: 'Variable-length text. Length modifier required.',
97
- requiresModifier: true,
98
- modifierFormat: 'string:<length>',
99
- example: 'string:255',
100
- notes: 'Explicit length required for cross-dialect portability.'
101
- },
102
- {
103
- name: 'text',
104
- description: 'Long-form text without length limit (TEXT/CLOB).',
105
- requiresModifier: false,
106
- example: 'text'
107
- },
108
- {
109
- name: 'integer',
110
- description: '32-bit signed integer (INT/INTEGER).',
111
- requiresModifier: false,
112
- example: 'integer'
113
- },
114
- {
115
- name: 'bigint',
116
- description: '64-bit signed integer (BIGINT).',
117
- requiresModifier: false,
118
- example: 'bigint'
119
- },
120
- {
121
- name: 'decimal',
122
- description: 'Fixed-point decimal. Precision and scale required.',
123
- requiresModifier: true,
124
- modifierFormat: 'decimal:<precision>,<scale>',
125
- example: 'decimal:15,2',
126
- notes: 'Precision and scale required for cross-dialect portability.'
127
- },
128
- {
129
- name: 'boolean',
130
- description: 'Boolean value (native BOOLEAN on PostgreSQL, VARCHAR on others).',
131
- requiresModifier: false,
132
- example: 'boolean'
133
- },
134
- {
135
- name: 'date',
136
- description: 'Date only (no time component).',
137
- requiresModifier: false,
138
- example: 'date'
139
- },
140
- {
141
- name: 'timestamp',
142
- description: 'Date and time (TIMESTAMP).',
143
- requiresModifier: false,
144
- example: 'timestamp',
145
- notes: 'Default timezone behavior is dialect-specific.'
146
- },
147
- {
148
- name: 'uuid',
149
- description: 'UUID. Native UUID on PostgreSQL, VARCHAR(36) on others.',
150
- requiresModifier: false,
151
- example: 'uuid'
152
- },
153
- {
154
- name: 'json',
155
- description: 'JSON column (JSONB on PostgreSQL, JSON on MySQL, CLOB on Oracle).',
156
- requiresModifier: false,
157
- example: 'json'
158
- }
159
- ];
160
-
161
- // ============================================================================
162
- // CONSTRAINTS (shorthand)
163
- // Source: lib/dbschema-kit/parser/shorthand-parser.js
164
- // STANDALONE_CONSTRAINTS, VALUE_CONSTRAINTS
165
- // ============================================================================
166
-
167
- const CONSTRAINTS = [
168
- {
169
- name: 'pk',
170
- kind: 'standalone',
171
- description: 'Marks field as primary key.',
172
- example: 'string:36 pk'
173
- },
174
- {
175
- name: 'notnull',
176
- kind: 'standalone',
177
- description: 'NOT NULL constraint.',
178
- example: 'string:255 notnull'
179
- },
180
- {
181
- name: 'unique',
182
- kind: 'standalone',
183
- description: 'Single-column unique constraint.',
184
- example: 'string:32 unique'
185
- },
186
- {
187
- name: 'index',
188
- kind: 'standalone',
189
- description: 'Single-column non-unique index.',
190
- example: 'string:64 index'
191
- },
192
- {
193
- name: 'autoUpdate',
194
- kind: 'standalone',
195
- description: 'Marker for audit timestamp columns. RESTForge generator injects this column = <native_now> on every UPDATE statement.',
196
- example: 'timestamp autoUpdate',
197
- notes: 'Only valid for type \'timestamp\' or \'date\'. Cannot coexist with \'default:\' constraint. Pre-processed in ir-builder before parser.'
198
- },
199
- {
200
- name: 'default',
201
- kind: 'value',
202
- description: 'Default value. Single-quoted for strings, raw for numeric/boolean, bare identifier for SQL constants, identifier() for native function calls.',
203
- valueFormat: "default:<literal> | default:'<string>' | default:<constant> | default:<function>()",
204
- example: 'boolean default:true'
205
- },
206
- {
207
- name: 'fk',
208
- kind: 'value',
209
- description: 'Foreign key reference. Auto-generates a belongsTo relation entry.',
210
- valueFormat: 'fk:<table>.<column>',
211
- example: 'string:36 fk:category.id',
212
- notes: 'Cannot coexist with explicit relation entry referencing the same field.'
213
- }
214
- ];
215
-
216
- // ============================================================================
217
- // RELATION TYPES
218
- // Source: lib/dbschema-kit/validator/schema-validator.js (VALID_RELATION_TYPES)
219
- // ============================================================================
220
-
221
- const RELATION_TYPES = [
222
- {
223
- name: 'belongsTo',
224
- description: 'Many-to-one. This table holds the FK column referencing the parent table.',
225
- requiredFields: ['type', 'localKey', 'references'],
226
- optionalFields: ['target', 'onDelete', 'onUpdate'],
227
- example: '{ type: "belongsTo", localKey: "category_id", references: "category_id", onDelete: "restrict" }',
228
- notes: '`references` is the bare column name in the target table. Target table is auto-derived from the relation key name, or override with `target`.'
229
- },
230
- {
231
- name: 'hasOne',
232
- description: 'One-to-one (inverse of belongsTo). Optional inverse declaration on the parent side; does not affect DDL.',
233
- requiredFields: ['type', 'localKey', 'references'],
234
- optionalFields: ['target', 'onDelete', 'onUpdate'],
235
- example: '{ type: "hasOne", target: "profile", localKey: "user_id", references: "user_id" }'
236
- },
237
- {
238
- name: 'hasMany',
239
- description: 'One-to-many (inverse of belongsTo). Optional inverse declaration on the parent side; does not affect DDL.',
240
- requiredFields: ['type', 'localKey', 'references'],
241
- optionalFields: ['target', 'onDelete', 'onUpdate'],
242
- example: '{ type: "hasMany", target: "order_item", localKey: "order_id", references: "order_id" }'
243
- }
244
- ];
245
-
246
- // ============================================================================
247
- // REFERENTIAL ACTIONS (onDelete / onUpdate)
248
- // Source: lib/dbschema-kit/validator/schema-validator.js (VALID_REFERENTIAL_ACTIONS)
249
- // ============================================================================
250
-
251
- const REFERENTIAL_ACTIONS = [
252
- {
253
- name: 'cascade',
254
- description: 'Cascade delete/update to child rows.',
255
- appliesTo: ['onDelete', 'onUpdate']
256
- },
257
- {
258
- name: 'restrict',
259
- description: 'Reject delete/update when child rows exist.',
260
- appliesTo: ['onDelete', 'onUpdate']
261
- },
262
- {
263
- name: 'setNull',
264
- description: 'Set FK column to NULL on child rows.',
265
- appliesTo: ['onDelete', 'onUpdate'],
266
- notes: 'FK field must be nullable.'
267
- },
268
- {
269
- name: 'noAction',
270
- description: 'Defer constraint check (semantically similar to restrict on most dialects).',
271
- appliesTo: ['onDelete', 'onUpdate']
272
- }
273
- ];
274
-
275
- // ============================================================================
276
- // CHECK OPERATIONS
277
- // Source: lib/dbschema-kit/ir-builder.js (VALID_CHECK_OPS)
278
- // ============================================================================
279
-
280
- const CHECK_OPERATIONS = [
281
- {
282
- name: 'in',
283
- description: 'Value must be one of a list.',
284
- valueType: 'array',
285
- example: '{ field: "status", in: ["active", "inactive"] }'
286
- },
287
- {
288
- name: 'eq',
289
- description: 'Equal to.',
290
- valueType: 'scalar',
291
- example: '{ field: "type", eq: "user" }'
292
- },
293
- {
294
- name: 'neq',
295
- description: 'Not equal to.',
296
- valueType: 'scalar',
297
- example: '{ field: "type", neq: "system" }'
298
- },
299
- {
300
- name: 'gt',
301
- description: 'Greater than.',
302
- valueType: 'numeric',
303
- example: '{ field: "qty", gt: 0 }'
304
- },
305
- {
306
- name: 'gte',
307
- description: 'Greater than or equal to.',
308
- valueType: 'numeric',
309
- example: '{ field: "qty", gte: 0 }'
310
- },
311
- {
312
- name: 'lt',
313
- description: 'Less than.',
314
- valueType: 'numeric',
315
- example: '{ field: "discount", lt: 100 }'
316
- },
317
- {
318
- name: 'lte',
319
- description: 'Less than or equal to.',
320
- valueType: 'numeric',
321
- example: '{ field: "discount", lte: 100 }'
322
- }
323
- ];
324
-
325
- // ============================================================================
326
- // AUDIT COLUMNS CONVENTION
327
- // Cross-reference: lib/templates/field-validation-catalog.js (AUDIT_COLUMNS)
328
- // ============================================================================
329
-
330
- const AUDIT_COLUMNS = {
331
- description: 'Standard 4-column audit convention for tables managed by RESTForge. The same convention is documented in field-validation:catalog (auditColumns section) for the RDF/backend layer. SDF and RDF stay aligned when both declare these 4 columns.',
332
- columns: [
333
- {
334
- name: 'created_at',
335
- shorthand: 'timestamp default:now()',
336
- nullable: true,
337
- purpose: 'Record creation timestamp. Auto-set on INSERT via DEFAULT now(). Native function translates per dialect (postgres: CURRENT_TIMESTAMP, mysql: NOW(), oracle: SYSTIMESTAMP, sqlite: CURRENT_TIMESTAMP).'
338
- },
339
- {
340
- name: 'created_by',
341
- shorthand: 'string:100',
342
- nullable: true,
343
- purpose: 'User identifier (username, user_id, or composite token) of the record creator. Set by application layer on INSERT, not by database default.'
344
- },
345
- {
346
- name: 'updated_at',
347
- shorthand: 'timestamp autoUpdate',
348
- nullable: true,
349
- purpose: 'Last modification timestamp. autoUpdate is a marker constraint — the RESTForge generator injects updated_at = <native_now> into every UPDATE statement. Initial INSERT value is the application layer responsibility.'
350
- },
351
- {
352
- name: 'updated_by',
353
- shorthand: 'string:100',
354
- nullable: true,
355
- purpose: 'User identifier of the last modifier. Set by application layer on UPDATE, not by database default.'
356
- }
357
- ],
358
- convention: {
359
- emitInSkeleton: 'Yes — dbschema:init emits all 4 columns by default. Tables that do not need audit (lookup tables, system tables) can manually remove these fields from the generated skeleton.',
360
- nullablePolicy: 'All 4 columns are nullable. The created_by/updated_by columns may be empty for rows inserted by system seeds, migrations, or batch imports that do not have a user context.',
361
- relationToRdf: 'The RDF generator (codegen_create_endpoint) assumes these 4 columns exist when the payload.auditColumns key is absent. See field-validation:catalog auditColumns for the RDF-side behavior. Drift between SDF (missing audit columns) and RDF (assumes audit columns) causes runtime errors when the generated endpoint tries to write created_by/updated_by to a non-existent column.'
362
- }
363
- };
364
-
365
- // ============================================================================
366
- // SHORTHAND SYNTAX
367
- // Source: lib/dbschema-kit/parser/shorthand-parser.js
368
- // ============================================================================
369
-
370
- const SHORTHAND_SYNTAX = {
371
- format: '<type>[:<modifier>] [<constraint>[:<value>]]...',
372
- description: 'String shorthand for field definition. Type required at start, followed by optional modifier and space-separated constraints.',
373
- rules: [
374
- 'Type is mandatory at the beginning and must be one of fieldTypes.',
375
- 'Modifier is mandatory for type "string" (length) and "decimal" (precision,scale).',
376
- 'Standalone constraints (pk, notnull, unique, index, autoUpdate) take no value. autoUpdate is pre-processed in ir-builder before parser tokenization.',
377
- 'Value constraints (default, fk) require constraint:value format.',
378
- 'Default value format depends on type: raw for boolean (default:true), raw for integer (default:0), single-quoted for string (default:\'value\'), bare identifier for SQL constants (default:current_date), identifier() for native function calls (default:now()).',
379
- 'Foreign key uses dot notation: fk:<table>.<column> (e.g., fk:category.id). The parser rejects parentheses syntax.'
380
- ],
381
- examples: [
382
- { input: 'string:36 pk', meaning: 'VARCHAR(36) PRIMARY KEY' },
383
- { input: 'string:255 notnull', meaning: 'VARCHAR(255) NOT NULL' },
384
- { input: 'decimal:15,2 notnull default:0', meaning: 'DECIMAL(15,2) NOT NULL DEFAULT 0' },
385
- { input: 'boolean default:true', meaning: 'BOOLEAN DEFAULT TRUE' },
386
- { input: "string:100 default:'pending'", meaning: "VARCHAR(100) DEFAULT 'pending'" },
387
- { input: 'timestamp default:now()', meaning: 'TIMESTAMP DEFAULT <native_now per dialect>' },
388
- { input: 'timestamp autoUpdate', meaning: 'TIMESTAMP (generator injects = <native_now> on UPDATE)' },
389
- { input: 'string:36 fk:category.id', meaning: 'VARCHAR(36) with FK to category(id), auto belongsTo relation' },
390
- { input: 'string:64 index', meaning: 'VARCHAR(64) with single-column index' }
391
- ]
392
- };
393
-
394
- // ============================================================================
395
- // NAMING RULES
396
- // Source: lib/dbschema-kit/naming.js, validator/schema-validator.js
397
- // ============================================================================
398
-
399
- const NAMING_RULES = {
400
- tableName: {
401
- format: 'snake_case',
402
- description: 'Table name must be lowercase, digits, and underscores only.'
403
- },
404
- fieldName: {
405
- format: 'snake_case',
406
- description: 'Column name must be snake_case.'
407
- },
408
- constraintName: {
409
- format: '<prefix>_<table>_<suffix>',
410
- defaultMaxLength: 30,
411
- fallbackStrategy: 'MD5 hash 8-character suffix when name exceeds maxLength',
412
- description: 'Constraint names auto-generated with type-specific prefix (pk, fk, idx, uq, ck) and dialect-specific max length.'
413
- },
414
- compositeShortName: {
415
- description: 'For composite indexes/uniques, name is derived by joining columns with underscore and truncating when needed.'
416
- }
417
- };
418
-
419
- // ============================================================================
420
- // DIALECT SUPPORT
421
- // Source: lib/dbschema-kit/dialect/{postgres,mysql,oracle,sqlite}.js
422
- // ============================================================================
423
-
424
- const DIALECT_SUPPORT = [
425
- {
426
- name: 'postgres',
427
- driver: 'pg',
428
- booleanStorage: 'native BOOLEAN'
429
- },
430
- {
431
- name: 'mysql',
432
- driver: 'mysql2',
433
- booleanStorage: 'VARCHAR (literal "true"/"false")'
434
- },
435
- {
436
- name: 'oracle',
437
- driver: 'oracledb',
438
- booleanStorage: 'VARCHAR2 with CHECK constraint'
439
- },
440
- {
441
- name: 'sqlite',
442
- driver: 'better-sqlite3',
443
- booleanStorage: 'TEXT'
444
- }
445
- ];
446
-
447
- // ============================================================================
448
- // EXPORT
449
- // ============================================================================
450
-
451
- const DBSCHEMA_CATALOG = {
452
- schemaVersion: SCHEMA_VERSION,
453
- source: SOURCE,
454
- summary: {
455
- totalDefineModelOptions: DEFINE_MODEL_OPTIONS.length,
456
- totalFieldTypes: FIELD_TYPES.length,
457
- totalConstraints: CONSTRAINTS.length,
458
- totalRelationTypes: RELATION_TYPES.length,
459
- totalReferentialActions: REFERENTIAL_ACTIONS.length,
460
- totalCheckOperations: CHECK_OPERATIONS.length,
461
- totalAuditColumns: AUDIT_COLUMNS.columns.length,
462
- totalDialects: DIALECT_SUPPORT.length
463
- },
464
- defineModelOptions: DEFINE_MODEL_OPTIONS,
465
- fieldTypes: FIELD_TYPES,
466
- constraints: CONSTRAINTS,
467
- relationTypes: RELATION_TYPES,
468
- referentialActions: REFERENTIAL_ACTIONS,
469
- checkOperations: CHECK_OPERATIONS,
470
- auditColumns: AUDIT_COLUMNS,
471
- shorthandSyntax: SHORTHAND_SYNTAX,
472
- namingRules: NAMING_RULES,
473
- dialectSupport: DIALECT_SUPPORT,
474
- documentationUrl: DOCUMENTATION_URL
475
- };
476
-
477
- module.exports = {
478
- DBSCHEMA_CATALOG,
479
- DEFINE_MODEL_OPTIONS,
480
- FIELD_TYPES,
481
- CONSTRAINTS,
482
- RELATION_TYPES,
483
- REFERENTIAL_ACTIONS,
484
- CHECK_OPERATIONS,
485
- AUDIT_COLUMNS,
486
- SHORTHAND_SYNTAX,
487
- NAMING_RULES,
488
- DIALECT_SUPPORT
489
- };
1
+ 'use strict';const a0_0x590179=a0_0x2390;(function(_0x5c0dda,_0x3533bf){const _0x6a2875=a0_0x2390,_0x5129e3=_0x5c0dda();while(!![]){try{const _0x298d58=-parseInt(_0x6a2875(0x24a))/0x1+-parseInt(_0x6a2875(0x221))/0x2*(-parseInt(_0x6a2875(0x229))/0x3)+-parseInt(_0x6a2875(0x205))/0x4*(-parseInt(_0x6a2875(0x1f7))/0x5)+parseInt(_0x6a2875(0x1f6))/0x6+-parseInt(_0x6a2875(0x235))/0x7*(-parseInt(_0x6a2875(0x252))/0x8)+parseInt(_0x6a2875(0x238))/0x9*(-parseInt(_0x6a2875(0x224))/0xa)+-parseInt(_0x6a2875(0x1f1))/0xb;if(_0x298d58===_0x3533bf)break;else _0x5129e3['push'](_0x5129e3['shift']());}catch(_0x1aa027){_0x5129e3['push'](_0x5129e3['shift']());}}}(a0_0x1242,0x9a38f));const SCHEMA_VERSION='1.0',SOURCE='dbschema-catalog',DOCUMENTATION_URL=a0_0x590179(0x20a),DEFINE_MODEL_OPTIONS=[{'name':'schema','required':![],'type':a0_0x590179(0x236),'description':a0_0x590179(0x219),'notes':a0_0x590179(0x255)},{'name':a0_0x590179(0x21a),'required':!![],'type':a0_0x590179(0x20e),'description':a0_0x590179(0x22c),'example':a0_0x590179(0x258)},{'name':'primaryKey','required':![],'type':a0_0x590179(0x24e),'description':a0_0x590179(0x203),'notes':'Auto-detected\x20from\x20field\x20shorthand\x20\x22pk\x22\x20when\x20not\x20specified.'},{'name':'relations','required':![],'type':'object','description':'Inter-table\x20relations\x20(belongsTo,\x20hasOne,\x20hasMany).','example':'{\x20category:\x20{\x20type:\x20\x22belongsTo\x22,\x20references:\x20\x22category(id)\x22\x20}\x20}'},{'name':'indexes','required':![],'type':a0_0x590179(0x1fd),'description':a0_0x590179(0x23a),'example':'[[\x22status\x22,\x20\x22created_at\x22]]'},{'name':a0_0x590179(0x20b),'required':![],'type':'array','description':a0_0x590179(0x1ed),'example':'[[\x22category_code\x22],\x20[\x22tenant_id\x22,\x20\x22category_code\x22]]'},{'name':a0_0x590179(0x245),'required':![],'type':a0_0x590179(0x1fd),'description':'CHECK\x20constraints.\x20Each\x20entry\x20uses\x20operator-as-key\x20shape:\x20{\x20name?,\x20field,\x20<operator>:\x20<value>\x20}\x20where\x20<operator>\x20is\x20one\x20of\x20checkOperations\x20(in,\x20eq,\x20neq,\x20gt,\x20gte,\x20lt,\x20lte).\x20The\x20internal\x20IR\x20shape\x20after\x20ir-builder\x20normalization\x20is\x20{\x20name?,\x20field,\x20op,\x20value\x20},\x20but\x20that\x20is\x20NOT\x20the\x20user\x20input\x20format.','example':a0_0x590179(0x21f)}],FIELD_TYPES=[{'name':a0_0x590179(0x23b),'description':'Variable-length\x20text.\x20Length\x20modifier\x20required.','requiresModifier':!![],'modifierFormat':a0_0x590179(0x1f8),'example':a0_0x590179(0x246),'notes':a0_0x590179(0x1f5)},{'name':'text','description':'Long-form\x20text\x20without\x20length\x20limit\x20(TEXT/CLOB).','requiresModifier':![],'example':'text'},{'name':a0_0x590179(0x23c),'description':a0_0x590179(0x1ef),'requiresModifier':![],'example':a0_0x590179(0x23c)},{'name':a0_0x590179(0x1ee),'description':a0_0x590179(0x216),'requiresModifier':![],'example':a0_0x590179(0x1ee)},{'name':'decimal','description':'Fixed-point\x20decimal.\x20Precision\x20and\x20scale\x20required.','requiresModifier':!![],'modifierFormat':a0_0x590179(0x22e),'example':'decimal:15,2','notes':a0_0x590179(0x202)},{'name':'boolean','description':a0_0x590179(0x247),'requiresModifier':![],'example':'boolean'},{'name':a0_0x590179(0x218),'description':a0_0x590179(0x230),'requiresModifier':![],'example':a0_0x590179(0x218)},{'name':a0_0x590179(0x212),'description':'Date\x20and\x20time\x20(TIMESTAMP).','requiresModifier':![],'example':'timestamp','notes':a0_0x590179(0x226)},{'name':'uuid','description':'UUID.\x20Native\x20UUID\x20on\x20PostgreSQL,\x20VARCHAR(36)\x20on\x20others.','requiresModifier':![],'example':'uuid'},{'name':a0_0x590179(0x22a),'description':a0_0x590179(0x1e0),'requiresModifier':![],'example':a0_0x590179(0x22a)}],CONSTRAINTS=[{'name':'pk','kind':a0_0x590179(0x23f),'description':a0_0x590179(0x1fb),'example':a0_0x590179(0x21e)},{'name':'notnull','kind':'standalone','description':'NOT\x20NULL\x20constraint.','example':'string:255\x20notnull'},{'name':'unique','kind':'standalone','description':'Single-column\x20unique\x20constraint.','example':'string:32\x20unique'},{'name':a0_0x590179(0x21c),'kind':a0_0x590179(0x23f),'description':a0_0x590179(0x1fa),'example':'string:64\x20index'},{'name':a0_0x590179(0x20d),'kind':'standalone','deprecated':!![],'description':'DEPRECATED:\x20This\x20modifier\x20no\x20longer\x20has\x20functional\x20effect\x20at\x20the\x20DDL\x20or\x20runtime\x20level.\x20Auto-update\x20for\x20updated_at\x20is\x20handled\x20by\x20the\x20RDF\x20layer\x20(auditColumns\x20convention\x20in\x20BaseModel\x20runtime)\x20based\x20on\x20field\x20naming\x20convention,\x20not\x20by\x20this\x20SDF\x20marker.\x20Existing\x20usage\x20is\x20preserved\x20for\x20backward\x20compatibility\x20but\x20should\x20be\x20removed\x20from\x20new\x20templates.','example':'timestamp','notes':'Engine\x20still\x20parses\x20this\x20token\x20(backward\x20compatibility),\x20but\x20DDL\x20output\x20is\x20identical\x20to\x20plain\x20\x27timestamp\x27.\x20Use\x20\x27timestamp\x27\x20alone.\x20The\x20actual\x20auto-update\x20behavior\x20is\x20documented\x20in\x20the\x20RDF\x20auditColumns\x20catalog\x20(field-validation:catalog).'},{'name':a0_0x590179(0x204),'kind':'value','description':a0_0x590179(0x23d),'valueFormat':'default:<literal>\x20|\x20default:\x27<string>\x27\x20|\x20default:<constant>\x20|\x20default:<function>()','example':a0_0x590179(0x231)},{'name':'fk','kind':a0_0x590179(0x215),'description':'Foreign\x20key\x20reference.\x20Auto-generates\x20a\x20belongsTo\x20relation\x20entry.','valueFormat':a0_0x590179(0x248),'example':'string:36\x20fk:category.id','notes':'Cannot\x20coexist\x20with\x20explicit\x20relation\x20entry\x20referencing\x20the\x20same\x20field.'}],RELATION_TYPES=[{'name':a0_0x590179(0x1f2),'description':'Many-to-one.\x20This\x20table\x20holds\x20the\x20FK\x20column\x20referencing\x20the\x20parent\x20table.','requiredFields':[a0_0x590179(0x209),'localKey','references'],'optionalFields':[a0_0x590179(0x23e),a0_0x590179(0x214),a0_0x590179(0x208)],'example':a0_0x590179(0x1f4),'notes':a0_0x590179(0x1e4)},{'name':'hasOne','description':'One-to-one\x20(inverse\x20of\x20belongsTo).\x20Optional\x20inverse\x20declaration\x20on\x20the\x20parent\x20side;\x20does\x20not\x20affect\x20DDL.','requiredFields':[a0_0x590179(0x209),a0_0x590179(0x241),a0_0x590179(0x249)],'optionalFields':['target','onDelete',a0_0x590179(0x208)],'example':'{\x20type:\x20\x22hasOne\x22,\x20target:\x20\x22profile\x22,\x20localKey:\x20\x22user_id\x22,\x20references:\x20\x22user_id\x22\x20}'},{'name':'hasMany','description':a0_0x590179(0x20f),'requiredFields':['type','localKey',a0_0x590179(0x249)],'optionalFields':[a0_0x590179(0x23e),'onDelete',a0_0x590179(0x208)],'example':a0_0x590179(0x228)}],REFERENTIAL_ACTIONS=[{'name':'cascade','description':a0_0x590179(0x257),'appliesTo':['onDelete','onUpdate']},{'name':a0_0x590179(0x1f9),'description':a0_0x590179(0x200),'appliesTo':['onDelete','onUpdate']},{'name':a0_0x590179(0x244),'description':a0_0x590179(0x1e2),'appliesTo':['onDelete','onUpdate'],'notes':'FK\x20field\x20must\x20be\x20nullable.'},{'name':a0_0x590179(0x1fc),'description':a0_0x590179(0x237),'appliesTo':[a0_0x590179(0x214),a0_0x590179(0x208)]}],CHECK_OPERATIONS=[{'name':'in','description':'Value\x20must\x20be\x20one\x20of\x20a\x20list.','valueType':'array','example':'{\x20field:\x20\x22status\x22,\x20in:\x20[\x22active\x22,\x20\x22inactive\x22]\x20}'},{'name':'eq','description':a0_0x590179(0x1e6),'valueType':'scalar','example':'{\x20field:\x20\x22type\x22,\x20eq:\x20\x22user\x22\x20}'},{'name':a0_0x590179(0x232),'description':a0_0x590179(0x256),'valueType':a0_0x590179(0x254),'example':a0_0x590179(0x227)},{'name':'gt','description':a0_0x590179(0x223),'valueType':'numeric','example':a0_0x590179(0x20c)},{'name':a0_0x590179(0x1e1),'description':'Greater\x20than\x20or\x20equal\x20to.','valueType':a0_0x590179(0x24f),'example':a0_0x590179(0x21b)},{'name':'lt','description':a0_0x590179(0x22b),'valueType':'numeric','example':a0_0x590179(0x217)},{'name':a0_0x590179(0x1ea),'description':a0_0x590179(0x201),'valueType':a0_0x590179(0x24f),'example':a0_0x590179(0x242)}],AUDIT_COLUMNS={'description':a0_0x590179(0x21d),'columns':[{'name':a0_0x590179(0x22f),'shorthand':'timestamp\x20default:now()','nullable':!![],'purpose':a0_0x590179(0x239)},{'name':'created_by','shorthand':'string:100','nullable':!![],'purpose':'User\x20identifier\x20(username,\x20user_id,\x20or\x20composite\x20token)\x20of\x20the\x20record\x20creator.\x20Set\x20by\x20application\x20layer\x20on\x20INSERT,\x20not\x20by\x20database\x20default.'},{'name':'updated_at','shorthand':a0_0x590179(0x212),'nullable':!![],'purpose':a0_0x590179(0x1ec)},{'name':a0_0x590179(0x206),'shorthand':a0_0x590179(0x234),'nullable':!![],'purpose':a0_0x590179(0x222)}],'convention':{'emitInSkeleton':a0_0x590179(0x225),'nullablePolicy':'All\x204\x20columns\x20are\x20nullable.\x20The\x20created_by/updated_by\x20columns\x20may\x20be\x20empty\x20for\x20rows\x20inserted\x20by\x20system\x20seeds,\x20migrations,\x20or\x20batch\x20imports\x20that\x20do\x20not\x20have\x20a\x20user\x20context.','relationToRdf':a0_0x590179(0x220)}},SHORTHAND_SYNTAX={'format':a0_0x590179(0x1e8),'description':a0_0x590179(0x24c),'rules':['Type\x20is\x20mandatory\x20at\x20the\x20beginning\x20and\x20must\x20be\x20one\x20of\x20fieldTypes.','Modifier\x20is\x20mandatory\x20for\x20type\x20\x22string\x22\x20(length)\x20and\x20\x22decimal\x22\x20(precision,scale).',a0_0x590179(0x243),'Value\x20constraints\x20(default,\x20fk)\x20require\x20constraint:value\x20format.','Default\x20value\x20format\x20depends\x20on\x20type:\x20raw\x20for\x20boolean\x20(default:true),\x20raw\x20for\x20integer\x20(default:0),\x20single-quoted\x20for\x20string\x20(default:\x27value\x27),\x20bare\x20identifier\x20for\x20SQL\x20constants\x20(default:current_date),\x20identifier()\x20for\x20native\x20function\x20calls\x20(default:now()).','Foreign\x20key\x20uses\x20dot\x20notation:\x20fk:<table>.<column>\x20(e.g.,\x20fk:category.id).\x20The\x20parser\x20rejects\x20parentheses\x20syntax.'],'examples':[{'input':'string:36\x20pk','meaning':'VARCHAR(36)\x20PRIMARY\x20KEY'},{'input':a0_0x590179(0x24d),'meaning':'VARCHAR(255)\x20NOT\x20NULL'},{'input':a0_0x590179(0x207),'meaning':'DECIMAL(15,2)\x20NOT\x20NULL\x20DEFAULT\x200'},{'input':a0_0x590179(0x231),'meaning':a0_0x590179(0x250)},{'input':'string:100\x20default:\x27pending\x27','meaning':a0_0x590179(0x233)},{'input':'timestamp\x20default:now()','meaning':'TIMESTAMP\x20DEFAULT\x20<native_now\x20per\x20dialect>'},{'input':'string:36\x20fk:category.id','meaning':a0_0x590179(0x24b)},{'input':'string:64\x20index','meaning':a0_0x590179(0x1e3)}]},NAMING_RULES={'tableName':{'format':'snake_case','description':a0_0x590179(0x1e7)},'fieldName':{'format':'snake_case','description':'Column\x20name\x20must\x20be\x20snake_case.'},'constraintName':{'format':a0_0x590179(0x22d),'defaultMaxLength':0x1e,'fallbackStrategy':a0_0x590179(0x1f0),'description':a0_0x590179(0x240)},'compositeShortName':{'description':a0_0x590179(0x1e5)}},DIALECT_SUPPORT=[{'name':a0_0x590179(0x251),'driver':'pg','booleanStorage':a0_0x590179(0x1fe)},{'name':a0_0x590179(0x1eb),'driver':a0_0x590179(0x210),'booleanStorage':a0_0x590179(0x211)},{'name':a0_0x590179(0x253),'driver':'oracledb','booleanStorage':'VARCHAR2\x20with\x20CHECK\x20constraint'},{'name':a0_0x590179(0x1e9),'driver':'better-sqlite3','booleanStorage':'TEXT'}],DBSCHEMA_CATALOG={'schemaVersion':SCHEMA_VERSION,'source':SOURCE,'summary':{'totalDefineModelOptions':DEFINE_MODEL_OPTIONS[a0_0x590179(0x213)],'totalFieldTypes':FIELD_TYPES[a0_0x590179(0x213)],'totalConstraints':CONSTRAINTS['length'],'totalRelationTypes':RELATION_TYPES[a0_0x590179(0x213)],'totalReferentialActions':REFERENTIAL_ACTIONS[a0_0x590179(0x213)],'totalCheckOperations':CHECK_OPERATIONS['length'],'totalAuditColumns':AUDIT_COLUMNS[a0_0x590179(0x1f3)]['length'],'totalDialects':DIALECT_SUPPORT[a0_0x590179(0x213)]},'defineModelOptions':DEFINE_MODEL_OPTIONS,'fieldTypes':FIELD_TYPES,'constraints':CONSTRAINTS,'relationTypes':RELATION_TYPES,'referentialActions':REFERENTIAL_ACTIONS,'checkOperations':CHECK_OPERATIONS,'auditColumns':AUDIT_COLUMNS,'shorthandSyntax':SHORTHAND_SYNTAX,'namingRules':NAMING_RULES,'dialectSupport':DIALECT_SUPPORT,'documentationUrl':DOCUMENTATION_URL};module[a0_0x590179(0x1ff)]={'DBSCHEMA_CATALOG':DBSCHEMA_CATALOG,'DEFINE_MODEL_OPTIONS':DEFINE_MODEL_OPTIONS,'FIELD_TYPES':FIELD_TYPES,'CONSTRAINTS':CONSTRAINTS,'RELATION_TYPES':RELATION_TYPES,'REFERENTIAL_ACTIONS':REFERENTIAL_ACTIONS,'CHECK_OPERATIONS':CHECK_OPERATIONS,'AUDIT_COLUMNS':AUDIT_COLUMNS,'SHORTHAND_SYNTAX':SHORTHAND_SYNTAX,'NAMING_RULES':NAMING_RULES,'DIALECT_SUPPORT':DIALECT_SUPPORT};function a0_0x2390(_0x3985a3,_0x55c121){_0x3985a3=_0x3985a3-0x1e0;const _0x1242d5=a0_0x1242();let _0x2390af=_0x1242d5[_0x3985a3];if(a0_0x2390['acHuqv']===undefined){var _0x3d6767=function(_0x1f6646){const _0x15ea7f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x385827='',_0xea4e83='';for(let _0x57b017=0x0,_0x50246c,_0x543953,_0x53000b=0x0;_0x543953=_0x1f6646['charAt'](_0x53000b++);~_0x543953&&(_0x50246c=_0x57b017%0x4?_0x50246c*0x40+_0x543953:_0x543953,_0x57b017++%0x4)?_0x385827+=String['fromCharCode'](0xff&_0x50246c>>(-0x2*_0x57b017&0x6)):0x0){_0x543953=_0x15ea7f['indexOf'](_0x543953);}for(let _0x106758=0x0,_0x23bd56=_0x385827['length'];_0x106758<_0x23bd56;_0x106758++){_0xea4e83+='%'+('00'+_0x385827['charCodeAt'](_0x106758)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xea4e83);};a0_0x2390['zoWnNF']=_0x3d6767,a0_0x2390['ULMWdT']={},a0_0x2390['acHuqv']=!![];}const _0x705f5c=_0x1242d5[0x0],_0x25e953=_0x3985a3+_0x705f5c,_0x106d78=a0_0x2390['ULMWdT'][_0x25e953];return!_0x106d78?(_0x2390af=a0_0x2390['zoWnNF'](_0x2390af),a0_0x2390['ULMWdT'][_0x25e953]=_0x2390af):_0x2390af=_0x106d78,_0x2390af;}function a0_0x1242(){const _0x3ee7b1=['nJuXnMHyzhDqua','uMvJB3jKignYzwf0Aw9UihrPBwvZDgfTCc4Gqxv0BY1ZzxqGB24Gsu5trvjuihzPysberuzbvuXuig5VDYGPlIboyxrPDMuGzNvUy3rPB24GDhjHBNnSyxrLCYbWzxiGzgLHBgvJDcaOCg9ZDgDYzxm6ienvuLjftLrFveLnrvnuqu1qlcbTExnXBdOGtK9xkcKSig9YywnSztOGu1LtveLnrvnuqu1qlcbZCwXPDgu6ienvuLjftLrFveLnrvnuqu1qks4','tM9UlxvUAxf1zsbPBMrLEgvZlIbfywnOigvUDhj5igLZigfYCMf5ig9MignVBhvTBIbUyw1LCYbVCIbVyMPLy3qGEYbUyw1LlcbJB2X1Bw5Zih0U','C3rYAw5N','Aw50zwDLCG','rgvMyxvSDcb2ywX1zs4Gu2LUz2XLlxf1B3rLzcbMB3iGC3rYAw5NCYWGCMf3igzVCIbUDw1LCMLJl2jVB2XLyw4SigjHCMuGAwrLBNrPzMLLCIbMB3iGu1fmignVBNn0yw50CYWGAwrLBNrPzMLLCIGPigzVCIbUyxrPDMuGzNvUy3rPB24Gy2fSBhmU','DgfYz2v0','C3rHBMrHBg9Uzq','q29UC3rYywLUDcbUyw1LCYbHDxrVlwDLBMvYyxrLzcb3AxrOihr5CguTC3bLy2LMAwmGChjLzML4icHWAYWGzMSSigLKEcWGDxeSignRksbHBMqGzgLHBgvJDc1ZCgvJAwzPyYbTyxGGBgvUz3rOlG','Bg9JywXlzxK','EYbMAwvSzdOGiMrPC2nVDw50iIWGBhrLoIaXmdaGFq','u3rHBMrHBg9UzsbJB25ZDhjHAw50CYaOCgSSig5VDg51BgWSihvUAxf1zsWGAw5KzxGPihrHA2uGBM8GDMfSDwuUifrOzsbSzwDHy3KGyxv0B1vWzgf0zsb0B2TLBIbPCYbZDgLSBcbWyxjZzwqGzM9YigjHy2T3yxjKignVBxbHDgLIAwXPDhKGyNv0igLZigrLChjLy2f0zwqGyw5KigHHCYbUBYbMDw5JDgLVBMfSigvMzMvJDc4','C2v0tNvSBa','y2HLy2TZ','C3rYAw5NoJi1nq','qM9VBgvHBIb2ywX1zsaOBMf0AxzLiejpt0Xfqu4GB24Gug9ZDgDYzvnrtcWGvKfsq0HbuIbVBIbVDgHLCNmPlG','zMS6phrHyMXLpI48y29SDw1UpG','CMvMzxjLBMnLCW','odC1nJa0AhLOwwrd','vKfsq0HbuIGZnIKGD2L0AcbgsYb0BYbJyxrLz29YEsHPzcKSigf1Dg8GyMvSB25NC1rVihjLBgf0Aw9U','u3rYAw5NihnOB3j0AgfUzcbMB3iGzMLLBgqGzgvMAw5PDgLVBI4GvhLWzsbYzxf1AxjLzcbHDcbZDgfYDcWGzM9SBg93zwqGyNKGB3b0Aw9UywWGBw9KAwzPzxiGyw5KihnWywnLlxnLCgfYyxrLzcbJB25ZDhjHAw50CY4','C3rYAw5NoJi1nsbUB3rUDwXS','C3rYAw5NFgfYCMf5','BNvTzxjPyW','qK9ptevbtIberuzbvuXuifrsvuu','Cg9ZDgDYzxm','nZj5Egjps2O','B3jHy2XL','C2nHBgfY','BNvSBcbVCIbLBxb0EsbZDhjPBMCGBwvHBNmGzgvMyxvSDcbZy2HLBweU','tM90igvXDwfSihrVlG','q2fZy2fKzsbKzwXLDguVDxbKyxrLihrVignOAwXKihjVD3mU','EYbPzdOGiNn0CMLUzZOZnIbWAYiSig5HBwu6icjZDhjPBMC6mJu1ig5VDg51BgWIih0','sLnptIbJB2X1Bw4GkePtt05cig9UifbVC3rNCMvtuuWSiePtt04GB24GtxLtuuWSienmt0iGB24Gt3jHy2XLks4','z3rL','u2v0iezlignVBhvTBIb0BYbovuXmig9UignOAwXKihjVD3mU','vKfsq0HbuIG2ncKGD2L0AcbZAw5NBguTy29SDw1UigLUzgv4','yhjLzMvYzw5JzxnGigLZihrOzsbIyxjLignVBhvTBIbUyw1LigLUihrOzsb0yxjNzxqGDgfIBguUifrHCMDLDcb0ywjSzsbPCYbHDxrVlwrLCML2zwqGzNjVBsb0AguGCMvSyxrPB24GA2v5ig5HBwuSig9Yig92zxjYAwrLihDPDgGGyhrHCMDLDgaU','rM9YignVBxbVC2L0zsbPBMrLEgvZl3vUAxf1zxmSig5HBwuGAxmGzgvYAxzLzcbIEsbQB2LUAw5NignVBhvTBNmGD2L0Acb1BMrLCNnJB3jLigfUzcb0CNvUy2f0Aw5NihDOzw4GBMvLzgvKlG','rxf1ywWGDg8U','vgfIBguGBMfTzsbTDxn0igjLigXVD2vYy2fZzsWGzgLNAxrZlcbHBMqGDw5KzxjZy29YzxmGB25SEs4','phr5Cgu+wZO8Bw9KAwzPzxi+xsbBpgnVBNn0CMfPBNq+wZO8DMfSDwu+xv0UlI4','C3fSAxrL','BhrL','BxLZCwW','tgfZDcbTB2rPzMLJyxrPB24GDgLTzxn0yw1WlIbbDxrVlxvWzgf0zsbPCYbOyw5KBgvKigj5ihrOzsbsreyGCNvUDgLTzsaOqMfZzu1VzgvSigf1zgL0q29SDw1UCYbJB252zw50Aw9Uksb3AgLJAcbPBMPLy3rZihvWzgf0zwrFyxqGpsbdvvjsru5ux1rjtuvtvefnucbPBNrVigv2zxj5ifvqrefursbZDgf0zw1LBNqGyMfZzwqGB24GzMLLBgqGBMfTAw5NlcbUB3qGyNKGyw55ifnerIbTyxjRzxiUieLUAxrPywWGsu5trvjuihzHBhvLigLZigfSC28GAgfUzgXLzcbIEsb0AguGuKrgihj1BNrPBwuGyxvKAxrdB2X1Bw5ZigHLBhbLCI4','vw5PCxvLignVBNn0CMfPBNrZicHZAw5NBguGB3iGy29TCg9ZAxrLks4','yMLNAw50','mZiTyML0ihnPz25LzcbPBNrLz2vYicHjtLqVsu5uruDfuIKU','tuq1igHHC2GGoc1JAgfYywn0zxiGC3vMzML4ihDOzw4GBMfTzsbLEgnLzwrZig1HEeXLBMD0Aa','mtyZnJeXmdnZDMvTDeG','yMvSB25NC1rV','y29SDw1UCW','EYb0ExbLoIaIyMvSB25NC1rViIWGBg9JywXlzxK6icjJyxrLz29YEv9PzciSihjLzMvYzw5Jzxm6icjJyxrLz29YEv9PzciSig9UrgvSzxrLoIaICMvZDhjPy3qIih0','rxHWBgLJAxqGBgvUz3rOihjLCxvPCMvKigzVCIbJCM9ZCY1KAwfSzwn0ihbVCNrHyMLSAxr5lG','ntGWody3mKX1B0PhyG','mtuWnvjxseT5Bq','C3rYAw5NoJXSzw5NDgG+','CMvZDhjPy3q','u2LUz2XLlwnVBhvTBIbUB24TDw5PCxvLigLUzgv4lG','twfYA3mGzMLLBgqGyxmGChjPBwfYEsbRzxKU','BM9by3rPB24','yxjYyxK','BMf0AxzLiejpt0Xfqu4','zxHWB3j0CW','uMvQzwn0igrLBgv0zs91CgrHDguGD2HLBIbJAgLSzcbYB3DZigv4Axn0lG','tgvZCYb0AgfUig9YigvXDwfSihrVlG','uhjLy2LZAw9UigfUzcbZy2fSzsbYzxf1AxjLzcbMB3iGy3jVC3mTzgLHBgvJDcbWB3j0ywjPBgL0Es4','t3zLCNjPzguGChjPBwfYEsbRzxKUifnPBMDSzsbMAwvSzcbUyw1Lig9YignVBxbVC2L0zsbHCNjHEs4','zgvMyxvSDa','mte0mJH2EuD4qKC','DxbKyxrLzf9IEq','zgvJAw1HBdOXnsWYig5VDg51BgWGzgvMyxvSDdOW','B25vCgrHDgu','DhLWzq','Ahr0Chm6lY9Yzxn0zM9Yz2uUzgv2l2rVy3mVy2XPl3nJAgvTys1KzwzPBML0Aw9U','Dw5PCxvLCW','EYbMAwvSzdOGiNf0EsiSigD0oIaWih0','yxv0B1vWzgf0zq','B2jQzwn0','t25LlxrVlw1HBNKGkgLUDMvYC2uGB2yGyMvSB25NC1rVks4Gt3b0Aw9UywWGAw52zxjZzsbKzwnSyxjHDgLVBIbVBIb0AguGCgfYzw50ihnPzgu7igrVzxmGBM90igfMzMvJDcbereWU','BxLZCwWY','vKfsq0HbuIaOBgL0zxjHBcaIDhj1zsiViMzHBhnLiIK','DgLTzxn0yw1W','BgvUz3rO','B25ezwXLDgu','DMfSDwu','nJqTyML0ihnPz25LzcbPBNrLz2vYicHcsuDjtLqPlG','EYbMAwvSzdOGiMrPC2nVDw50iIWGBhq6ideWmcb9','zgf0zq','rgf0ywjHC2uGC2nOzw1Hig5HBwvZCgfJzsaOBxvSDgKTC2nOzw1HigrHDgfIyxnLks4','zMLLBgrZ','EYbMAwvSzdOGiNf0EsiSigD0ztOGmcb9','Aw5KzxG','u3rHBMrHCMqGnc1JB2X1Bw4GyxvKAxqGy29UDMvUDgLVBIbMB3iGDgfIBgvZig1HBMfNzwqGyNKGuKvtvezVCMDLlIbuAguGC2fTzsbJB252zw50Aw9UigLZigrVy3vTzw50zwqGAw4GzMLLBgqTDMfSAwrHDgLVBJPJyxrHBg9NicHHDwrPDenVBhvTBNmGC2vJDgLVBIKGzM9YihrOzsbsreyVyMfJA2vUzcbSyxLLCI4Gu0rgigfUzcbsreyGC3rHEsbHBgLNBMvKihDOzw4GyM90AcbKzwnSyxjLihrOzxnLidqGy29SDw1UCY4','C3rYAw5NoJm2ihbR','w3SGzMLLBgq6icjZDgf0DxmIlcbPBJOGwYjHy3rPDMuIlcaIAw5Hy3rPDMuIxsb9lcb7igzPzwXKoIaICxr5iIWGz3rLoIaWih1D','vgHLifjerIbNzw5LCMf0B3iGkgnVzgvNzw5Fy3jLyxrLx2vUzhbVAw50ksbHC3n1BwvZihrOzxnLidqGy29SDw1UCYbLEgLZDcb3AgvUihrOzsbWyxLSB2fKlMf1zgL0q29SDw1UCYbRzxKGAxmGywjZzw50lIbtzwuGzMLLBgqTDMfSAwrHDgLVBJPJyxrHBg9Nigf1zgL0q29SDw1UCYbMB3iGDgHLifjerI1ZAwrLigjLAgf2Aw9YlIbeCMLMDcbIzxr3zwvUifnerIaOBwLZC2LUzYbHDwrPDcbJB2X1Bw5ZksbHBMqGuKrgicHHC3n1BwvZigf1zgL0ignVBhvTBNmPignHDxnLCYbYDw50Aw1LigvYCM9YCYb3AgvUihrOzsbNzw5LCMf0zwqGzw5KCg9PBNqGDhjPzxmGDg8GD3jPDguGy3jLyxrLzf9IEs91CgrHDgvKx2j5ihrVigeGBM9Ulwv4Axn0zw50ignVBhvTBI4','mZaYodi4v0LzrvvZ','vxnLCIbPzgvUDgLMAwvYig9MihrOzsbSyxn0ig1VzgLMAwvYlIbtzxqGyNKGyxbWBgLJyxrPB24GBgf5zxiGB24GvvbeqvrflcbUB3qGyNKGzgf0ywjHC2uGzgvMyxvSDc4','r3jLyxrLCIb0AgfUlG','mte0ntblChjUBfi','wwvZiokaLcbKyNnJAgvTytPPBML0igvTAxrZigfSBca0ignVBhvTBNmGyNKGzgvMyxvSDc4GvgfIBgvZihrOyxqGzg8GBM90ig5LzwqGyxvKAxqGkgXVB2T1Ccb0ywjSzxmSihn5C3rLBsb0ywjSzxmPignHBIbTyw51ywXSEsbYzw1VDMuGDgHLC2uGzMLLBgrZigzYB20GDgHLigDLBMvYyxrLzcbZA2vSzxrVBI4','rgvMyxvSDcb0Aw1LEM9UzsbIzwHHDMLVCIbPCYbKAwfSzwn0lxnWzwnPzMLJlG','EYbMAwvSzdOGiNr5CguIlcbUzxe6icjZExn0zw0Iih0','EYb0ExbLoIaIAgfZtwfUEsiSihrHCMDLDdOGiM9YzgvYx2L0zw0IlcbSB2nHBeTLEtOGiM9YzgvYx2LKiIWGCMvMzxjLBMnLCZOGiM9YzgvYx2LKiIb9','mJfzyvLstfa','ANnVBG','tgvZCYb0AgfUlG','t2jQzwn0ig9MigzPzwXKigrLzMLUAxrPB25ZigLUihnOB3j0AgfUzcbZDhjPBMCGzM9YBwf0lG','phbYzwzPEd5FphrHyMXLpL88C3vMzML4pG','zgvJAw1HBdO8ChjLy2LZAw9UpIW8C2nHBgu+','y3jLyxrLzf9HDa','rgf0zsbVBMX5icHUBYb0Aw1LignVBxbVBMvUDcKU','yM9VBgvHBIbKzwzHDwX0oNrYDwu','BMvX','vKfsq0HbuIGXmdaPierfrKfvtfqGj3bLBMrPBMCN','C3rYAw5NoJeWma','nZi3nZu1zw51Bu5S','C3rYAw5NFg51BgW','rgvMzxiGy29UC3rYywLUDcbJAgvJAYaOC2vTyw50AwnHBgX5ihnPBwLSyxiGDg8GCMvZDhjPy3qGB24GBw9ZDcbKAwfSzwn0CYKU'];a0_0x1242=function(){return _0x3ee7b1;};return a0_0x1242();}