sonamu 0.8.25 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +60 -13
- package/dist/_virtual/rolldown_runtime.js +39 -0
- package/dist/ai/agents/agent.d.ts +3 -3
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +76 -73
- package/dist/ai/agents/index.js +3 -3
- package/dist/ai/agents/types.d.ts +3 -3
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/agents/types.js +1 -3
- package/dist/ai/index.js +3 -2
- package/dist/ai/providers/rtzr/api.js +25 -25
- package/dist/ai/providers/rtzr/error.js +25 -26
- package/dist/ai/providers/rtzr/index.js +5 -5
- package/dist/ai/providers/rtzr/model.d.ts +1 -1
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +117 -133
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/options.js +35 -41
- package/dist/ai/providers/rtzr/provider.d.ts +1 -1
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/provider.js +53 -51
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.js +84 -84
- package/dist/api/base-frame.d.ts +2 -2
- package/dist/api/base-frame.d.ts.map +1 -1
- package/dist/api/base-frame.js +29 -19
- package/dist/api/caster.d.ts +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +51 -61
- package/dist/api/code-converters.d.ts +4 -3
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +226 -249
- package/dist/api/config.d.ts +17 -17
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +37 -30
- package/dist/api/context.d.ts +10 -10
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +8 -2
- package/dist/api/decorators.d.ts +8 -8
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +245 -268
- package/dist/api/index.js +39 -7
- package/dist/api/secret.js +22 -15
- package/dist/api/sonamu.d.ts +15 -15
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +1012 -1131
- package/dist/api/validator.js +88 -79
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +203 -200
- package/dist/auth/better-auth-entities.d.ts +2 -2
- package/dist/auth/better-auth-entities.d.ts.map +1 -1
- package/dist/auth/better-auth-entities.js +369 -429
- package/dist/auth/index.js +21 -6
- package/dist/auth/knex-adapter.d.ts +2 -2
- package/dist/auth/knex-adapter.d.ts.map +1 -1
- package/dist/auth/knex-adapter.js +153 -153
- package/dist/auth/plugins/entity-definitions/admin.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/admin.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/admin.js +58 -56
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/anonymous.js +20 -20
- package/dist/auth/plugins/entity-definitions/api-key.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/api-key.js +185 -196
- package/dist/auth/plugins/entity-definitions/index.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +26 -29
- package/dist/auth/plugins/entity-definitions/jwt.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/jwt.js +62 -64
- package/dist/auth/plugins/entity-definitions/organization.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/organization.js +362 -421
- package/dist/auth/plugins/entity-definitions/passkey.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/passkey.js +115 -126
- package/dist/auth/plugins/entity-definitions/phone-number.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/phone-number.js +31 -40
- package/dist/auth/plugins/entity-definitions/sso.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/sso.js +94 -107
- package/dist/auth/plugins/entity-definitions/two-factor.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/two-factor.js +78 -92
- package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/types.js +1 -10
- package/dist/auth/plugins/entity-definitions/username.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/username.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +31 -40
- package/dist/auth/plugins/index.js +12 -3
- package/dist/auth/plugins/wrappers/admin.d.ts +2 -2
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.js +28 -29
- package/dist/auth/plugins/wrappers/anonymous.d.ts +2 -1
- package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/anonymous.js +23 -22
- package/dist/auth/plugins/wrappers/api-key.d.ts +2 -1
- package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/api-key.js +39 -34
- package/dist/auth/plugins/wrappers/index.js +11 -11
- package/dist/auth/plugins/wrappers/jwt.d.ts +2 -1
- package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/jwt.js +31 -26
- package/dist/auth/plugins/wrappers/organization.d.ts +2 -1
- package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/organization.js +65 -62
- package/dist/auth/plugins/wrappers/passkey.d.ts +2 -1
- package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/passkey.js +33 -28
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +26 -23
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.js +37 -31
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +31 -28
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +23 -23
- package/dist/bin/build-config.js +31 -31
- package/dist/bin/cli.js +1063 -1204
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +266 -259
- package/dist/bin/hmr-hook-register.d.ts.map +1 -1
- package/dist/bin/hmr-hook-register.js +19 -18
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +180 -177
- package/dist/bin/ts-loader-register.js +13 -6
- package/dist/bin/ts-loader-registration.d.ts.map +1 -1
- package/dist/bin/ts-loader-registration.js +28 -38
- package/dist/cache/cache-manager.d.ts +1 -1
- package/dist/cache/cache-manager.d.ts.map +1 -1
- package/dist/cache/cache-manager.js +20 -15
- package/dist/cache/decorator.d.ts +1 -1
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +84 -76
- package/dist/cache/drivers.js +21 -34
- package/dist/cache/index.js +10 -7
- package/dist/cache/types.d.ts +2 -2
- package/dist/cache/types.d.ts.map +1 -1
- package/dist/cache/types.js +1 -6
- package/dist/cache-control/cache-control.d.ts +2 -2
- package/dist/cache-control/cache-control.d.ts.map +1 -1
- package/dist/cache-control/cache-control.js +106 -122
- package/dist/cache-control/types.d.ts +2 -2
- package/dist/cache-control/types.d.ts.map +1 -1
- package/dist/cache-control/types.js +1 -19
- package/dist/compress/compress.d.ts +1 -1
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/compress/compress.js +58 -56
- package/dist/compress/index.js +7 -2
- package/dist/compress/types.js +1 -11
- package/dist/cone/cone-generator.d.ts +1 -1
- package/dist/cone/cone-generator.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +216 -219
- package/dist/database/_batch_update.d.ts +1 -1
- package/dist/database/_batch_update.d.ts.map +1 -1
- package/dist/database/_batch_update.js +107 -102
- package/dist/database/base-model.d.ts +8 -9
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +371 -392
- package/dist/database/base-model.types.d.ts +5 -5
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/base-model.types.js +1 -20
- package/dist/database/db.d.ts +5 -2
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +185 -171
- package/dist/database/knex.d.ts +1 -1
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +48 -42
- package/dist/database/puri-subset.types.d.ts +7 -8
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-subset.types.js +1 -16
- package/dist/database/puri-wrapper.d.ts +6 -6
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +99 -101
- package/dist/database/puri.d.ts +4 -5
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +1021 -1227
- package/dist/database/puri.types.d.ts +6 -6
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +15 -6
- package/dist/database/transaction-context.d.ts +2 -2
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/transaction-context.js +22 -13
- package/dist/database/upsert-builder.d.ts +3 -3
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +405 -465
- package/dist/dict/en.js +72 -74
- package/dist/dict/index.js +13 -13
- package/dist/dict/ko.js +72 -74
- package/dist/dict/rc-keys.js +150 -168
- package/dist/dict/sd.d.ts +3 -1
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +54 -40
- package/dist/dict/sonamu-dictionary.d.ts +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +887 -955
- package/dist/dict/types.js +1 -7
- package/dist/dict/utils.js +26 -24
- package/dist/entity/entity-manager.d.ts +9 -9
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +226 -223
- package/dist/entity/entity-template-cone.d.ts +1 -1
- package/dist/entity/entity-template-cone.d.ts.map +1 -1
- package/dist/entity/entity-template-cone.js +152 -151
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +952 -1089
- package/dist/exceptions/error-handler.d.ts +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +32 -27
- package/dist/exceptions/so-exceptions.d.ts +1 -1
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +61 -68
- package/dist/filter/index.js +9 -3
- package/dist/filter/types.js +92 -88
- package/dist/filter/utils.d.ts +1 -1
- package/dist/filter/utils.d.ts.map +1 -1
- package/dist/filter/utils.js +147 -161
- package/dist/index.js +87 -40
- package/dist/logger/category.d.ts.map +1 -1
- package/dist/logger/category.js +30 -29
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +83 -107
- package/dist/migration/code-generation.d.ts +2 -2
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +1385 -1578
- package/dist/migration/migration-set.d.ts +1 -1
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +177 -227
- package/dist/migration/migrator.d.ts +4 -3
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +340 -345
- package/dist/migration/postgresql-schema-reader.d.ts +2 -2
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +506 -564
- package/dist/migration/slack-confirm.d.ts +2 -2
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +205 -193
- package/dist/migration/types.d.ts +2 -2
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/migration/types.js +1 -3
- package/dist/naite/messaging-types.d.ts +1 -0
- package/dist/naite/messaging-types.d.ts.map +1 -1
- package/dist/naite/messaging-types.js +1 -7
- package/dist/naite/naite-reporter.d.ts +2 -2
- package/dist/naite/naite-reporter.d.ts.map +1 -1
- package/dist/naite/naite-reporter.js +127 -120
- package/dist/naite/naite.d.ts +3 -2
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +266 -300
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +13 -3
- package/dist/ssr/registry.d.ts +1 -1
- package/dist/ssr/registry.d.ts.map +1 -1
- package/dist/ssr/registry.js +45 -37
- package/dist/ssr/renderer.d.ts +4 -4
- package/dist/ssr/renderer.d.ts.map +1 -1
- package/dist/ssr/renderer.js +84 -91
- package/dist/ssr/types.d.ts +2 -2
- package/dist/ssr/types.d.ts.map +1 -1
- package/dist/ssr/types.js +1 -3
- package/dist/storage/base-file.js +54 -41
- package/dist/storage/buffered-file.d.ts +2 -2
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.js +51 -44
- package/dist/storage/drivers.d.ts +2 -2
- package/dist/storage/drivers.d.ts.map +1 -1
- package/dist/storage/drivers.js +12 -7
- package/dist/storage/index.js +14 -7
- package/dist/storage/s3-driver.d.ts +2 -2
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/s3-driver.js +52 -48
- package/dist/storage/storage-manager.d.ts +2 -2
- package/dist/storage/storage-manager.d.ts.map +1 -1
- package/dist/storage/storage-manager.js +33 -25
- package/dist/storage/types.d.ts +2 -2
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +1 -5
- package/dist/storage/uploaded-file.d.ts +1 -1
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +45 -35
- package/dist/stream/index.js +7 -2
- package/dist/stream/sse.d.ts +2 -2
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +72 -67
- package/dist/syncer/api-parser.d.ts +1 -1
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +224 -245
- package/dist/syncer/checksum.d.ts +1 -1
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +86 -72
- package/dist/syncer/code-generator.d.ts +2 -2
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +154 -160
- package/dist/syncer/entity-operations.d.ts +1 -1
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +63 -54
- package/dist/syncer/file-patterns.d.ts +1 -1
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +38 -38
- package/dist/syncer/index.js +19 -8
- package/dist/syncer/module-loader.d.ts +5 -5
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +83 -78
- package/dist/syncer/syncer-actions.d.ts +2 -2
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +76 -91
- package/dist/syncer/syncer.d.ts +7 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +426 -492
- package/dist/tasks/decorator.d.ts +3 -3
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +32 -28
- package/dist/tasks/step-wrapper.d.ts +1 -1
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +42 -41
- package/dist/tasks/workflow-manager.d.ts +2 -2
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +192 -221
- package/dist/template/entity-converter.d.ts +1 -1
- package/dist/template/entity-converter.d.ts.map +1 -1
- package/dist/template/entity-converter.js +103 -103
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +163 -163
- package/dist/template/implementations/entity.template.d.ts +1 -1
- package/dist/template/implementations/entity.template.d.ts.map +1 -1
- package/dist/template/implementations/entity.template.js +76 -85
- package/dist/template/implementations/entry-server.template.d.ts +1 -1
- package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
- package/dist/template/implementations/entry-server.template.js +32 -27
- package/dist/template/implementations/generated.template.d.ts +1 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +254 -275
- package/dist/template/implementations/generated_http.template.d.ts +2 -2
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +114 -133
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +249 -275
- package/dist/template/implementations/init_types.template.d.ts +1 -1
- package/dist/template/implementations/init_types.template.d.ts.map +1 -1
- package/dist/template/implementations/init_types.template.js +40 -34
- package/dist/template/implementations/model.template.d.ts +1 -1
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +56 -53
- package/dist/template/implementations/model_test.template.d.ts +1 -1
- package/dist/template/implementations/model_test.template.d.ts.map +1 -1
- package/dist/template/implementations/model_test.template.js +32 -24
- package/dist/template/implementations/queries.template.d.ts +1 -1
- package/dist/template/implementations/queries.template.d.ts.map +1 -1
- package/dist/template/implementations/queries.template.js +84 -89
- package/dist/template/implementations/sd.template.d.ts +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +137 -144
- package/dist/template/implementations/services.template.d.ts +1 -1
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +164 -189
- package/dist/template/implementations/view_form.template.d.ts +1 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +258 -285
- package/dist/template/implementations/view_id_all_select.template.d.ts +1 -1
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_all_select.template.js +31 -25
- package/dist/template/implementations/view_list.template.d.ts +1 -1
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +304 -355
- package/dist/template/implementations/view_search_input.template.d.ts +1 -1
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.js +31 -27
- package/dist/template/index.js +21 -7
- package/dist/template/template-manager.d.ts +1 -1
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template-manager.js +132 -123
- package/dist/template/template-types.js +8 -6
- package/dist/template/template.d.ts +2 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +73 -68
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +603 -657
- package/dist/testing/_relation-graph.d.ts +1 -1
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +93 -88
- package/dist/testing/bootstrap.d.ts +22 -13
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +114 -114
- package/dist/testing/data-explorer.d.ts +3 -3
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +237 -265
- package/dist/testing/dev-test-routes.d.ts +2 -2
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +258 -249
- package/dist/testing/dev-vitest-manager.d.ts +1 -1
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.js +514 -539
- package/dist/testing/faker-mappings.js +422 -420
- package/dist/testing/fixture-generator.d.ts +3 -3
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +1216 -1346
- package/dist/testing/fixture-loader.js +26 -25
- package/dist/testing/fixture-manager.d.ts +3 -3
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +706 -776
- package/dist/testing/global-setup.js +53 -49
- package/dist/testing/index.js +19 -11
- package/dist/testing/naite-vitest-reporter.js +18 -13
- package/dist/testing/parallel-db-manager.d.ts +1 -1
- package/dist/testing/parallel-db-manager.d.ts.map +1 -1
- package/dist/testing/parallel-db-manager.js +63 -78
- package/dist/testing/vitest-helpers.d.ts +1 -1
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +37 -33
- package/dist/types/types.d.ts +28 -28
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +764 -890
- package/dist/ui/ai-api.d.ts +1 -1
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +52 -42
- package/dist/ui/ai-client.d.ts +1 -2
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +353 -388
- package/dist/ui/api.d.ts +1 -1
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +903 -1145
- package/dist/ui/cdd-service.d.ts +15 -18
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +406 -383
- package/dist/ui/cdd-types.d.ts +41 -68
- package/dist/ui/cdd-types.d.ts.map +1 -1
- package/dist/ui/cdd-types.js +1 -3
- package/dist/ui-web/assets/index-C-Zz-wYg.css +1 -0
- package/dist/ui-web/assets/index-DejDON8K.js +238 -0
- package/dist/ui-web/index.html +3 -3
- package/dist/utils/async-utils.js +57 -45
- package/dist/utils/console-util.d.ts.map +1 -1
- package/dist/utils/console-util.js +104 -87
- package/dist/utils/controller.js +26 -19
- package/dist/utils/esm-utils.js +49 -38
- package/dist/utils/formatter.d.ts +1 -2
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +89 -115
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +68 -65
- package/dist/utils/lodash-able.js +11 -4
- package/dist/utils/model.d.ts +1 -1
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +21 -19
- package/dist/utils/object-utils.js +148 -186
- package/dist/utils/path-utils.js +67 -57
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +37 -31
- package/dist/utils/sql-parser.d.ts +1 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +40 -40
- package/dist/utils/type-utils.js +44 -43
- package/dist/utils/utils.d.ts +2 -3
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +81 -93
- package/dist/utils/zod-error.d.ts +1 -1
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +24 -17
- package/dist/vector/chunking.d.ts +1 -1
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/chunking.js +100 -94
- package/dist/vector/config.d.ts +1 -1
- package/dist/vector/config.d.ts.map +1 -1
- package/dist/vector/config.js +76 -78
- package/dist/vector/embedding.d.ts +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +128 -125
- package/dist/vector/index.js +5 -5
- package/dist/vector/types.js +1 -5
- package/package.json +35 -36
- package/src/ai/agents/agent.ts +12 -5
- package/src/ai/agents/types.ts +5 -5
- package/src/ai/providers/rtzr/model.ts +8 -10
- package/src/ai/providers/rtzr/options.ts +2 -1
- package/src/ai/providers/rtzr/provider.ts +5 -3
- package/src/ai/providers/rtzr/utils.ts +2 -7
- package/src/api/__tests__/config.test.ts +15 -8
- package/src/api/base-frame.ts +5 -3
- package/src/api/caster.ts +7 -6
- package/src/api/code-converters.ts +23 -26
- package/src/api/config.ts +23 -17
- package/src/api/context.ts +18 -11
- package/src/api/decorators.ts +17 -18
- package/src/api/sonamu.ts +44 -49
- package/src/auth/auth-generator.ts +4 -6
- package/src/auth/better-auth-entities.ts +3 -2
- package/src/auth/knex-adapter.ts +9 -7
- package/src/auth/plugins/entity-definitions/admin.ts +1 -1
- package/src/auth/plugins/entity-definitions/anonymous.ts +1 -1
- package/src/auth/plugins/entity-definitions/api-key.ts +1 -1
- package/src/auth/plugins/entity-definitions/index.ts +1 -1
- package/src/auth/plugins/entity-definitions/jwt.ts +1 -1
- package/src/auth/plugins/entity-definitions/organization.ts +1 -1
- package/src/auth/plugins/entity-definitions/passkey.ts +1 -1
- package/src/auth/plugins/entity-definitions/phone-number.ts +1 -1
- package/src/auth/plugins/entity-definitions/sso.ts +1 -1
- package/src/auth/plugins/entity-definitions/two-factor.ts +1 -1
- package/src/auth/plugins/entity-definitions/types.ts +1 -1
- package/src/auth/plugins/entity-definitions/username.ts +1 -1
- package/src/auth/plugins/wrappers/admin.ts +3 -1
- package/src/auth/plugins/wrappers/anonymous.ts +3 -1
- package/src/auth/plugins/wrappers/api-key.ts +3 -1
- package/src/auth/plugins/wrappers/jwt.ts +3 -1
- package/src/auth/plugins/wrappers/organization.ts +3 -1
- package/src/auth/plugins/wrappers/passkey.ts +3 -1
- package/src/auth/plugins/wrappers/phone-number.ts +3 -1
- package/src/auth/plugins/wrappers/sso.ts +2 -1
- package/src/auth/plugins/wrappers/two-factor.ts +3 -1
- package/src/auth/plugins/wrappers/username.ts +3 -1
- package/src/bin/__tests__/ts-loader-register.test.ts +7 -12
- package/src/bin/build-config.ts +3 -3
- package/src/bin/cli.ts +27 -25
- package/src/bin/fixture.ts +4 -2
- package/src/bin/hmr-hook-register.ts +1 -0
- package/src/bin/test-command.ts +4 -2
- package/src/bin/ts-loader-registration.ts +6 -22
- package/src/cache/cache-manager.ts +2 -1
- package/src/cache/decorator.ts +2 -2
- package/src/cache/types.ts +3 -3
- package/src/cache-control/cache-control.ts +3 -2
- package/src/cache-control/types.ts +2 -2
- package/src/compress/compress.ts +1 -1
- package/src/cone/cone-generator.ts +7 -5
- package/src/database/_batch_update.ts +1 -1
- package/src/database/base-model.ts +20 -14
- package/src/database/base-model.types.ts +12 -11
- package/src/database/db.ts +56 -21
- package/src/database/knex.ts +2 -2
- package/src/database/puri-subset.test-d.ts +130 -27
- package/src/database/puri-subset.types.ts +7 -8
- package/src/database/puri-wrapper.ts +29 -26
- package/src/database/puri.ts +36 -34
- package/src/database/puri.types.test-d.ts +6 -5
- package/src/database/puri.types.ts +9 -12
- package/src/database/transaction-context.ts +2 -2
- package/src/database/upsert-builder.ts +17 -10
- package/src/dict/sd.ts +17 -4
- package/src/dict/sonamu-dictionary.ts +23 -17
- package/src/entity/entity-manager.ts +9 -7
- package/src/entity/entity-template-cone.ts +10 -3
- package/src/entity/entity.ts +20 -16
- package/src/exceptions/error-handler.ts +2 -1
- package/src/exceptions/so-exceptions.ts +1 -1
- package/src/filter/utils.ts +3 -2
- package/src/logger/category.ts +1 -0
- package/src/logger/configure.ts +5 -5
- package/src/migration/__tests__/code-generation.search-text.test.ts +2 -3
- package/src/migration/code-generation.ts +26 -25
- package/src/migration/migration-set.ts +16 -18
- package/src/migration/migrator.ts +38 -33
- package/src/migration/postgresql-schema-reader.ts +12 -12
- package/src/migration/slack-confirm.ts +5 -4
- package/src/migration/types.ts +2 -2
- package/src/naite/messaging-types.ts +1 -1
- package/src/naite/naite-reporter.ts +5 -3
- package/src/naite/naite.ts +12 -7
- package/src/shared/app.shared.ts.txt +2 -2
- package/src/shared/web.shared.ts.txt +2 -2
- package/src/skills/AGENTS.md +19 -18
- package/src/skills/commands/sonamu-skills.md +9 -9
- package/src/skills/sonamu/SKILL.md +126 -76
- package/src/skills/sonamu/ai-agents.md +27 -26
- package/src/skills/sonamu/api.md +81 -69
- package/src/skills/sonamu/auth-migration.md +13 -27
- package/src/skills/sonamu/auth-plugins.md +41 -31
- package/src/skills/sonamu/auth.md +30 -24
- package/src/skills/sonamu/cdd.md +26 -17
- package/src/skills/sonamu/cone.md +50 -50
- package/src/skills/sonamu/config.md +74 -51
- package/src/skills/sonamu/create-sonamu.md +31 -19
- package/src/skills/sonamu/database.md +43 -26
- package/src/skills/sonamu/entity-basic.md +61 -61
- package/src/skills/sonamu/entity-relations.md +84 -80
- package/src/skills/sonamu/entity-validation-checklist.md +19 -15
- package/src/skills/sonamu/fixture-cli.md +52 -30
- package/src/skills/sonamu/framework-change.md +9 -7
- package/src/skills/sonamu/frontend.md +64 -82
- package/src/skills/sonamu/i18n.md +45 -37
- package/src/skills/sonamu/migration.md +54 -31
- package/src/skills/sonamu/model.md +98 -66
- package/src/skills/sonamu/naite.md +34 -32
- package/src/skills/sonamu/project-init.md +28 -8
- package/src/skills/sonamu/puri.md +82 -91
- package/src/skills/sonamu/scaffolding.md +44 -32
- package/src/skills/sonamu/skill-contribution.md +50 -45
- package/src/skills/sonamu/subset.md +13 -13
- package/src/skills/sonamu/tasks.md +73 -58
- package/src/skills/sonamu/testing-devrunner.md +56 -36
- package/src/skills/sonamu/testing.md +23 -58
- package/src/skills/sonamu/upsert.md +32 -31
- package/src/skills/sonamu/vector.md +37 -36
- package/src/ssr/index.ts +2 -12
- package/src/ssr/registry.ts +1 -1
- package/src/ssr/renderer.ts +7 -5
- package/src/ssr/types.ts +2 -2
- package/src/storage/buffered-file.ts +4 -2
- package/src/storage/drivers.ts +3 -2
- package/src/storage/s3-driver.ts +7 -4
- package/src/storage/storage-manager.ts +3 -2
- package/src/storage/types.ts +3 -2
- package/src/storage/uploaded-file.ts +1 -1
- package/src/stream/sse.ts +2 -2
- package/src/syncer/api-parser.ts +8 -5
- package/src/syncer/checksum.ts +9 -5
- package/src/syncer/code-generator.ts +16 -8
- package/src/syncer/entity-operations.ts +5 -3
- package/src/syncer/file-patterns.ts +2 -1
- package/src/syncer/module-loader.ts +9 -6
- package/src/syncer/syncer-actions.ts +5 -3
- package/src/syncer/syncer.ts +18 -24
- package/src/tasks/decorator.ts +10 -8
- package/src/tasks/step-wrapper.ts +1 -1
- package/src/tasks/workflow-manager.ts +18 -15
- package/src/template/__tests__/generated.template.search-text.test.ts +1 -0
- package/src/template/entity-converter.ts +4 -2
- package/src/template/generated.template.test-d.ts +2 -1
- package/src/template/helpers.ts +5 -2
- package/src/template/implementations/entity.template.ts +9 -8
- package/src/template/implementations/entry-server.template.ts +1 -1
- package/src/template/implementations/generated.template.ts +21 -29
- package/src/template/implementations/generated_http.template.ts +9 -6
- package/src/template/implementations/generated_sso.template.ts +6 -4
- package/src/template/implementations/init_types.template.ts +3 -2
- package/src/template/implementations/model.template.ts +4 -2
- package/src/template/implementations/model_test.template.ts +3 -2
- package/src/template/implementations/queries.template.ts +6 -14
- package/src/template/implementations/sd.template.ts +4 -2
- package/src/template/implementations/services.template.ts +7 -11
- package/src/template/implementations/view_form.template.ts +5 -3
- package/src/template/implementations/view_id_all_select.template.ts +3 -2
- package/src/template/implementations/view_list.template.ts +7 -5
- package/src/template/implementations/view_search_input.template.ts +3 -2
- package/src/template/template-manager.ts +4 -3
- package/src/template/template.ts +4 -3
- package/src/template/zod-converter.ts +10 -7
- package/src/testing/__tests__/dev-test-routes.test.ts +3 -2
- package/src/testing/__tests__/dev-vitest-manager.test.ts +1 -0
- package/src/testing/_relation-graph.ts +2 -2
- package/src/testing/bootstrap.ts +55 -27
- package/src/testing/data-explorer.ts +5 -4
- package/src/testing/dev-test-routes.ts +8 -5
- package/src/testing/dev-vitest-manager.ts +13 -12
- package/src/testing/fixture-generator.ts +15 -21
- package/src/testing/fixture-manager.ts +21 -17
- package/src/testing/parallel-db-manager.ts +2 -1
- package/src/testing/vitest-helpers.ts +2 -1
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +1 -0
- package/src/types/types.ts +8 -8
- package/src/typings/knex.d.ts +4 -4
- package/src/ui/ai-api.ts +5 -3
- package/src/ui/ai-client.ts +7 -6
- package/src/ui/api.ts +42 -39
- package/src/ui/cdd-service.ts +268 -257
- package/src/ui/cdd-types.ts +40 -75
- package/src/utils/console-util.ts +3 -1
- package/src/utils/formatter.ts +94 -102
- package/src/utils/fs-utils.ts +2 -1
- package/src/utils/model.ts +2 -2
- package/src/utils/object-utils.ts +3 -3
- package/src/utils/process-utils.ts +2 -1
- package/src/utils/sql-parser.ts +10 -1
- package/src/utils/type-utils.ts +3 -3
- package/src/utils/utils.ts +9 -7
- package/src/utils/zod-error.ts +1 -1
- package/src/vector/chunking.ts +1 -1
- package/src/vector/config.ts +1 -1
- package/src/vector/embedding.ts +11 -9
- package/tsdown.api.config.ts +50 -0
- package/.swcrc.project-default +0 -18
- package/dist/api/__tests__/config.test.js +0 -189
- package/dist/bin/__tests__/test-command.test.js +0 -112
- package/dist/bin/__tests__/ts-loader-register.test.js +0 -45
- package/dist/database/puri-subset.test-d.js +0 -81
- package/dist/database/puri.types.test-d.js +0 -129
- package/dist/migration/__tests__/code-generation.search-text.test.js +0 -435
- package/dist/template/__tests__/generated.template.search-text.test.js +0 -99
- package/dist/template/generated.template.test-d.js +0 -24
- package/dist/testing/__tests__/dev-test-routes.test.js +0 -144
- package/dist/testing/__tests__/dev-vitest-manager.test.js +0 -152
- package/dist/types/__tests__/entity-json-schema-search-text.test.js +0 -256
- package/dist/typings/knex.d.js +0 -3
- package/dist/ui-web/assets/index-BrQKU3j9.css +0 -1
- package/dist/ui-web/assets/index-CxiydzeC.js +0 -257
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { __esmMin, __toCommonJS } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { api_exports, init_api } from "../api/index.js";
|
|
3
|
+
import * as path$1 from "node:path";
|
|
4
|
+
import * as fs$1 from "node:fs";
|
|
5
|
+
|
|
6
|
+
//#region src/cone/cone-generator.ts
|
|
3
7
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
8
|
+
* LLM을 사용하여 Entity의 cone 메타데이터를 생성합니다.
|
|
9
|
+
*
|
|
10
|
+
* @param context - Entity 정보와 생성 옵션
|
|
11
|
+
* @returns 생성된 cone 메타데이터
|
|
12
|
+
*/
|
|
13
|
+
async function generateCones(context) {
|
|
14
|
+
const apiKey = getApiKey();
|
|
15
|
+
const prompt = buildPrompt(context);
|
|
16
|
+
const { text: responseText, tokensUsed } = await callAnthropicAPI(prompt, apiKey);
|
|
17
|
+
const result = parseConeResponse(responseText);
|
|
18
|
+
result.tokensUsed = tokensUsed;
|
|
19
|
+
if (context.existingCones) {
|
|
20
|
+
if (context.onlyEmpty) {
|
|
21
|
+
return mergeOnlyEmpty(result, context.existingCones);
|
|
22
|
+
}
|
|
23
|
+
return mergeWithExisting(result, context.existingCones);
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
21
26
|
}
|
|
22
27
|
/**
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
return apiKey;
|
|
28
|
+
* API 키를 가져옵니다.
|
|
29
|
+
*
|
|
30
|
+
* Sonamu.secret 또는 환경변수에서 가져옵니다.
|
|
31
|
+
*/
|
|
32
|
+
function getApiKey() {
|
|
33
|
+
let apiKey;
|
|
34
|
+
try {
|
|
35
|
+
const { Sonamu } = (init_api(), __toCommonJS(api_exports));
|
|
36
|
+
apiKey = Sonamu.secrets?.anthropic_api_key;
|
|
37
|
+
} catch {
|
|
38
|
+
apiKey = undefined;
|
|
39
|
+
}
|
|
40
|
+
if (!apiKey) {
|
|
41
|
+
apiKey = process.env.ANTHROPIC_API_KEY;
|
|
42
|
+
}
|
|
43
|
+
if (!apiKey) {
|
|
44
|
+
throw new Error("ANTHROPIC_API_KEY not found. " + "Set ANTHROPIC_API_KEY environment variable or add it to sonamu.secret.ts");
|
|
45
|
+
}
|
|
46
|
+
return apiKey;
|
|
44
47
|
}
|
|
45
48
|
/**
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
} catch {
|
|
85
|
-
// Sonamu 미초기화 또는 파일 접근 오류 시 빈 문자열 반환
|
|
86
|
-
return "";
|
|
87
|
-
}
|
|
49
|
+
* 도메인별 {domain}.contract.md와 architecture.md를 읽어 컨텍스트로 반환합니다.
|
|
50
|
+
*
|
|
51
|
+
* - contract/{domain}/{domain}.contract.md: 도메인 규칙과 결정 근거 (주 참조 대상)
|
|
52
|
+
* - .claude/skills/project/architecture.md: 엔티티 설계 구조 (보조 참조)
|
|
53
|
+
*
|
|
54
|
+
* cone 생성 시 LLM에게 전달하여 도메인 맥락에 맞는 메타데이터를 생성하도록 합니다.
|
|
55
|
+
*/
|
|
56
|
+
function readProjectSkills() {
|
|
57
|
+
try {
|
|
58
|
+
const { Sonamu } = (init_api(), __toCommonJS(api_exports));
|
|
59
|
+
const projectRoot = Sonamu.appRootPath;
|
|
60
|
+
const contents = [];
|
|
61
|
+
const contractDir = path$1.join(projectRoot, "contract");
|
|
62
|
+
if (fs$1.existsSync(contractDir)) {
|
|
63
|
+
const domains = fs$1.readdirSync(contractDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
64
|
+
for (const domain of domains) {
|
|
65
|
+
const domainDir = path$1.join(contractDir, domain);
|
|
66
|
+
const contractFiles = fs$1.readdirSync(domainDir).filter((f) => f.endsWith(".contract.md"));
|
|
67
|
+
for (const file of contractFiles) {
|
|
68
|
+
const filePath = path$1.join(domainDir, file);
|
|
69
|
+
const content = fs$1.readFileSync(filePath, "utf-8").trim();
|
|
70
|
+
if (content) {
|
|
71
|
+
contents.push(`--- contract/${domain}/${file} ---\n${content}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const architecturePath = path$1.join(projectRoot, ".claude", "skills", "project", "architecture.md");
|
|
77
|
+
if (fs$1.existsSync(architecturePath)) {
|
|
78
|
+
const content = fs$1.readFileSync(architecturePath, "utf-8").trim();
|
|
79
|
+
if (content) {
|
|
80
|
+
contents.push(`--- architecture.md ---\n${content}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return contents.join("\n\n");
|
|
84
|
+
} catch {
|
|
85
|
+
return "";
|
|
86
|
+
}
|
|
88
87
|
}
|
|
89
88
|
/**
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
89
|
+
* LLM 프롬프트를 생성합니다.
|
|
90
|
+
*
|
|
91
|
+
* ai-client.ts 패턴을 참고하여 명확한 지시사항과 출력 형식을 제공합니다.
|
|
92
|
+
*/
|
|
93
|
+
function buildPrompt(context) {
|
|
94
|
+
const locale = context.locale || "ko";
|
|
95
|
+
const localeDesc = {
|
|
96
|
+
ko: "Korean",
|
|
97
|
+
en: "English",
|
|
98
|
+
ja: "Japanese"
|
|
99
|
+
}[locale];
|
|
100
|
+
const projectContext = readProjectSkills();
|
|
101
|
+
const projectSection = projectContext ? `\nPROJECT CONTEXT (business requirements and domain knowledge):\n${projectContext}\n\nUse the above project context to understand the business domain, entity purposes, field meanings, and relationships. Generate cone metadata that reflects this project's actual requirements, not generic assumptions.\n` : "";
|
|
102
|
+
return `You are a Sonamu framework expert. Generate cone metadata for database entity fixture generation.
|
|
103
103
|
|
|
104
104
|
CRITICAL PRIORITY RULE:
|
|
105
105
|
The "note" field is the PRIMARY source for fixture data generation. When --use-llm is enabled, the fixture generator reads cone.note and asks LLM to generate contextually appropriate data BEFORE falling back to fixtureGenerator.
|
|
@@ -207,135 +207,132 @@ Return ONLY valid JSON (no markdown, no code blocks). Use this exact structure:
|
|
|
207
207
|
IMPORTANT: Return pure JSON only. Do NOT wrap in markdown code blocks.`;
|
|
208
208
|
}
|
|
209
209
|
/**
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
throw new Error(`LLM API failed: ${message}`);
|
|
244
|
-
}
|
|
210
|
+
* Anthropic API를 호출하여 LLM 응답을 받습니다.
|
|
211
|
+
*
|
|
212
|
+
* @param prompt - 생성할 프롬프트
|
|
213
|
+
* @param apiKey - Anthropic API 키
|
|
214
|
+
* @returns LLM 응답 텍스트 및 토큰 사용량
|
|
215
|
+
*/
|
|
216
|
+
async function callAnthropicAPI(prompt, apiKey) {
|
|
217
|
+
try {
|
|
218
|
+
const { createAnthropic } = await import("@ai-sdk/anthropic");
|
|
219
|
+
const { generateText } = await import("ai");
|
|
220
|
+
const anthropic = createAnthropic({ apiKey });
|
|
221
|
+
const { text, usage } = await generateText({
|
|
222
|
+
model: anthropic("claude-sonnet-4-6"),
|
|
223
|
+
prompt
|
|
224
|
+
});
|
|
225
|
+
const tokensUsed = usage?.totalTokens || 0;
|
|
226
|
+
if (usage) {
|
|
227
|
+
console.log(`[Cone Generator] Tokens used: ${tokensUsed}`);
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
text,
|
|
231
|
+
tokensUsed
|
|
232
|
+
};
|
|
233
|
+
} catch (error) {
|
|
234
|
+
if (error && typeof error === "object" && "statusCode" in error) {
|
|
235
|
+
const statusCode = error.statusCode;
|
|
236
|
+
if (statusCode === 429) {
|
|
237
|
+
throw new Error("Rate limit exceeded. Please try again later.", { cause: error });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
241
|
+
throw new Error(`LLM API failed: ${message}`, { cause: error });
|
|
242
|
+
}
|
|
245
243
|
}
|
|
246
244
|
/**
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
245
|
+
* LLM 응답을 파싱하여 ConeGenerationResult로 변환합니다.
|
|
246
|
+
*
|
|
247
|
+
* Markdown 코드 블록이 포함되어 있으면 제거합니다.
|
|
248
|
+
*/
|
|
249
|
+
function parseConeResponse(text) {
|
|
250
|
+
let jsonText = text.trim();
|
|
251
|
+
jsonText = jsonText.replace(/^```json\s*/i, "");
|
|
252
|
+
jsonText = jsonText.replace(/```\s*$/, "");
|
|
253
|
+
jsonText = jsonText.trim();
|
|
254
|
+
try {
|
|
255
|
+
const parsed = JSON.parse(jsonText);
|
|
256
|
+
if (!parsed.propCones || typeof parsed.propCones !== "object") {
|
|
257
|
+
throw new Error("Invalid response: propCones is required and must be an object");
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
entityCone: parsed.entityCone,
|
|
261
|
+
propCones: parsed.propCones,
|
|
262
|
+
subsetCones: parsed.subsetCones || {},
|
|
263
|
+
enumCones: parsed.enumCones || {},
|
|
264
|
+
tokensUsed: 0
|
|
265
|
+
};
|
|
266
|
+
} catch (error) {
|
|
267
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
268
|
+
throw new Error(`Failed to parse LLM response: ${message}\n\n` + `Original response:\n${text}\n\n` + `Cleaned JSON:\n${jsonText}`, { cause: error });
|
|
269
|
+
}
|
|
271
270
|
}
|
|
272
271
|
/**
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
return result;
|
|
272
|
+
* 생성된 cone을 기존 cone과 병합합니다.
|
|
273
|
+
*
|
|
274
|
+
* 기존 cone이 있으면 보존하고, 없는 경우에만 생성된 cone을 사용합니다.
|
|
275
|
+
*/
|
|
276
|
+
function mergeWithExisting(generated, existing) {
|
|
277
|
+
const result = { ...generated };
|
|
278
|
+
const entityKey = `entity:${generated.entityCone ? "present" : "missing"}`;
|
|
279
|
+
if (existing[entityKey]) {
|
|
280
|
+
result.entityCone = existing[entityKey];
|
|
281
|
+
}
|
|
282
|
+
for (const propName of Object.keys(generated.propCones)) {
|
|
283
|
+
const key = `prop:${propName}`;
|
|
284
|
+
if (existing[key]) {
|
|
285
|
+
result.propCones[propName] = existing[key];
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
for (const enumId of Object.keys(generated.enumCones)) {
|
|
289
|
+
const key = `enum:${enumId}`;
|
|
290
|
+
if (existing[key]) {
|
|
291
|
+
result.enumCones[enumId] = existing[key];
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
for (const subsetKey of Object.keys(generated.subsetCones)) {
|
|
295
|
+
const key = `subset:${subsetKey}`;
|
|
296
|
+
if (existing[key]) {
|
|
297
|
+
result.subsetCones[subsetKey] = existing[key];
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return result;
|
|
303
301
|
}
|
|
304
302
|
/**
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
if (existing[key]?.note) {
|
|
335
|
-
result.subsetCones[subsetKey] = existing[key];
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
return result;
|
|
303
|
+
* note가 없는 cone만 생성하고 나머지는 보존합니다.
|
|
304
|
+
*
|
|
305
|
+
* 기존 cone에 note가 있으면 보존하고, 없으면 새로 생성된 cone을 사용합니다.
|
|
306
|
+
*/
|
|
307
|
+
function mergeOnlyEmpty(generated, existing) {
|
|
308
|
+
const result = { ...generated };
|
|
309
|
+
const entityKey = `entity:${generated.entityCone ? "present" : "missing"}`;
|
|
310
|
+
if (existing[entityKey]?.note) {
|
|
311
|
+
result.entityCone = existing[entityKey];
|
|
312
|
+
}
|
|
313
|
+
for (const propName of Object.keys(generated.propCones)) {
|
|
314
|
+
const key = `prop:${propName}`;
|
|
315
|
+
if (existing[key]?.note) {
|
|
316
|
+
result.propCones[propName] = existing[key];
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
for (const enumId of Object.keys(generated.enumCones)) {
|
|
320
|
+
const key = `enum:${enumId}`;
|
|
321
|
+
if (existing[key]?.note) {
|
|
322
|
+
result.enumCones[enumId] = existing[key];
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
for (const subsetKey of Object.keys(generated.subsetCones)) {
|
|
326
|
+
const key = `subset:${subsetKey}`;
|
|
327
|
+
if (existing[key]?.note) {
|
|
328
|
+
result.subsetCones[subsetKey] = existing[key];
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return result;
|
|
339
332
|
}
|
|
333
|
+
var init_cone_generator = __esmMin((() => {}));
|
|
340
334
|
|
|
341
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25lL2NvbmUtZ2VuZXJhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQ29uZSwgRW50aXR5SnNvbiB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuXG4vKipcbiAqIENvbmUg7IOd7ISxIOy7qO2FjeyKpO2KuFxuICpcbiAqIEVudGl0eSDsoJXrs7TsmYAg7IOd7ISxIOyYteyFmOydhCDri7Tqs6Ag7J6I7Iq164uI64ukLlxuICovXG5leHBvcnQgdHlwZSBDb25lR2VuZXJhdGlvbkNvbnRleHQgPSB7XG4gIGVudGl0eTogRW50aXR5SnNvbjtcbiAgbG9jYWxlPzogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiO1xuICBleGlzdGluZ0NvbmVzPzogUmVjb3JkPHN0cmluZywgQ29uZT47XG4gIC8qKiB0cnVl7J24IOqyveyasCBub3Rl6rCAIOyXhuuKlCBjb25l66eMIOyDneyEsSAqL1xuICBvbmx5RW1wdHk/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBDb25lIOyDneyEsSDqsrDqs7xcbiAqXG4gKiBFbnRpdHksIFByb3BzLCBTdWJzZXRzLCBFbnVtc+ydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDri7Tqs6Ag7J6I7Iq164uI64ukLlxuICovXG5leHBvcnQgdHlwZSBDb25lR2VuZXJhdGlvblJlc3VsdCA9IHtcbiAgZW50aXR5Q29uZT86IENvbmU7XG4gIHByb3BDb25lczogUmVjb3JkPHN0cmluZywgQ29uZT47XG4gIHN1YnNldENvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPjtcbiAgZW51bUNvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPjtcbiAgdG9rZW5zVXNlZDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBMTE3snYQg7IKs7Jqp7ZWY7JesIEVudGl0eeydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBFbnRpdHkg7KCV67O07JmAIOyDneyEsSDsmLXshZhcbiAqIEByZXR1cm5zIOyDneyEseuQnCBjb25lIOuplO2DgOuNsOydtO2EsFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDb25lcyhjb250ZXh0OiBDb25lR2VuZXJhdGlvbkNvbnRleHQpOiBQcm9taXNlPENvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gIGNvbnN0IGFwaUtleSA9IGdldEFwaUtleSgpO1xuICBjb25zdCBwcm9tcHQgPSBidWlsZFByb21wdChjb250ZXh0KTtcbiAgY29uc3QgeyB0ZXh0OiByZXNwb25zZVRleHQsIHRva2Vuc1VzZWQgfSA9IGF3YWl0IGNhbGxBbnRocm9waWNBUEkocHJvbXB0LCBhcGlLZXkpO1xuICBjb25zdCByZXN1bHQgPSBwYXJzZUNvbmVSZXNwb25zZShyZXNwb25zZVRleHQpO1xuICByZXN1bHQudG9rZW5zVXNlZCA9IHRva2Vuc1VzZWQ7XG5cbiAgaWYgKGNvbnRleHQuZXhpc3RpbmdDb25lcykge1xuICAgIGlmIChjb250ZXh0Lm9ubHlFbXB0eSkge1xuICAgICAgcmV0dXJuIG1lcmdlT25seUVtcHR5KHJlc3VsdCwgY29udGV4dC5leGlzdGluZ0NvbmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlV2l0aEV4aXN0aW5nKHJlc3VsdCwgY29udGV4dC5leGlzdGluZ0NvbmVzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQVBJIO2CpOulvCDqsIDsoLjsmLXri4jri6QuXG4gKlxuICogU29uYW11LnNlY3JldCDrmJDripQg7ZmY6rK967OA7IiY7JeQ7IScIOqwgOyguOyYteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gIC8vIFNvbmFtdS5zZWNyZXTsnYAg65+w7YOA7J6E7JeQIOuhnOuTnOuQmOuvgOuhnCDrj5nsoIHsnLzroZwgaW1wb3J0XG4gIGxldCBhcGlLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbmFtdeqwgCDstIjquLDtmZTrkJjslrQg7J6I64qUIOqyveyasFxuICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgIGFwaUtleSA9IFNvbmFtdS5zZWNyZXQ/LmFudGhyb3BpY19hcGlfa2V5O1xuICB9IGNhdGNoIHtcbiAgICAvLyBTb25hbXXqsIAg7LSI6riw7ZmU65CY7KeAIOyViuydgCDqsr3smrAgKO2FjOyKpO2KuCDrk7EpXG4gICAgYXBpS2V5ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFhcGlLZXkpIHtcbiAgICBhcGlLZXkgPSBwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWTtcbiAgfVxuXG4gIGlmICghYXBpS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBTlRIUk9QSUNfQVBJX0tFWSBub3QgZm91bmQuIFwiICtcbiAgICAgICAgXCJTZXQgQU5USFJPUElDX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYWRkIGl0IHRvIHNvbmFtdS5zZWNyZXQudHNcIixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGFwaUtleTtcbn1cblxuLyoqXG4gKiDrj4TrqZTsnbjrs4Qge2RvbWFpbn0uY29udHJhY3QubWTsmYAgYXJjaGl0ZWN0dXJlLm1k66W8IOydveyWtCDsu6jthY3siqTtirjroZwg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIC0gY29udHJhY3Qve2RvbWFpbn0ve2RvbWFpbn0uY29udHJhY3QubWQ6IOuPhOuplOyduCDqt5zsuZnqs7wg6rKw7KCVIOq3vOqxsCAo7KO8IOywuOyhsCDrjIDsg4EpXG4gKiAtIC5jbGF1ZGUvc2tpbGxzL3Byb2plY3QvYXJjaGl0ZWN0dXJlLm1kOiDsl5Tti7Dti7Ag7ISk6rOEIOq1rOyhsCAo67O07KGwIOywuOyhsClcbiAqXG4gKiBjb25lIOyDneyEsSDsi5wgTExN7JeQ6rKMIOyghOuLrO2VmOyXrCDrj4TrqZTsnbgg66el65297JeQIOunnuuKlCDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWY64+E66GdIO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcmVhZFByb2plY3RTa2lsbHMoKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IFNvbmFtdSB9ID0gcmVxdWlyZShcIi4uL2FwaVwiKTtcbiAgICBjb25zdCBwcm9qZWN0Um9vdCA9IFNvbmFtdS5hcHBSb290UGF0aDtcbiAgICBjb25zdCBjb250ZW50czogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGNvbnRyYWN0LyoqLyouY29udHJhY3QubWQg7IiY7KeRXG4gICAgY29uc3QgY29udHJhY3REaXIgPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsIFwiY29udHJhY3RcIik7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29udHJhY3REaXIpKSB7XG4gICAgICBjb25zdCBkb21haW5zID0gZnNcbiAgICAgICAgLnJlYWRkaXJTeW5jKGNvbnRyYWN0RGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgICAgICAgLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAubWFwKChkKSA9PiBkLm5hbWUpO1xuXG4gICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiBkb21haW5zKSB7XG4gICAgICAgIGNvbnN0IGRvbWFpbkRpciA9IHBhdGguam9pbihjb250cmFjdERpciwgZG9tYWluKTtcbiAgICAgICAgY29uc3QgY29udHJhY3RGaWxlcyA9IGZzXG4gICAgICAgICAgLnJlYWRkaXJTeW5jKGRvbWFpbkRpcilcbiAgICAgICAgICAuZmlsdGVyKChmOiBzdHJpbmcpID0+IGYuZW5kc1dpdGgoXCIuY29udHJhY3QubWRcIikpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBjb250cmFjdEZpbGVzKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZG9tYWluRGlyLCBmaWxlKTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCBcInV0Zi04XCIpLnRyaW0oKTtcbiAgICAgICAgICBpZiAoY29udGVudCkge1xuICAgICAgICAgICAgY29udGVudHMucHVzaChgLS0tIGNvbnRyYWN0LyR7ZG9tYWlufS8ke2ZpbGV9IC0tLVxcbiR7Y29udGVudH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAuY2xhdWRlL3NraWxscy9wcm9qZWN0L2FyY2hpdGVjdHVyZS5tZCDrs7TsobAg7LC47KGwXG4gICAgY29uc3QgYXJjaGl0ZWN0dXJlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHByb2plY3RSb290LFxuICAgICAgXCIuY2xhdWRlXCIsXG4gICAgICBcInNraWxsc1wiLFxuICAgICAgXCJwcm9qZWN0XCIsXG4gICAgICBcImFyY2hpdGVjdHVyZS5tZFwiLFxuICAgICk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYXJjaGl0ZWN0dXJlUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYXJjaGl0ZWN0dXJlUGF0aCwgXCJ1dGYtOFwiKS50cmltKCk7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICBjb250ZW50cy5wdXNoKGAtLS0gYXJjaGl0ZWN0dXJlLm1kIC0tLVxcbiR7Y29udGVudH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudHMuam9pbihcIlxcblxcblwiKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gU29uYW11IOuvuOy0iOq4sO2ZlCDrmJDripQg7YyM7J28IOygkeq3vCDsmKTrpZgg7IucIOu5iCDrrLjsnpDsl7Qg67CY7ZmYXG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbn1cblxuLyoqXG4gKiBMTE0g7ZSE66Gs7ZSE7Yq466W8IOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiBhaS1jbGllbnQudHMg7Yyo7YS07J2EIOywuOqzoO2VmOyXrCDrqoXtmZXtlZwg7KeA7Iuc7IKs7ZWt6rO8IOy2nOugpSDtmJXsi53snYQg7KCc6rO17ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBidWlsZFByb21wdChjb250ZXh0OiBDb25lR2VuZXJhdGlvbkNvbnRleHQpOiBzdHJpbmcge1xuICBjb25zdCBsb2NhbGUgPSBjb250ZXh0LmxvY2FsZSB8fCBcImtvXCI7XG4gIGNvbnN0IGxvY2FsZURlc2MgPSB7XG4gICAga286IFwiS29yZWFuXCIsXG4gICAgZW46IFwiRW5nbGlzaFwiLFxuICAgIGphOiBcIkphcGFuZXNlXCIsXG4gIH1bbG9jYWxlXTtcblxuICBjb25zdCBwcm9qZWN0Q29udGV4dCA9IHJlYWRQcm9qZWN0U2tpbGxzKCk7XG4gIGNvbnN0IHByb2plY3RTZWN0aW9uID0gcHJvamVjdENvbnRleHRcbiAgICA/IGBcXG5QUk9KRUNUIENPTlRFWFQgKGJ1c2luZXNzIHJlcXVpcmVtZW50cyBhbmQgZG9tYWluIGtub3dsZWRnZSk6XFxuJHtwcm9qZWN0Q29udGV4dH1cXG5cXG5Vc2UgdGhlIGFib3ZlIHByb2plY3QgY29udGV4dCB0byB1bmRlcnN0YW5kIHRoZSBidXNpbmVzcyBkb21haW4sIGVudGl0eSBwdXJwb3NlcywgZmllbGQgbWVhbmluZ3MsIGFuZCByZWxhdGlvbnNoaXBzLiBHZW5lcmF0ZSBjb25lIG1ldGFkYXRhIHRoYXQgcmVmbGVjdHMgdGhpcyBwcm9qZWN0J3MgYWN0dWFsIHJlcXVpcmVtZW50cywgbm90IGdlbmVyaWMgYXNzdW1wdGlvbnMuXFxuYFxuICAgIDogXCJcIjtcblxuICByZXR1cm4gYFlvdSBhcmUgYSBTb25hbXUgZnJhbWV3b3JrIGV4cGVydC4gR2VuZXJhdGUgY29uZSBtZXRhZGF0YSBmb3IgZGF0YWJhc2UgZW50aXR5IGZpeHR1cmUgZ2VuZXJhdGlvbi5cblxuQ1JJVElDQUwgUFJJT1JJVFkgUlVMRTpcblRoZSBcIm5vdGVcIiBmaWVsZCBpcyB0aGUgUFJJTUFSWSBzb3VyY2UgZm9yIGZpeHR1cmUgZGF0YSBnZW5lcmF0aW9uLiBXaGVuIC0tdXNlLWxsbSBpcyBlbmFibGVkLCB0aGUgZml4dHVyZSBnZW5lcmF0b3IgcmVhZHMgY29uZS5ub3RlIGFuZCBhc2tzIExMTSB0byBnZW5lcmF0ZSBjb250ZXh0dWFsbHkgYXBwcm9wcmlhdGUgZGF0YSBCRUZPUkUgZmFsbGluZyBiYWNrIHRvIGZpeHR1cmVHZW5lcmF0b3IuXG5UaGVyZWZvcmUsIGNvbmUubm90ZSBtdXN0IGFsd2F5cyBjb250YWluIHJpY2gsIGRvbWFpbi1zcGVjaWZpYyBkZXNjcmlwdGlvbnMgd2l0aCBjb25jcmV0ZSBleGFtcGxlcyBhbmQgdmFsdWUgcmFuZ2VzLlxuZml4dHVyZUdlbmVyYXRvciBpcyBvbmx5IGEgRkFMTEJBQ0sgZm9yIHdoZW4gTExNIGlzIHVuYXZhaWxhYmxlIChubyBBUEkga2V5KS4gV3JpdGUgaXQgYXMgYSBiZXN0LWVmZm9ydCBhcHByb3hpbWF0aW9uLCBidXQgbmV2ZXIgcmVseSBvbiBpdCBhcyB0aGUgcHJpbWFyeSBnZW5lcmF0aW9uIG1ldGhvZC5cbiR7cHJvamVjdFNlY3Rpb259XG5FTlRJVFkgU1RSVUNUVVJFOlxuJHtKU09OLnN0cmluZ2lmeShjb250ZXh0LmVudGl0eSwgbnVsbCwgMil9XG5cbkxPQ0FMRTogJHtsb2NhbGV9ICgke2xvY2FsZURlc2N9KVxuXG5JTlNUUlVDVElPTlM6XG4xLiBFbnRpdHkgY29uZSBtZXRhZGF0YTpcbiAgIC0gbm90ZTogRGVzY3JpYmUgd2hhdCB0aGlzIGVudGl0eSByZXByZXNlbnRzLCBpdHMgcHVycG9zZSwgcmVsYXRpb25zaGlwcywgYnVzaW5lc3MgY29udGV4dCwgYW5kIG92ZXJhbGwgZ3VpZGFuY2UgZm9yIGdlbmVyYXRpbmcgdGVzdCBkYXRhLiBDb21iaW5lIGFsbCByZWxldmFudCBpbmZvcm1hdGlvbiBpbnRvIG9uZSBjb2hlcmVudCBkZXNjcmlwdGlvbi5cbiAgIC0gdGFnczogUmVsZXZhbnQgY2F0ZWdvcml6YXRpb24gdGFnc1xuXG4yLiBGb3IgZWFjaCBwcm9wLCBnZW5lcmF0ZSBhcHByb3ByaWF0ZSBjb25lIG1ldGFkYXRhOlxuICAgLSBub3RlIChNT1NUIElNUE9SVEFOVCk6IERlc2NyaWJlIHdoYXQgdGhpcyBmaWVsZCByZXByZXNlbnRzIGluIGJ1c2luZXNzIHRlcm1zLCBhbmQgcHJvdmlkZSBkZXRhaWxlZCBndWlkYW5jZSBmb3IgcmVhbGlzdGljIHRlc3QgZGF0YSBnZW5lcmF0aW9uLiBJbmNsdWRlIGNvbmNyZXRlIGV4YW1wbGVzLCB2YWx1ZSByYW5nZXMsIGZvcm1hdHRpbmcgcnVsZXMsIGFuZCBkb21haW4gY29uc3RyYWludHMuIFRoaXMgaXMgdGhlIHByaW1hcnkgaW5wdXQgTExNIHVzZXMgdG8gZ2VuZXJhdGUgZml4dHVyZSBkYXRhLlxuICAgLSBmaXh0dXJlR2VuZXJhdG9yOiBmYWtlci5qcyBleHByZXNzaW9uIGFzIEZBTExCQUNLIG9ubHkgKHNlZSBydWxlIDkgZm9yIGV4Y2VwdGlvbnMpLiBGb3IgZnJlZS10ZXh0IGZpZWxkcyB3aGVyZSBmYWtlciBjYW5ub3QgcHJvZHVjZSBkb21haW4tYXBwcm9wcmlhdGUgY29udGVudCAoZGVzY3JpcHRpb24sIHN1bW1hcnksIG5vdGUsIHJlYXNvbiwgdGl0bGUsIGV0Yy4pLCBwcmVmZXIgdXNpbmcgZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoWy4uLl0pIHdpdGggNS0xMCBkb21haW4tc3BlY2lmaWMgZXhhbXBsZSB2YWx1ZXMgcmF0aGVyIHRoYW4gZmFrZXIubG9yZW0uKi5cblxuMy4gRmllbGQgdHlwZSDihpIgZmFrZXIuanMgbWFwcGluZzpcbiAgIC0gZW1haWwg4oaSIGZha2VyLmludGVybmV0LmVtYWlsKClcbiAgIC0gcGhvbmUg4oaSIGZha2VyLnBob25lLm51bWJlcigpXG4gICAtIG5hbWUvdXNlcm5hbWUg4oaSIGZha2VyLnBlcnNvbi5mdWxsTmFtZSgpICh3aXRoIGxvY2FsZSlcbiAgIC0gYmlydGhfZGF0ZSDihpIgZmFrZXIuZGF0ZS5iaXJ0aGRhdGUoeyBtaW46IDE4LCBtYXg6IDY1LCBtb2RlOiAnYWdlJyB9KVxuICAgLSBzYWxhcnkg4oaSIGZha2VyLm51bWJlci5pbnQoeyBtaW46IDMwXzAwMF8wMDAsIG1heDogMTUwXzAwMF8wMDAgfSkgZm9yIGtvIGxvY2FsZVxuICAgLSBjb21wYW55X25hbWUg4oaSIGZha2VyLmNvbXBhbnkubmFtZSgpXG4gICAtIGFkZHJlc3Mg4oaSIGZha2VyLmxvY2F0aW9uLnN0cmVldEFkZHJlc3MoKVxuXG40LiBSZWxhdGlvbiBmaWVsZHMgKEJlbG9uZ3NUb09uZSwgT25lVG9PbmUgd2l0aCBoYXNKb2luQ29sdW1uKTpcbiAgIC0gQWx3YXlzIGFkZCBkYXRhU291cmNlOiB7IHN0cmF0ZWd5OiBcInJlY2VudFwiLCBjb25maWc6IHsgbGltaXQ6IDMtNSB9IH1cbiAgIC0gbm90ZTogRXhwbGFpbiB3aGF0IHRoaXMgcmVsYXRpb24gcmVwcmVzZW50cyBhbmQgdGhhdCBpdCByZWZlcmVuY2VzIGV4aXN0aW5nIGRhdGFcblxuNS4gU3Vic2V0cyBjb25lIG1ldGFkYXRhIChJTVBPUlRBTlQgLSBnZW5lcmF0ZSBmb3IgQUxMIHN1YnNldHMpOlxuICAgLSBub3RlOiBEZXNjcmliZSB3aGF0IHRoaXMgc3Vic2V0IHJlcHJlc2VudHMsIHdoYXQgZmllbGRzIGl0IGluY2x1ZGVzLCBhbmQgd2hlbiB0byB1c2UgaXRcblxuNi4gRW51bXMgY29uZSBtZXRhZGF0YSAoSU1QT1JUQU5UIC0gZ2VuZXJhdGUgZm9yIEFMTCBlbnVtcyk6XG4gICAtIG5vdGU6IERlc2NyaWJlIHdoYXQgdGhpcyBlbnVtIHJlcHJlc2VudHMuIElmIGFueSBwcm9wIHVzZXMgdGhpcyBlbnVtIHR5cGUsIGluY2x1ZGUgdGhlIHNhbWUgZ3VpZGFuY2UgZnJvbSB0aGF0IHByb3AncyBub3RlLlxuICAgLSBGb3IgZWFjaCBlbnVtIHZhbHVlLCBwcm92aWRlIG5vdGUgZXhwbGFpbmluZyB3aGF0IHRoYXQgc3BlY2lmaWMgdmFsdWUgbWVhbnNcblxuNy4gS29yZWFuIGZpZWxkIG5hbWVzIChsb2NhbGU9a28pOlxuICAgLSBJbmZlciBtZWFuaW5nIGFuZCBnZW5lcmF0ZSBhcHByb3ByaWF0ZSBmYWtlclxuICAgLSBcIuydtOumhFwiIOKGkiBmYWtlci5wZXJzb24uZnVsbE5hbWUoKVxuICAgLSBcIuyDneuFhOyblOydvFwiIOKGkiBmYWtlci5kYXRlLmJpcnRoZGF0ZSgpXG4gICAtIFwi7KO87IaMXCIg4oaSIGZha2VyLmxvY2F0aW9uLnN0cmVldEFkZHJlc3MoKVxuXG44LiBMb2NhbGUtc3BlY2lmaWMgdmFsdWVzOlxuICAgLSBrbzogS29yZWFuIG5hbWVzLCBhZGRyZXNzZXMsIHBob25lIG51bWJlcnMgKDAxMC1YWFhYLVhYWFggZm9ybWF0KVxuICAgLSBlbjogRW5nbGlzaCBuYW1lcywgVVMgYWRkcmVzc2VzXG4gICAtIGphOiBKYXBhbmVzZSBuYW1lcywgYWRkcmVzc2VzXG5cbjkuIENvcnJlbGF0ZWQgZmllbGRzIChJTVBPUlRBTlQgLSBkbyBOT1QgdXNlIGZpeHR1cmVHZW5lcmF0b3IgZm9yIHRoZXNlKTpcbiAgIElmIG11bHRpcGxlIHByb3BzIGFyZSBzZW1hbnRpY2FsbHkgcmVsYXRlZCBhbmQgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlciAoZS5nLiBuYW1lICsgbmFtZV9lbiwgbmFtZSArIG5hbWVfamEsIHRpdGxlICsgdGl0bGVfZW4pLCBkbyBOT1Qgc2V0IGZpeHR1cmVHZW5lcmF0b3Igb24gYW55IG9mIHRoZW0uXG4gICBJbnN0ZWFkLCBzZXQgb25seSBub3RlIHdpdGggYSBjbGVhciBkZXNjcmlwdGlvbiB0aGF0IGV4cGxhaW5zIHRoZSByZWxhdGlvbnNoaXAuXG4gICBFeGFtcGxlOiBpZiBuYW1lIGlzIGEgS29yZWFuIGZ1bGwgbmFtZSBsaWtlIFwi6rmA66+87IiYXCIsIHRoZW4gbmFtZV9lbiBtdXN0IGJlIGl0cyByb21hbml6ZWQgZm9ybSBcIktpbSBNaW5zdVwiLlxuICAgVGhlIGZpeHR1cmUgZ2VuZXJhdG9yIHdpbGwgcGFzcyBhbGwgc3VjaCBwcm9wcyB0b2dldGhlciB0byBMTE0gaW4gYSBzaW5nbGUgY2FsbCB0byBlbnN1cmUgY29uc2lzdGVuY3kuXG4gICBEZXRlY3Rpb24gcnVsZTogaWYgYSBwcm9wIG5hbWUgbWF0Y2hlcyBhbm90aGVyIHByb3AgbmFtZSB3aXRoIGEgbG9jYWxlIHN1ZmZpeCAoX2VuLCBfa28sIF9qYSwgX2NuKSBvciB2aWNlIHZlcnNhLCB0cmVhdCB0aGVtIGFzIGNvcnJlbGF0ZWQuXG5cbjEwLiBTdHJpbmcgUEsg4oCUIHNlcXVlbmNlIHZzIFVVSUQ6XG4gICAtIERCIHNlcXVlbmNlIGlkOiBJZiBhIHByb3AgbmFtZWQgXCJpZFwiIGhhcyB0eXBlIFwic3RyaW5nXCIgYW5kIHVzZXMgYSBEQiBzZXF1ZW5jZSAoaW5kaWNhdGVkIGJ5IGRiRGVmYXVsdCBjb250YWluaW5nIFwibmV4dHZhbFwiKSwgc2V0IGZpeHR1cmVTdHJhdGVneTogXCJzZXF1ZW5jZVwiIGFuZCBkbyBOT1Qgc2V0IGZpeHR1cmVHZW5lcmF0b3IuIG5vdGUgc2hvdWxkIG1lbnRpb24gc2VxdWVudGlhbCBudW1iZXIgc3RvcmVkIGFzIHN0cmluZy5cbiAgIC0gYmV0dGVyLWF1dGggZW50aXR5IGlkOiBBY2NvdW50LCBTZXNzaW9uLCBWZXJpZmljYXRpb24g7JeU7Yuw7Yuw7J2YIGlk64qUIGJldHRlci1hdXRo6rCAIGNyeXB0by5yYW5kb21VVUlEKCnroZwg7IOd7ISx7ZWY64qUIFVVSUTri6QuIGZpeHR1cmVTdHJhdGVneTogXCJzZXF1ZW5jZVwi66W8IOygiOuMgCDsgqzsmqntlZjsp4Ag66eQ6rOgLCBmaXh0dXJlR2VuZXJhdG9yOiBcImZha2VyLnN0cmluZy51dWlkKClcIuulvCDsgqzsmqntlZzri6QuXG5cbjExLiBmaXh0dXJlQ29tcGFuaW9ucyAoSU1QT1JUQU5UIC0gbmV2ZXIgZ2VuZXJhdGUgb3IgbW9kaWZ5KTpcbiAgIC0gZml4dHVyZUNvbXBhbmlvbnMgaXMgdXNlci1kZWNsYXJlZCBtZXRhZGF0YSB0aGF0IHRyaWdnZXJzIGF1dG9tYXRpYyBjb21wYW5pb24gZml4dHVyZSBjcmVhdGlvbiB3aGVuIGEgcGFyZW50IGZpeHR1cmUgaXMgZ2VuZXJhdGVkLlxuICAgLSBEbyBOT1QgZ2VuZXJhdGUgb3Igc3VnZ2VzdCBmaXh0dXJlQ29tcGFuaW9ucyBmb3IgYW55IHByb3AuIE9ubHkgdXNlcnMgZGVjbGFyZSB0aGlzIGludGVudGlvbmFsbHkuXG4gICAtIElmIGEgcHJvcCdzIGV4aXN0aW5nIGNvbmUgYWxyZWFkeSBjb250YWlucyBmaXh0dXJlQ29tcGFuaW9ucywgcHJlc2VydmUgaXQgZXhhY3RseSBhcy1pcyBpbiB0aGUgcHJvcENvbmVzIG91dHB1dC4gRG8gbm90IHJlbW92ZSwgYWx0ZXIsIG9yIG9taXQgaXQuXG4gICAtIEV4YW1wbGU6IGlmIFVzZXIgZW50aXR5J3MgXCJpZFwiIHByb3AgY29uZSBoYXMgZml4dHVyZUNvbXBhbmlvbnMsIGluY2x1ZGUgaXQgdW5jaGFuZ2VkIGluIHByb3BDb25lc1tcImlkXCJdLlxuXG4ke1xuICBjb250ZXh0LmV4aXN0aW5nQ29uZXNcbiAgICA/IGBcbkVYSVNUSU5HIENPTkVTIChwcmVzZXJ2ZSB0aGVzZSBpZiBwcmVzZW50KTpcbiR7SlNPTi5zdHJpbmdpZnkoY29udGV4dC5leGlzdGluZ0NvbmVzLCBudWxsLCAyKX1cbmBcbiAgICA6IFwiXCJcbn1cblxuT1VUUFVUIEZPUk1BVDpcblJldHVybiBPTkxZIHZhbGlkIEpTT04gKG5vIG1hcmtkb3duLCBubyBjb2RlIGJsb2NrcykuIFVzZSB0aGlzIGV4YWN0IHN0cnVjdHVyZTpcbntcbiAgXCJlbnRpdHlDb25lXCI6IHtcbiAgICBcIm5vdGVcIjogXCJEZXNjcmlwdGlvbiBvZiB0aGUgZW50aXR5LCBpdHMgcHVycG9zZSwgYW5kIGd1aWRhbmNlIGZvciBmaXh0dXJlIGdlbmVyYXRpb25cIixcbiAgICBcInRhZ3NcIjogW1wib3B0aW9uYWxcIiwgXCJ0YWdzXCJdXG4gIH0sXG4gIFwicHJvcENvbmVzXCI6IHtcbiAgICBcInByb3BfbmFtZVwiOiB7XG4gICAgICBcIm5vdGVcIjogXCJEZXNjcmlwdGlvbiBvZiB0aGlzIGZpZWxkIGFuZCBndWlkYW5jZSBmb3IgcmVhbGlzdGljIHRlc3QgZGF0YSBnZW5lcmF0aW9uXCIsXG4gICAgICBcImZpeHR1cmVHZW5lcmF0b3JcIjogXCJmYWtlci54eHgueXl5KClcIixcbiAgICAgIFwiZGF0YVNvdXJjZVwiOiB7IFwic3RyYXRlZ3lcIjogXCJyZWNlbnRcIiwgXCJjb25maWdcIjogeyBcImxpbWl0XCI6IDUgfSB9XG4gICAgfVxuICB9LFxuICBcInN1YnNldENvbmVzXCI6IHtcbiAgICBcIkFcIjoge1xuICAgICAgXCJub3RlXCI6IFwiRGVzY3JpcHRpb24gb2Ygc3Vic2V0IEEsIHdoYXQgZmllbGRzIGl0IGluY2x1ZGVzLCBhbmQgd2hlbiB0byB1c2UgaXRcIlxuICAgIH1cbiAgfSxcbiAgXCJlbnVtQ29uZXNcIjoge1xuICAgIFwiRW51bU5hbWVcIjoge1xuICAgICAgXCJub3RlXCI6IFwiRGVzY3JpcHRpb24gb2YgdGhlIGVudW0gYW5kIGd1aWRhbmNlIGZvciBnZW5lcmF0aW5nIHZhbHVlc1wiLFxuICAgICAgXCJ2YWx1ZXNcIjoge1xuICAgICAgICBcIlZBTFVFX0tFWVwiOiB7XG4gICAgICAgICAgXCJub3RlXCI6IFwiJHtsb2NhbGVEZXNjfSBkZXNjcmlwdGlvbiBvZiB0aGlzIGVudW0gdmFsdWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbklNUE9SVEFOVDogUmV0dXJuIHB1cmUgSlNPTiBvbmx5LiBEbyBOT1Qgd3JhcCBpbiBtYXJrZG93biBjb2RlIGJsb2Nrcy5gO1xufVxuXG4vKipcbiAqIEFudGhyb3BpYyBBUEnrpbwg7Zi47Lac7ZWY7JesIExMTSDsnZHri7XsnYQg67Cb7Iq164uI64ukLlxuICpcbiAqIEBwYXJhbSBwcm9tcHQgLSDsg53shLHtlaAg7ZSE66Gs7ZSE7Yq4XG4gKiBAcGFyYW0gYXBpS2V5IC0gQW50aHJvcGljIEFQSSDtgqRcbiAqIEByZXR1cm5zIExMTSDsnZHri7Ug7YWN7Iqk7Yq4IOuwjyDthqDtgbAg7IKs7Jqp65+JXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbGxBbnRocm9waWNBUEkoXG4gIHByb21wdDogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZyxcbik6IFByb21pc2U8eyB0ZXh0OiBzdHJpbmc7IHRva2Vuc1VzZWQ6IG51bWJlciB9PiB7XG4gIHRyeSB7XG4gICAgLy8gQGFpLXNkay9hbnRocm9waWPqs7wgYWkg7Yyo7YKk7KeA64qUIG9wdGlvbmFsIGRlcGVuZGVuY3nsnbTrr4DroZwg64+Z7KCBIGltcG9ydFxuICAgIGNvbnN0IHsgY3JlYXRlQW50aHJvcGljIH0gPSBhd2FpdCBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKTtcbiAgICBjb25zdCB7IGdlbmVyYXRlVGV4dCB9ID0gYXdhaXQgaW1wb3J0KFwiYWlcIik7XG5cbiAgICBjb25zdCBhbnRocm9waWMgPSBjcmVhdGVBbnRocm9waWMoe1xuICAgICAgYXBpS2V5LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyB0ZXh0LCB1c2FnZSB9ID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgIG1vZGVsOiBhbnRocm9waWMoXCJjbGF1ZGUtc29ubmV0LTQtNVwiKSxcbiAgICAgIHByb21wdCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRva2Vuc1VzZWQgPSB1c2FnZT8udG90YWxUb2tlbnMgfHwgMDtcbiAgICBpZiAodXNhZ2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbQ29uZSBHZW5lcmF0b3JdIFRva2VucyB1c2VkOiAke3Rva2Vuc1VzZWR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdGV4dCwgdG9rZW5zVXNlZCB9O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiYgXCJzdGF0dXNDb2RlXCIgaW4gZXJyb3IpIHtcbiAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSAoZXJyb3IgYXMgeyBzdGF0dXNDb2RlOiBudW1iZXIgfSkuc3RhdHVzQ29kZTtcbiAgICAgIGlmIChzdGF0dXNDb2RlID09PSA0MjkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmF0ZSBsaW1pdCBleGNlZWRlZC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCI7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBMTE0gQVBJIGZhaWxlZDogJHttZXNzYWdlfWApO1xuICB9XG59XG5cbi8qKlxuICogTExNIOydkeuLteydhCDtjIzsi7HtlZjsl6wgQ29uZUdlbmVyYXRpb25SZXN1bHTroZwg67OA7ZmY7ZWp64uI64ukLlxuICpcbiAqIE1hcmtkb3duIOy9lOuTnCDruJTroZ3snbQg7Y+s7ZWo65CY7Ja0IOyeiOycvOuptCDsoJzqsbDtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ29uZVJlc3BvbnNlKHRleHQ6IHN0cmluZyk6IENvbmVHZW5lcmF0aW9uUmVzdWx0IHtcbiAgbGV0IGpzb25UZXh0ID0gdGV4dC50cmltKCk7XG4gIGpzb25UZXh0ID0ganNvblRleHQucmVwbGFjZSgvXmBgYGpzb25cXHMqL2ksIFwiXCIpO1xuICBqc29uVGV4dCA9IGpzb25UZXh0LnJlcGxhY2UoL2BgYFxccyokLywgXCJcIik7XG4gIGpzb25UZXh0ID0ganNvblRleHQudHJpbSgpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG5cbiAgICBpZiAoIXBhcnNlZC5wcm9wQ29uZXMgfHwgdHlwZW9mIHBhcnNlZC5wcm9wQ29uZXMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcmVzcG9uc2U6IHByb3BDb25lcyBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBvYmplY3RcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0eUNvbmU6IHBhcnNlZC5lbnRpdHlDb25lLFxuICAgICAgcHJvcENvbmVzOiBwYXJzZWQucHJvcENvbmVzLFxuICAgICAgc3Vic2V0Q29uZXM6IHBhcnNlZC5zdWJzZXRDb25lcyB8fCB7fSxcbiAgICAgIGVudW1Db25lczogcGFyc2VkLmVudW1Db25lcyB8fCB7fSxcbiAgICAgIHRva2Vuc1VzZWQ6IDAsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIHBhcnNlIExMTSByZXNwb25zZTogJHttZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICBgT3JpZ2luYWwgcmVzcG9uc2U6XFxuJHt0ZXh0fVxcblxcbmAgK1xuICAgICAgICBgQ2xlYW5lZCBKU09OOlxcbiR7anNvblRleHR9YCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICog7IOd7ISx65CcIGNvbmXsnYQg6riw7KG0IGNvbmXqs7wg67OR7ZWp7ZWp64uI64ukLlxuICpcbiAqIOq4sOyhtCBjb25l7J20IOyeiOycvOuptCDrs7TsobTtlZjqs6AsIOyXhuuKlCDqsr3smrDsl5Drp4wg7IOd7ISx65CcIGNvbmXsnYQg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBtZXJnZVdpdGhFeGlzdGluZyhcbiAgZ2VuZXJhdGVkOiBDb25lR2VuZXJhdGlvblJlc3VsdCxcbiAgZXhpc3Rpbmc6IFJlY29yZDxzdHJpbmcsIENvbmU+LFxuKTogQ29uZUdlbmVyYXRpb25SZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSB7IC4uLmdlbmVyYXRlZCB9O1xuXG4gIGNvbnN0IGVudGl0eUtleSA9IGBlbnRpdHk6JHtnZW5lcmF0ZWQuZW50aXR5Q29uZSA/IFwicHJlc2VudFwiIDogXCJtaXNzaW5nXCJ9YDtcbiAgaWYgKGV4aXN0aW5nW2VudGl0eUtleV0pIHtcbiAgICByZXN1bHQuZW50aXR5Q29uZSA9IGV4aXN0aW5nW2VudGl0eUtleV07XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5wcm9wQ29uZXMpKSB7XG4gICAgY29uc3Qga2V5ID0gYHByb3A6JHtwcm9wTmFtZX1gO1xuICAgIGlmIChleGlzdGluZ1trZXldKSB7XG4gICAgICByZXN1bHQucHJvcENvbmVzW3Byb3BOYW1lXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnVtSWQgb2YgT2JqZWN0LmtleXMoZ2VuZXJhdGVkLmVudW1Db25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgZW51bToke2VudW1JZH1gO1xuICAgIGlmIChleGlzdGluZ1trZXldKSB7XG4gICAgICByZXN1bHQuZW51bUNvbmVzW2VudW1JZF0gPSBleGlzdGluZ1trZXldO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5zdWJzZXRDb25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgc3Vic2V0OiR7c3Vic2V0S2V5fWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0pIHtcbiAgICAgIHJlc3VsdC5zdWJzZXRDb25lc1tzdWJzZXRLZXldID0gZXhpc3Rpbmdba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIG5vdGXqsIAg7JeG64qUIGNvbmXrp4wg7IOd7ISx7ZWY6rOgIOuCmOuouOyngOuKlCDrs7TsobTtlanri4jri6QuXG4gKlxuICog6riw7KG0IGNvbmXsl5Agbm90ZeqwgCDsnojsnLzrqbQg67O07KG07ZWY6rOgLCDsl4bsnLzrqbQg7IOI66GcIOyDneyEseuQnCBjb25l7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VPbmx5RW1wdHkoXG4gIGdlbmVyYXRlZDogQ29uZUdlbmVyYXRpb25SZXN1bHQsXG4gIGV4aXN0aW5nOiBSZWNvcmQ8c3RyaW5nLCBDb25lPixcbik6IENvbmVHZW5lcmF0aW9uUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5nZW5lcmF0ZWQgfTtcblxuICAvLyBFbnRpdHkgY29uZTogc2NhbGXsnbQg7J6I7Jy866m0IOuztOyhtFxuICBjb25zdCBlbnRpdHlLZXkgPSBgZW50aXR5OiR7Z2VuZXJhdGVkLmVudGl0eUNvbmUgPyBcInByZXNlbnRcIiA6IFwibWlzc2luZ1wifWA7XG4gIGlmIChleGlzdGluZ1tlbnRpdHlLZXldPy5ub3RlKSB7XG4gICAgcmVzdWx0LmVudGl0eUNvbmUgPSBleGlzdGluZ1tlbnRpdHlLZXldO1xuICB9XG5cbiAgLy8gUHJvcCBjb25lczogc2NhbGXsnbQg7J6I7Jy866m0IOuztOyhtFxuICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5wcm9wQ29uZXMpKSB7XG4gICAgY29uc3Qga2V5ID0gYHByb3A6JHtwcm9wTmFtZX1gO1xuICAgIGlmIChleGlzdGluZ1trZXldPy5ub3RlKSB7XG4gICAgICByZXN1bHQucHJvcENvbmVzW3Byb3BOYW1lXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgLy8gRW51bSBjb25lczogc2NhbGXsnbQg7J6I7Jy866m0IOuztOyhtFxuICBmb3IgKGNvbnN0IGVudW1JZCBvZiBPYmplY3Qua2V5cyhnZW5lcmF0ZWQuZW51bUNvbmVzKSkge1xuICAgIGNvbnN0IGtleSA9IGBlbnVtOiR7ZW51bUlkfWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0/Lm5vdGUpIHtcbiAgICAgIHJlc3VsdC5lbnVtQ29uZXNbZW51bUlkXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgLy8gU3Vic2V0IGNvbmVzOiBzY2FsZeydtCDsnojsnLzrqbQg67O07KG0XG4gIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5zdWJzZXRDb25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgc3Vic2V0OiR7c3Vic2V0S2V5fWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0/Lm5vdGUpIHtcbiAgICAgIHJlc3VsdC5zdWJzZXRDb25lc1tzdWJzZXRLZXldID0gZXhpc3Rpbmdba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl0sIm5hbWVzIjpbImZzIiwicGF0aCIsImdlbmVyYXRlQ29uZXMiLCJjb250ZXh0IiwiYXBpS2V5IiwiZ2V0QXBpS2V5IiwicHJvbXB0IiwiYnVpbGRQcm9tcHQiLCJ0ZXh0IiwicmVzcG9uc2VUZXh0IiwidG9rZW5zVXNlZCIsImNhbGxBbnRocm9waWNBUEkiLCJyZXN1bHQiLCJwYXJzZUNvbmVSZXNwb25zZSIsImV4aXN0aW5nQ29uZXMiLCJvbmx5RW1wdHkiLCJtZXJnZU9ubHlFbXB0eSIsIm1lcmdlV2l0aEV4aXN0aW5nIiwiU29uYW11IiwicmVxdWlyZSIsInNlY3JldCIsImFudGhyb3BpY19hcGlfa2V5IiwidW5kZWZpbmVkIiwicHJvY2VzcyIsImVudiIsIkFOVEhST1BJQ19BUElfS0VZIiwiRXJyb3IiLCJyZWFkUHJvamVjdFNraWxscyIsInByb2plY3RSb290IiwiYXBwUm9vdFBhdGgiLCJjb250ZW50cyIsImNvbnRyYWN0RGlyIiwiam9pbiIsImV4aXN0c1N5bmMiLCJkb21haW5zIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwiZmlsdGVyIiwiZCIsImlzRGlyZWN0b3J5IiwibWFwIiwibmFtZSIsImRvbWFpbiIsImRvbWFpbkRpciIsImNvbnRyYWN0RmlsZXMiLCJmIiwiZW5kc1dpdGgiLCJmaWxlIiwiZmlsZVBhdGgiLCJjb250ZW50IiwicmVhZEZpbGVTeW5jIiwidHJpbSIsInB1c2giLCJhcmNoaXRlY3R1cmVQYXRoIiwibG9jYWxlIiwibG9jYWxlRGVzYyIsImtvIiwiZW4iLCJqYSIsInByb2plY3RDb250ZXh0IiwicHJvamVjdFNlY3Rpb24iLCJKU09OIiwic3RyaW5naWZ5IiwiZW50aXR5IiwiY3JlYXRlQW50aHJvcGljIiwiZ2VuZXJhdGVUZXh0IiwiYW50aHJvcGljIiwidXNhZ2UiLCJtb2RlbCIsInRvdGFsVG9rZW5zIiwiY29uc29sZSIsImxvZyIsImVycm9yIiwic3RhdHVzQ29kZSIsIm1lc3NhZ2UiLCJqc29uVGV4dCIsInJlcGxhY2UiLCJwYXJzZWQiLCJwYXJzZSIsInByb3BDb25lcyIsImVudGl0eUNvbmUiLCJzdWJzZXRDb25lcyIsImVudW1Db25lcyIsImdlbmVyYXRlZCIsImV4aXN0aW5nIiwiZW50aXR5S2V5IiwicHJvcE5hbWUiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiZW51bUlkIiwic3Vic2V0S2V5Iiwibm90ZSJdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWUEsUUFBUSxVQUFVO0FBQzlCLFlBQVlDLFVBQVUsWUFBWTtBQTZCbEM7Ozs7O0NBS0MsR0FDRCxPQUFPLGVBQWVDLGNBQWNDLE9BQThCO0lBQ2hFLE1BQU1DLFNBQVNDO0lBQ2YsTUFBTUMsU0FBU0MsWUFBWUo7SUFDM0IsTUFBTSxFQUFFSyxNQUFNQyxZQUFZLEVBQUVDLFVBQVUsRUFBRSxHQUFHLE1BQU1DLGlCQUFpQkwsUUFBUUY7SUFDMUUsTUFBTVEsU0FBU0Msa0JBQWtCSjtJQUNqQ0csT0FBT0YsVUFBVSxHQUFHQTtJQUVwQixJQUFJUCxRQUFRVyxhQUFhLEVBQUU7UUFDekIsSUFBSVgsUUFBUVksU0FBUyxFQUFFO1lBQ3JCLE9BQU9DLGVBQWVKLFFBQVFULFFBQVFXLGFBQWE7UUFDckQ7UUFDQSxPQUFPRyxrQkFBa0JMLFFBQVFULFFBQVFXLGFBQWE7SUFDeEQ7SUFFQSxPQUFPRjtBQUNUO0FBRUE7Ozs7Q0FJQyxHQUNELFNBQVNQO0lBQ1Asd0NBQXdDO0lBQ3hDLElBQUlEO0lBRUosSUFBSTtRQUNGLHNCQUFzQjtRQUN0QixNQUFNLEVBQUVjLE1B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
|
|
335
|
+
//#endregion
|
|
336
|
+
init_cone_generator();
|
|
337
|
+
export { generateCones };
|
|
338
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZS1nZW5lcmF0b3IuanMiLCJuYW1lcyI6WyJhcGlLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCIsImNvbnRlbnRzOiBzdHJpbmdbXSIsInBhdGgiLCJmcyIsImVycm9yOiB1bmtub3duIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmUvY29uZS1nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyB0eXBlIENvbmUsIHR5cGUgRW50aXR5SnNvbiB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuXG4vKipcbiAqIENvbmUg7IOd7ISxIOy7qO2FjeyKpO2KuFxuICpcbiAqIEVudGl0eSDsoJXrs7TsmYAg7IOd7ISxIOyYteyFmOydhCDri7Tqs6Ag7J6I7Iq164uI64ukLlxuICovXG5leHBvcnQgdHlwZSBDb25lR2VuZXJhdGlvbkNvbnRleHQgPSB7XG4gIGVudGl0eTogRW50aXR5SnNvbjtcbiAgbG9jYWxlPzogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiO1xuICBleGlzdGluZ0NvbmVzPzogUmVjb3JkPHN0cmluZywgQ29uZT47XG4gIC8qKiB0cnVl7J24IOqyveyasCBub3Rl6rCAIOyXhuuKlCBjb25l66eMIOyDneyEsSAqL1xuICBvbmx5RW1wdHk/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBDb25lIOyDneyEsSDqsrDqs7xcbiAqXG4gKiBFbnRpdHksIFByb3BzLCBTdWJzZXRzLCBFbnVtc+ydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDri7Tqs6Ag7J6I7Iq164uI64ukLlxuICovXG5leHBvcnQgdHlwZSBDb25lR2VuZXJhdGlvblJlc3VsdCA9IHtcbiAgZW50aXR5Q29uZT86IENvbmU7XG4gIHByb3BDb25lczogUmVjb3JkPHN0cmluZywgQ29uZT47XG4gIHN1YnNldENvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPjtcbiAgZW51bUNvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPjtcbiAgdG9rZW5zVXNlZDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBMTE3snYQg7IKs7Jqp7ZWY7JesIEVudGl0eeydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBFbnRpdHkg7KCV67O07JmAIOyDneyEsSDsmLXshZhcbiAqIEByZXR1cm5zIOyDneyEseuQnCBjb25lIOuplO2DgOuNsOydtO2EsFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDb25lcyhjb250ZXh0OiBDb25lR2VuZXJhdGlvbkNvbnRleHQpOiBQcm9taXNlPENvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gIGNvbnN0IGFwaUtleSA9IGdldEFwaUtleSgpO1xuICBjb25zdCBwcm9tcHQgPSBidWlsZFByb21wdChjb250ZXh0KTtcbiAgY29uc3QgeyB0ZXh0OiByZXNwb25zZVRleHQsIHRva2Vuc1VzZWQgfSA9IGF3YWl0IGNhbGxBbnRocm9waWNBUEkocHJvbXB0LCBhcGlLZXkpO1xuICBjb25zdCByZXN1bHQgPSBwYXJzZUNvbmVSZXNwb25zZShyZXNwb25zZVRleHQpO1xuICByZXN1bHQudG9rZW5zVXNlZCA9IHRva2Vuc1VzZWQ7XG5cbiAgaWYgKGNvbnRleHQuZXhpc3RpbmdDb25lcykge1xuICAgIGlmIChjb250ZXh0Lm9ubHlFbXB0eSkge1xuICAgICAgcmV0dXJuIG1lcmdlT25seUVtcHR5KHJlc3VsdCwgY29udGV4dC5leGlzdGluZ0NvbmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlV2l0aEV4aXN0aW5nKHJlc3VsdCwgY29udGV4dC5leGlzdGluZ0NvbmVzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQVBJIO2CpOulvCDqsIDsoLjsmLXri4jri6QuXG4gKlxuICogU29uYW11LnNlY3JldCDrmJDripQg7ZmY6rK967OA7IiY7JeQ7IScIOqwgOyguOyYteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gIC8vIFNvbmFtdS5zZWNyZXTsnYAg65+w7YOA7J6E7JeQIOuhnOuTnOuQmOuvgOuhnCDrj5nsoIHsnLzroZwgaW1wb3J0XG4gIGxldCBhcGlLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbmFtdeqwgCDstIjquLDtmZTrkJjslrQg7J6I64qUIOqyveyasFxuICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgIGFwaUtleSA9IFNvbmFtdS5zZWNyZXRzPy5hbnRocm9waWNfYXBpX2tleTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gU29uYW116rCAIOy0iOq4sO2ZlOuQmOyngCDslYrsnYAg6rK97JqwICjthYzsiqTtirgg65OxKVxuICAgIGFwaUtleSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghYXBpS2V5KSB7XG4gICAgYXBpS2V5ID0gcHJvY2Vzcy5lbnYuQU5USFJPUElDX0FQSV9LRVk7XG4gIH1cblxuICBpZiAoIWFwaUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQU5USFJPUElDX0FQSV9LRVkgbm90IGZvdW5kLiBcIiArXG4gICAgICAgIFwiU2V0IEFOVEhST1BJQ19BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGFkZCBpdCB0byBzb25hbXUuc2VjcmV0LnRzXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBhcGlLZXk7XG59XG5cbi8qKlxuICog64+E66mU7J2467OEIHtkb21haW59LmNvbnRyYWN0Lm1k7JmAIGFyY2hpdGVjdHVyZS5tZOulvCDsnb3slrQg7Luo7YWN7Iqk7Yq466GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAqXG4gKiAtIGNvbnRyYWN0L3tkb21haW59L3tkb21haW59LmNvbnRyYWN0Lm1kOiDrj4TrqZTsnbgg6rec7LmZ6rO8IOqysOyglSDqt7zqsbAgKOyjvCDssLjsobAg64yA7IOBKVxuICogLSAuY2xhdWRlL3NraWxscy9wcm9qZWN0L2FyY2hpdGVjdHVyZS5tZDog7JeU7Yuw7YuwIOyEpOqzhCDqtazsobAgKOuztOyhsCDssLjsobApXG4gKlxuICogY29uZSDsg53shLEg7IucIExMTeyXkOqyjCDsoITri6ztlZjsl6wg64+E66mU7J24IOunpeudveyXkCDrp57ripQg66mU7YOA642w7J207YSw66W8IOyDneyEse2VmOuPhOuhnSDtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHJlYWRQcm9qZWN0U2tpbGxzKCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBTb25hbXUgfSA9IHJlcXVpcmUoXCIuLi9hcGlcIik7XG4gICAgY29uc3QgcHJvamVjdFJvb3QgPSBTb25hbXUuYXBwUm9vdFBhdGg7XG4gICAgY29uc3QgY29udGVudHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBjb250cmFjdC8qKi8qLmNvbnRyYWN0Lm1kIOyImOynkVxuICAgIGNvbnN0IGNvbnRyYWN0RGlyID0gcGF0aC5qb2luKHByb2plY3RSb290LCBcImNvbnRyYWN0XCIpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbnRyYWN0RGlyKSkge1xuICAgICAgY29uc3QgZG9tYWlucyA9IGZzXG4gICAgICAgIC5yZWFkZGlyU3luYyhjb250cmFjdERpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gICAgICAgIC5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgLm1hcCgoZCkgPT4gZC5uYW1lKTtcblxuICAgICAgZm9yIChjb25zdCBkb21haW4gb2YgZG9tYWlucykge1xuICAgICAgICBjb25zdCBkb21haW5EaXIgPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIGRvbWFpbik7XG4gICAgICAgIGNvbnN0IGNvbnRyYWN0RmlsZXMgPSBmc1xuICAgICAgICAgIC5yZWFkZGlyU3luYyhkb21haW5EaXIpXG4gICAgICAgICAgLmZpbHRlcigoZjogc3RyaW5nKSA9PiBmLmVuZHNXaXRoKFwiLmNvbnRyYWN0Lm1kXCIpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgY29udHJhY3RGaWxlcykge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRvbWFpbkRpciwgZmlsZSk7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKS50cmltKCk7XG4gICAgICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgICAgIGNvbnRlbnRzLnB1c2goYC0tLSBjb250cmFjdC8ke2RvbWFpbn0vJHtmaWxlfSAtLS1cXG4ke2NvbnRlbnR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLmNsYXVkZS9za2lsbHMvcHJvamVjdC9hcmNoaXRlY3R1cmUubWQg67O07KGwIOywuOyhsFxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwcm9qZWN0Um9vdCxcbiAgICAgIFwiLmNsYXVkZVwiLFxuICAgICAgXCJza2lsbHNcIixcbiAgICAgIFwicHJvamVjdFwiLFxuICAgICAgXCJhcmNoaXRlY3R1cmUubWRcIixcbiAgICApO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGFyY2hpdGVjdHVyZVBhdGgpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFyY2hpdGVjdHVyZVBhdGgsIFwidXRmLThcIikudHJpbSgpO1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgY29udGVudHMucHVzaChgLS0tIGFyY2hpdGVjdHVyZS5tZCAtLS1cXG4ke2NvbnRlbnR9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnRzLmpvaW4oXCJcXG5cXG5cIik7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFNvbmFtdSDrr7jstIjquLDtmZQg65iQ64qUIO2MjOydvCDsoJHqt7wg7Jik66WYIOyLnCDruYgg66y47J6Q7Je0IOuwmO2ZmFxuICAgIHJldHVybiBcIlwiO1xuICB9XG59XG5cbi8qKlxuICogTExNIO2UhOuhrO2UhO2KuOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogYWktY2xpZW50LnRzIO2MqO2EtOydhCDssLjqs6DtlZjsl6wg66qF7ZmV7ZWcIOyngOyLnOyCrO2VreqzvCDstpzroKUg7ZiV7Iud7J2EIOygnOqzte2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRQcm9tcHQoY29udGV4dDogQ29uZUdlbmVyYXRpb25Db250ZXh0KTogc3RyaW5nIHtcbiAgY29uc3QgbG9jYWxlID0gY29udGV4dC5sb2NhbGUgfHwgXCJrb1wiO1xuICBjb25zdCBsb2NhbGVEZXNjID0ge1xuICAgIGtvOiBcIktvcmVhblwiLFxuICAgIGVuOiBcIkVuZ2xpc2hcIixcbiAgICBqYTogXCJKYXBhbmVzZVwiLFxuICB9W2xvY2FsZV07XG5cbiAgY29uc3QgcHJvamVjdENvbnRleHQgPSByZWFkUHJvamVjdFNraWxscygpO1xuICBjb25zdCBwcm9qZWN0U2VjdGlvbiA9IHByb2plY3RDb250ZXh0XG4gICAgPyBgXFxuUFJPSkVDVCBDT05URVhUIChidXNpbmVzcyByZXF1aXJlbWVudHMgYW5kIGRvbWFpbiBrbm93bGVkZ2UpOlxcbiR7cHJvamVjdENvbnRleHR9XFxuXFxuVXNlIHRoZSBhYm92ZSBwcm9qZWN0IGNvbnRleHQgdG8gdW5kZXJzdGFuZCB0aGUgYnVzaW5lc3MgZG9tYWluLCBlbnRpdHkgcHVycG9zZXMsIGZpZWxkIG1lYW5pbmdzLCBhbmQgcmVsYXRpb25zaGlwcy4gR2VuZXJhdGUgY29uZSBtZXRhZGF0YSB0aGF0IHJlZmxlY3RzIHRoaXMgcHJvamVjdCdzIGFjdHVhbCByZXF1aXJlbWVudHMsIG5vdCBnZW5lcmljIGFzc3VtcHRpb25zLlxcbmBcbiAgICA6IFwiXCI7XG5cbiAgcmV0dXJuIGBZb3UgYXJlIGEgU29uYW11IGZyYW1ld29yayBleHBlcnQuIEdlbmVyYXRlIGNvbmUgbWV0YWRhdGEgZm9yIGRhdGFiYXNlIGVudGl0eSBmaXh0dXJlIGdlbmVyYXRpb24uXG5cbkNSSVRJQ0FMIFBSSU9SSVRZIFJVTEU6XG5UaGUgXCJub3RlXCIgZmllbGQgaXMgdGhlIFBSSU1BUlkgc291cmNlIGZvciBmaXh0dXJlIGRhdGEgZ2VuZXJhdGlvbi4gV2hlbiAtLXVzZS1sbG0gaXMgZW5hYmxlZCwgdGhlIGZpeHR1cmUgZ2VuZXJhdG9yIHJlYWRzIGNvbmUubm90ZSBhbmQgYXNrcyBMTE0gdG8gZ2VuZXJhdGUgY29udGV4dHVhbGx5IGFwcHJvcHJpYXRlIGRhdGEgQkVGT1JFIGZhbGxpbmcgYmFjayB0byBmaXh0dXJlR2VuZXJhdG9yLlxuVGhlcmVmb3JlLCBjb25lLm5vdGUgbXVzdCBhbHdheXMgY29udGFpbiByaWNoLCBkb21haW4tc3BlY2lmaWMgZGVzY3JpcHRpb25zIHdpdGggY29uY3JldGUgZXhhbXBsZXMgYW5kIHZhbHVlIHJhbmdlcy5cbmZpeHR1cmVHZW5lcmF0b3IgaXMgb25seSBhIEZBTExCQUNLIGZvciB3aGVuIExMTSBpcyB1bmF2YWlsYWJsZSAobm8gQVBJIGtleSkuIFdyaXRlIGl0IGFzIGEgYmVzdC1lZmZvcnQgYXBwcm94aW1hdGlvbiwgYnV0IG5ldmVyIHJlbHkgb24gaXQgYXMgdGhlIHByaW1hcnkgZ2VuZXJhdGlvbiBtZXRob2QuXG4ke3Byb2plY3RTZWN0aW9ufVxuRU5USVRZIFNUUlVDVFVSRTpcbiR7SlNPTi5zdHJpbmdpZnkoY29udGV4dC5lbnRpdHksIG51bGwsIDIpfVxuXG5MT0NBTEU6ICR7bG9jYWxlfSAoJHtsb2NhbGVEZXNjfSlcblxuSU5TVFJVQ1RJT05TOlxuMS4gRW50aXR5IGNvbmUgbWV0YWRhdGE6XG4gICAtIG5vdGU6IERlc2NyaWJlIHdoYXQgdGhpcyBlbnRpdHkgcmVwcmVzZW50cywgaXRzIHB1cnBvc2UsIHJlbGF0aW9uc2hpcHMsIGJ1c2luZXNzIGNvbnRleHQsIGFuZCBvdmVyYWxsIGd1aWRhbmNlIGZvciBnZW5lcmF0aW5nIHRlc3QgZGF0YS4gQ29tYmluZSBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24gaW50byBvbmUgY29oZXJlbnQgZGVzY3JpcHRpb24uXG4gICAtIHRhZ3M6IFJlbGV2YW50IGNhdGVnb3JpemF0aW9uIHRhZ3NcblxuMi4gRm9yIGVhY2ggcHJvcCwgZ2VuZXJhdGUgYXBwcm9wcmlhdGUgY29uZSBtZXRhZGF0YTpcbiAgIC0gbm90ZSAoTU9TVCBJTVBPUlRBTlQpOiBEZXNjcmliZSB3aGF0IHRoaXMgZmllbGQgcmVwcmVzZW50cyBpbiBidXNpbmVzcyB0ZXJtcywgYW5kIHByb3ZpZGUgZGV0YWlsZWQgZ3VpZGFuY2UgZm9yIHJlYWxpc3RpYyB0ZXN0IGRhdGEgZ2VuZXJhdGlvbi4gSW5jbHVkZSBjb25jcmV0ZSBleGFtcGxlcywgdmFsdWUgcmFuZ2VzLCBmb3JtYXR0aW5nIHJ1bGVzLCBhbmQgZG9tYWluIGNvbnN0cmFpbnRzLiBUaGlzIGlzIHRoZSBwcmltYXJ5IGlucHV0IExMTSB1c2VzIHRvIGdlbmVyYXRlIGZpeHR1cmUgZGF0YS5cbiAgIC0gZml4dHVyZUdlbmVyYXRvcjogZmFrZXIuanMgZXhwcmVzc2lvbiBhcyBGQUxMQkFDSyBvbmx5IChzZWUgcnVsZSA5IGZvciBleGNlcHRpb25zKS4gRm9yIGZyZWUtdGV4dCBmaWVsZHMgd2hlcmUgZmFrZXIgY2Fubm90IHByb2R1Y2UgZG9tYWluLWFwcHJvcHJpYXRlIGNvbnRlbnQgKGRlc2NyaXB0aW9uLCBzdW1tYXJ5LCBub3RlLCByZWFzb24sIHRpdGxlLCBldGMuKSwgcHJlZmVyIHVzaW5nIGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KFsuLi5dKSB3aXRoIDUtMTAgZG9tYWluLXNwZWNpZmljIGV4YW1wbGUgdmFsdWVzIHJhdGhlciB0aGFuIGZha2VyLmxvcmVtLiouXG5cbjMuIEZpZWxkIHR5cGUg4oaSIGZha2VyLmpzIG1hcHBpbmc6XG4gICAtIGVtYWlsIOKGkiBmYWtlci5pbnRlcm5ldC5lbWFpbCgpXG4gICAtIHBob25lIOKGkiBmYWtlci5waG9uZS5udW1iZXIoKVxuICAgLSBuYW1lL3VzZXJuYW1lIOKGkiBmYWtlci5wZXJzb24uZnVsbE5hbWUoKSAod2l0aCBsb2NhbGUpXG4gICAtIGJpcnRoX2RhdGUg4oaSIGZha2VyLmRhdGUuYmlydGhkYXRlKHsgbWluOiAxOCwgbWF4OiA2NSwgbW9kZTogJ2FnZScgfSlcbiAgIC0gc2FsYXJ5IOKGkiBmYWtlci5udW1iZXIuaW50KHsgbWluOiAzMF8wMDBfMDAwLCBtYXg6IDE1MF8wMDBfMDAwIH0pIGZvciBrbyBsb2NhbGVcbiAgIC0gY29tcGFueV9uYW1lIOKGkiBmYWtlci5jb21wYW55Lm5hbWUoKVxuICAgLSBhZGRyZXNzIOKGkiBmYWtlci5sb2NhdGlvbi5zdHJlZXRBZGRyZXNzKClcblxuNC4gUmVsYXRpb24gZmllbGRzIChCZWxvbmdzVG9PbmUsIE9uZVRvT25lIHdpdGggaGFzSm9pbkNvbHVtbik6XG4gICAtIEFsd2F5cyBhZGQgZGF0YVNvdXJjZTogeyBzdHJhdGVneTogXCJyZWNlbnRcIiwgY29uZmlnOiB7IGxpbWl0OiAzLTUgfSB9XG4gICAtIG5vdGU6IEV4cGxhaW4gd2hhdCB0aGlzIHJlbGF0aW9uIHJlcHJlc2VudHMgYW5kIHRoYXQgaXQgcmVmZXJlbmNlcyBleGlzdGluZyBkYXRhXG5cbjUuIFN1YnNldHMgY29uZSBtZXRhZGF0YSAoSU1QT1JUQU5UIC0gZ2VuZXJhdGUgZm9yIEFMTCBzdWJzZXRzKTpcbiAgIC0gbm90ZTogRGVzY3JpYmUgd2hhdCB0aGlzIHN1YnNldCByZXByZXNlbnRzLCB3aGF0IGZpZWxkcyBpdCBpbmNsdWRlcywgYW5kIHdoZW4gdG8gdXNlIGl0XG5cbjYuIEVudW1zIGNvbmUgbWV0YWRhdGEgKElNUE9SVEFOVCAtIGdlbmVyYXRlIGZvciBBTEwgZW51bXMpOlxuICAgLSBub3RlOiBEZXNjcmliZSB3aGF0IHRoaXMgZW51bSByZXByZXNlbnRzLiBJZiBhbnkgcHJvcCB1c2VzIHRoaXMgZW51bSB0eXBlLCBpbmNsdWRlIHRoZSBzYW1lIGd1aWRhbmNlIGZyb20gdGhhdCBwcm9wJ3Mgbm90ZS5cbiAgIC0gRm9yIGVhY2ggZW51bSB2YWx1ZSwgcHJvdmlkZSBub3RlIGV4cGxhaW5pbmcgd2hhdCB0aGF0IHNwZWNpZmljIHZhbHVlIG1lYW5zXG5cbjcuIEtvcmVhbiBmaWVsZCBuYW1lcyAobG9jYWxlPWtvKTpcbiAgIC0gSW5mZXIgbWVhbmluZyBhbmQgZ2VuZXJhdGUgYXBwcm9wcmlhdGUgZmFrZXJcbiAgIC0gXCLsnbTrpoRcIiDihpIgZmFrZXIucGVyc29uLmZ1bGxOYW1lKClcbiAgIC0gXCLsg53rhYTsm5TsnbxcIiDihpIgZmFrZXIuZGF0ZS5iaXJ0aGRhdGUoKVxuICAgLSBcIuyjvOyGjFwiIOKGkiBmYWtlci5sb2NhdGlvbi5zdHJlZXRBZGRyZXNzKClcblxuOC4gTG9jYWxlLXNwZWNpZmljIHZhbHVlczpcbiAgIC0ga286IEtvcmVhbiBuYW1lcywgYWRkcmVzc2VzLCBwaG9uZSBudW1iZXJzICgwMTAtWFhYWC1YWFhYIGZvcm1hdClcbiAgIC0gZW46IEVuZ2xpc2ggbmFtZXMsIFVTIGFkZHJlc3Nlc1xuICAgLSBqYTogSmFwYW5lc2UgbmFtZXMsIGFkZHJlc3Nlc1xuXG45LiBDb3JyZWxhdGVkIGZpZWxkcyAoSU1QT1JUQU5UIC0gZG8gTk9UIHVzZSBmaXh0dXJlR2VuZXJhdG9yIGZvciB0aGVzZSk6XG4gICBJZiBtdWx0aXBsZSBwcm9wcyBhcmUgc2VtYW50aWNhbGx5IHJlbGF0ZWQgYW5kIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXIgKGUuZy4gbmFtZSArIG5hbWVfZW4sIG5hbWUgKyBuYW1lX2phLCB0aXRsZSArIHRpdGxlX2VuKSwgZG8gTk9UIHNldCBmaXh0dXJlR2VuZXJhdG9yIG9uIGFueSBvZiB0aGVtLlxuICAgSW5zdGVhZCwgc2V0IG9ubHkgbm90ZSB3aXRoIGEgY2xlYXIgZGVzY3JpcHRpb24gdGhhdCBleHBsYWlucyB0aGUgcmVsYXRpb25zaGlwLlxuICAgRXhhbXBsZTogaWYgbmFtZSBpcyBhIEtvcmVhbiBmdWxsIG5hbWUgbGlrZSBcIuq5gOuvvOyImFwiLCB0aGVuIG5hbWVfZW4gbXVzdCBiZSBpdHMgcm9tYW5pemVkIGZvcm0gXCJLaW0gTWluc3VcIi5cbiAgIFRoZSBmaXh0dXJlIGdlbmVyYXRvciB3aWxsIHBhc3MgYWxsIHN1Y2ggcHJvcHMgdG9nZXRoZXIgdG8gTExNIGluIGEgc2luZ2xlIGNhbGwgdG8gZW5zdXJlIGNvbnNpc3RlbmN5LlxuICAgRGV0ZWN0aW9uIHJ1bGU6IGlmIGEgcHJvcCBuYW1lIG1hdGNoZXMgYW5vdGhlciBwcm9wIG5hbWUgd2l0aCBhIGxvY2FsZSBzdWZmaXggKF9lbiwgX2tvLCBfamEsIF9jbikgb3IgdmljZSB2ZXJzYSwgdHJlYXQgdGhlbSBhcyBjb3JyZWxhdGVkLlxuXG4xMC4gU3RyaW5nIFBLIOKAlCBzZXF1ZW5jZSB2cyBVVUlEOlxuICAgLSBEQiBzZXF1ZW5jZSBpZDogSWYgYSBwcm9wIG5hbWVkIFwiaWRcIiBoYXMgdHlwZSBcInN0cmluZ1wiIGFuZCB1c2VzIGEgREIgc2VxdWVuY2UgKGluZGljYXRlZCBieSBkYkRlZmF1bHQgY29udGFpbmluZyBcIm5leHR2YWxcIiksIHNldCBmaXh0dXJlU3RyYXRlZ3k6IFwic2VxdWVuY2VcIiBhbmQgZG8gTk9UIHNldCBmaXh0dXJlR2VuZXJhdG9yLiBub3RlIHNob3VsZCBtZW50aW9uIHNlcXVlbnRpYWwgbnVtYmVyIHN0b3JlZCBhcyBzdHJpbmcuXG4gICAtIGJldHRlci1hdXRoIGVudGl0eSBpZDogQWNjb3VudCwgU2Vzc2lvbiwgVmVyaWZpY2F0aW9uIOyXlO2LsO2LsOydmCBpZOuKlCBiZXR0ZXItYXV0aOqwgCBjcnlwdG8ucmFuZG9tVVVJRCgp66GcIOyDneyEse2VmOuKlCBVVUlE64ukLiBmaXh0dXJlU3RyYXRlZ3k6IFwic2VxdWVuY2VcIuulvCDsoIjrjIAg7IKs7Jqp7ZWY7KeAIOunkOqzoCwgZml4dHVyZUdlbmVyYXRvcjogXCJmYWtlci5zdHJpbmcudXVpZCgpXCLrpbwg7IKs7Jqp7ZWc64ukLlxuXG4xMS4gZml4dHVyZUNvbXBhbmlvbnMgKElNUE9SVEFOVCAtIG5ldmVyIGdlbmVyYXRlIG9yIG1vZGlmeSk6XG4gICAtIGZpeHR1cmVDb21wYW5pb25zIGlzIHVzZXItZGVjbGFyZWQgbWV0YWRhdGEgdGhhdCB0cmlnZ2VycyBhdXRvbWF0aWMgY29tcGFuaW9uIGZpeHR1cmUgY3JlYXRpb24gd2hlbiBhIHBhcmVudCBmaXh0dXJlIGlzIGdlbmVyYXRlZC5cbiAgIC0gRG8gTk9UIGdlbmVyYXRlIG9yIHN1Z2dlc3QgZml4dHVyZUNvbXBhbmlvbnMgZm9yIGFueSBwcm9wLiBPbmx5IHVzZXJzIGRlY2xhcmUgdGhpcyBpbnRlbnRpb25hbGx5LlxuICAgLSBJZiBhIHByb3AncyBleGlzdGluZyBjb25lIGFscmVhZHkgY29udGFpbnMgZml4dHVyZUNvbXBhbmlvbnMsIHByZXNlcnZlIGl0IGV4YWN0bHkgYXMtaXMgaW4gdGhlIHByb3BDb25lcyBvdXRwdXQuIERvIG5vdCByZW1vdmUsIGFsdGVyLCBvciBvbWl0IGl0LlxuICAgLSBFeGFtcGxlOiBpZiBVc2VyIGVudGl0eSdzIFwiaWRcIiBwcm9wIGNvbmUgaGFzIGZpeHR1cmVDb21wYW5pb25zLCBpbmNsdWRlIGl0IHVuY2hhbmdlZCBpbiBwcm9wQ29uZXNbXCJpZFwiXS5cblxuJHtcbiAgY29udGV4dC5leGlzdGluZ0NvbmVzXG4gICAgPyBgXG5FWElTVElORyBDT05FUyAocHJlc2VydmUgdGhlc2UgaWYgcHJlc2VudCk6XG4ke0pTT04uc3RyaW5naWZ5KGNvbnRleHQuZXhpc3RpbmdDb25lcywgbnVsbCwgMil9XG5gXG4gICAgOiBcIlwiXG59XG5cbk9VVFBVVCBGT1JNQVQ6XG5SZXR1cm4gT05MWSB2YWxpZCBKU09OIChubyBtYXJrZG93biwgbm8gY29kZSBibG9ja3MpLiBVc2UgdGhpcyBleGFjdCBzdHJ1Y3R1cmU6XG57XG4gIFwiZW50aXR5Q29uZVwiOiB7XG4gICAgXCJub3RlXCI6IFwiRGVzY3JpcHRpb24gb2YgdGhlIGVudGl0eSwgaXRzIHB1cnBvc2UsIGFuZCBndWlkYW5jZSBmb3IgZml4dHVyZSBnZW5lcmF0aW9uXCIsXG4gICAgXCJ0YWdzXCI6IFtcIm9wdGlvbmFsXCIsIFwidGFnc1wiXVxuICB9LFxuICBcInByb3BDb25lc1wiOiB7XG4gICAgXCJwcm9wX25hbWVcIjoge1xuICAgICAgXCJub3RlXCI6IFwiRGVzY3JpcHRpb24gb2YgdGhpcyBmaWVsZCBhbmQgZ3VpZGFuY2UgZm9yIHJlYWxpc3RpYyB0ZXN0IGRhdGEgZ2VuZXJhdGlvblwiLFxuICAgICAgXCJmaXh0dXJlR2VuZXJhdG9yXCI6IFwiZmFrZXIueHh4Lnl5eSgpXCIsXG4gICAgICBcImRhdGFTb3VyY2VcIjogeyBcInN0cmF0ZWd5XCI6IFwicmVjZW50XCIsIFwiY29uZmlnXCI6IHsgXCJsaW1pdFwiOiA1IH0gfVxuICAgIH1cbiAgfSxcbiAgXCJzdWJzZXRDb25lc1wiOiB7XG4gICAgXCJBXCI6IHtcbiAgICAgIFwibm90ZVwiOiBcIkRlc2NyaXB0aW9uIG9mIHN1YnNldCBBLCB3aGF0IGZpZWxkcyBpdCBpbmNsdWRlcywgYW5kIHdoZW4gdG8gdXNlIGl0XCJcbiAgICB9XG4gIH0sXG4gIFwiZW51bUNvbmVzXCI6IHtcbiAgICBcIkVudW1OYW1lXCI6IHtcbiAgICAgIFwibm90ZVwiOiBcIkRlc2NyaXB0aW9uIG9mIHRoZSBlbnVtIGFuZCBndWlkYW5jZSBmb3IgZ2VuZXJhdGluZyB2YWx1ZXNcIixcbiAgICAgIFwidmFsdWVzXCI6IHtcbiAgICAgICAgXCJWQUxVRV9LRVlcIjoge1xuICAgICAgICAgIFwibm90ZVwiOiBcIiR7bG9jYWxlRGVzY30gZGVzY3JpcHRpb24gb2YgdGhpcyBlbnVtIHZhbHVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5JTVBPUlRBTlQ6IFJldHVybiBwdXJlIEpTT04gb25seS4gRG8gTk9UIHdyYXAgaW4gbWFya2Rvd24gY29kZSBibG9ja3MuYDtcbn1cblxuLyoqXG4gKiBBbnRocm9waWMgQVBJ66W8IO2YuOy2nO2VmOyXrCBMTE0g7J2R64u17J2EIOuwm+yKteuLiOuLpC5cbiAqXG4gKiBAcGFyYW0gcHJvbXB0IC0g7IOd7ISx7ZWgIO2UhOuhrO2UhO2KuFxuICogQHBhcmFtIGFwaUtleSAtIEFudGhyb3BpYyBBUEkg7YKkXG4gKiBAcmV0dXJucyBMTE0g7J2R64u1IO2FjeyKpO2KuCDrsI8g7Yag7YGwIOyCrOyaqeufiVxuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsQW50aHJvcGljQVBJKFxuICBwcm9tcHQ6IHN0cmluZyxcbiAgYXBpS2V5OiBzdHJpbmcsXG4pOiBQcm9taXNlPHsgdGV4dDogc3RyaW5nOyB0b2tlbnNVc2VkOiBudW1iZXIgfT4ge1xuICB0cnkge1xuICAgIC8vIEBhaS1zZGsvYW50aHJvcGlj6rO8IGFpIO2MqO2CpOyngOuKlCBvcHRpb25hbCBkZXBlbmRlbmN57J2066+A66GcIOuPmeyggSBpbXBvcnRcbiAgICBjb25zdCB7IGNyZWF0ZUFudGhyb3BpYyB9ID0gYXdhaXQgaW1wb3J0KFwiQGFpLXNkay9hbnRocm9waWNcIik7XG4gICAgY29uc3QgeyBnZW5lcmF0ZVRleHQgfSA9IGF3YWl0IGltcG9ydChcImFpXCIpO1xuXG4gICAgY29uc3QgYW50aHJvcGljID0gY3JlYXRlQW50aHJvcGljKHtcbiAgICAgIGFwaUtleSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgdGV4dCwgdXNhZ2UgfSA9IGF3YWl0IGdlbmVyYXRlVGV4dCh7XG4gICAgICBtb2RlbDogYW50aHJvcGljKFwiY2xhdWRlLXNvbm5ldC00LTZcIiksXG4gICAgICBwcm9tcHQsXG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbnNVc2VkID0gdXNhZ2U/LnRvdGFsVG9rZW5zIHx8IDA7XG4gICAgaWYgKHVzYWdlKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW0NvbmUgR2VuZXJhdG9yXSBUb2tlbnMgdXNlZDogJHt0b2tlbnNVc2VkfWApO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRleHQsIHRva2Vuc1VzZWQgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiICYmIFwic3RhdHVzQ29kZVwiIGluIGVycm9yKSB7XG4gICAgICBjb25zdCBzdGF0dXNDb2RlID0gKGVycm9yIGFzIHsgc3RhdHVzQ29kZTogbnVtYmVyIH0pLnN0YXR1c0NvZGU7XG4gICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDI5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJhdGUgbGltaXQgZXhjZWVkZWQuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCIsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgIHRocm93IG5ldyBFcnJvcihgTExNIEFQSSBmYWlsZWQ6ICR7bWVzc2FnZX1gLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgfVxufVxuXG4vKipcbiAqIExMTSDsnZHri7XsnYQg7YyM7Iux7ZWY7JesIENvbmVHZW5lcmF0aW9uUmVzdWx066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqXG4gKiBNYXJrZG93biDsvZTrk5wg67iU66Gd7J20IO2PrO2VqOuQmOyWtCDsnojsnLzrqbQg7KCc6rGw7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBwYXJzZUNvbmVSZXNwb25zZSh0ZXh0OiBzdHJpbmcpOiBDb25lR2VuZXJhdGlvblJlc3VsdCB7XG4gIGxldCBqc29uVGV4dCA9IHRleHQudHJpbSgpO1xuICBqc29uVGV4dCA9IGpzb25UZXh0LnJlcGxhY2UoL15gYGBqc29uXFxzKi9pLCBcIlwiKTtcbiAganNvblRleHQgPSBqc29uVGV4dC5yZXBsYWNlKC9gYGBcXHMqJC8sIFwiXCIpO1xuICBqc29uVGV4dCA9IGpzb25UZXh0LnRyaW0oKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoanNvblRleHQpO1xuXG4gICAgaWYgKCFwYXJzZWQucHJvcENvbmVzIHx8IHR5cGVvZiBwYXJzZWQucHJvcENvbmVzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJlc3BvbnNlOiBwcm9wQ29uZXMgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0XCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBlbnRpdHlDb25lOiBwYXJzZWQuZW50aXR5Q29uZSxcbiAgICAgIHByb3BDb25lczogcGFyc2VkLnByb3BDb25lcyxcbiAgICAgIHN1YnNldENvbmVzOiBwYXJzZWQuc3Vic2V0Q29uZXMgfHwge30sXG4gICAgICBlbnVtQ29uZXM6IHBhcnNlZC5lbnVtQ29uZXMgfHwge30sXG4gICAgICB0b2tlbnNVc2VkOiAwLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCI7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBwYXJzZSBMTE0gcmVzcG9uc2U6ICR7bWVzc2FnZX1cXG5cXG5gICtcbiAgICAgICAgYE9yaWdpbmFsIHJlc3BvbnNlOlxcbiR7dGV4dH1cXG5cXG5gICtcbiAgICAgICAgYENsZWFuZWQgSlNPTjpcXG4ke2pzb25UZXh0fWAsXG4gICAgICB7IGNhdXNlOiBlcnJvciB9LFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiDsg53shLHrkJwgY29uZeydhCDquLDsobQgY29uZeqzvCDrs5Htlantlanri4jri6QuXG4gKlxuICog6riw7KG0IGNvbmXsnbQg7J6I7Jy866m0IOuztOyhtO2VmOqzoCwg7JeG64qUIOqyveyasOyXkOunjCDsg53shLHrkJwgY29uZeydhCDsgqzsmqntlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlV2l0aEV4aXN0aW5nKFxuICBnZW5lcmF0ZWQ6IENvbmVHZW5lcmF0aW9uUmVzdWx0LFxuICBleGlzdGluZzogUmVjb3JkPHN0cmluZywgQ29uZT4sXG4pOiBDb25lR2VuZXJhdGlvblJlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgLi4uZ2VuZXJhdGVkIH07XG5cbiAgY29uc3QgZW50aXR5S2V5ID0gYGVudGl0eToke2dlbmVyYXRlZC5lbnRpdHlDb25lID8gXCJwcmVzZW50XCIgOiBcIm1pc3NpbmdcIn1gO1xuICBpZiAoZXhpc3RpbmdbZW50aXR5S2V5XSkge1xuICAgIHJlc3VsdC5lbnRpdHlDb25lID0gZXhpc3RpbmdbZW50aXR5S2V5XTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMoZ2VuZXJhdGVkLnByb3BDb25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgcHJvcDoke3Byb3BOYW1lfWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0pIHtcbiAgICAgIHJlc3VsdC5wcm9wQ29uZXNbcHJvcE5hbWVdID0gZXhpc3Rpbmdba2V5XTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGVudW1JZCBvZiBPYmplY3Qua2V5cyhnZW5lcmF0ZWQuZW51bUNvbmVzKSkge1xuICAgIGNvbnN0IGtleSA9IGBlbnVtOiR7ZW51bUlkfWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0pIHtcbiAgICAgIHJlc3VsdC5lbnVtQ29uZXNbZW51bUlkXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgT2JqZWN0LmtleXMoZ2VuZXJhdGVkLnN1YnNldENvbmVzKSkge1xuICAgIGNvbnN0IGtleSA9IGBzdWJzZXQ6JHtzdWJzZXRLZXl9YDtcbiAgICBpZiAoZXhpc3Rpbmdba2V5XSkge1xuICAgICAgcmVzdWx0LnN1YnNldENvbmVzW3N1YnNldEtleV0gPSBleGlzdGluZ1trZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogbm90ZeqwgCDsl4bripQgY29uZeunjCDsg53shLHtlZjqs6Ag64KY66i47KeA64qUIOuztOyhtO2VqeuLiOuLpC5cbiAqXG4gKiDquLDsobQgY29uZeyXkCBub3Rl6rCAIOyeiOycvOuptCDrs7TsobTtlZjqs6AsIOyXhuycvOuptCDsg4jroZwg7IOd7ISx65CcIGNvbmXsnYQg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBtZXJnZU9ubHlFbXB0eShcbiAgZ2VuZXJhdGVkOiBDb25lR2VuZXJhdGlvblJlc3VsdCxcbiAgZXhpc3Rpbmc6IFJlY29yZDxzdHJpbmcsIENvbmU+LFxuKTogQ29uZUdlbmVyYXRpb25SZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSB7IC4uLmdlbmVyYXRlZCB9O1xuXG4gIC8vIEVudGl0eSBjb25lOiBzY2FsZeydtCDsnojsnLzrqbQg67O07KG0XG4gIGNvbnN0IGVudGl0eUtleSA9IGBlbnRpdHk6JHtnZW5lcmF0ZWQuZW50aXR5Q29uZSA/IFwicHJlc2VudFwiIDogXCJtaXNzaW5nXCJ9YDtcbiAgaWYgKGV4aXN0aW5nW2VudGl0eUtleV0/Lm5vdGUpIHtcbiAgICByZXN1bHQuZW50aXR5Q29uZSA9IGV4aXN0aW5nW2VudGl0eUtleV07XG4gIH1cblxuICAvLyBQcm9wIGNvbmVzOiBzY2FsZeydtCDsnojsnLzrqbQg67O07KG0XG4gIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMoZ2VuZXJhdGVkLnByb3BDb25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgcHJvcDoke3Byb3BOYW1lfWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0/Lm5vdGUpIHtcbiAgICAgIHJlc3VsdC5wcm9wQ29uZXNbcHJvcE5hbWVdID0gZXhpc3Rpbmdba2V5XTtcbiAgICB9XG4gIH1cblxuICAvLyBFbnVtIGNvbmVzOiBzY2FsZeydtCDsnojsnLzrqbQg67O07KG0XG4gIGZvciAoY29uc3QgZW51bUlkIG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5lbnVtQ29uZXMpKSB7XG4gICAgY29uc3Qga2V5ID0gYGVudW06JHtlbnVtSWR9YDtcbiAgICBpZiAoZXhpc3Rpbmdba2V5XT8ubm90ZSkge1xuICAgICAgcmVzdWx0LmVudW1Db25lc1tlbnVtSWRdID0gZXhpc3Rpbmdba2V5XTtcbiAgICB9XG4gIH1cblxuICAvLyBTdWJzZXQgY29uZXM6IHNjYWxl7J20IOyeiOycvOuptCDrs7TsobRcbiAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgT2JqZWN0LmtleXMoZ2VuZXJhdGVkLnN1YnNldENvbmVzKSkge1xuICAgIGNvbnN0IGtleSA9IGBzdWJzZXQ6JHtzdWJzZXRLZXl9YDtcbiAgICBpZiAoZXhpc3Rpbmdba2V5XT8ubm90ZSkge1xuICAgICAgcmVzdWx0LnN1YnNldENvbmVzW3N1YnNldEtleV0gPSBleGlzdGluZ1trZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQXFDQSxlQUFzQixjQUFjLFNBQStEO0NBQ2pHLE1BQU0sU0FBUyxXQUFXO0NBQzFCLE1BQU0sU0FBUyxZQUFZLFFBQVE7Q0FDbkMsTUFBTSxFQUFFLE1BQU0sY0FBYyxlQUFlLE1BQU0saUJBQWlCLFFBQVEsT0FBTztDQUNqRixNQUFNLFNBQVMsa0JBQWtCLGFBQWE7QUFDOUMsUUFBTyxhQUFhO0FBRXBCLEtBQUksUUFBUSxlQUFlO0FBQ3pCLE1BQUksUUFBUSxXQUFXO0FBQ3JCLFVBQU8sZUFBZSxRQUFRLFFBQVEsY0FBYzs7QUFFdEQsU0FBTyxrQkFBa0IsUUFBUSxRQUFRLGNBQWM7O0FBR3pELFFBQU87Ozs7Ozs7QUFRVCxTQUFTLFlBQW9CO0NBRTNCLElBQUlBO0FBRUosS0FBSTtFQUVGLE1BQU0sRUFBRTtBQUNSLFdBQVMsT0FBTyxTQUFTO1NBQ25CO0FBRU4sV0FBUzs7QUFHWCxLQUFJLENBQUMsUUFBUTtBQUNYLFdBQVMsUUFBUSxJQUFJOztBQUd2QixLQUFJLENBQUMsUUFBUTtB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_batch_update.d.ts","sourceRoot":"","sources":["../../src/database/_batch_update.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"_batch_update.d.ts","sourceRoot":"","sources":["../../src/database/_batch_update.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACpD,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,MAAM,IAAI;KACxC,GAAG,IAAI,EAAE,GAAG,WAAW;CACzB,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEhC;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,EAAE,SAAS,MAAM,EACjD,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,EAAE,EAAE,EACT,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,EACrB,SAAS,SAAK,EACd,GAAG,GAAE,IAAI,CAAC,WAAW,GAAG,IAAW,iBA+BpC"}
|