sonamu 0.8.26 → 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 -157
- 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 +6 -7
- 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 +1 -1
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +406 -407
- 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 +31 -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 +6 -5
- 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 +5 -3
- 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 +33 -32
- package/src/database/puri-subset.types.ts +6 -7
- 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 +111 -104
- 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 +11 -17
- 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 +6 -5
- package/src/ui/api.ts +25 -23
- package/src/ui/cdd-service.ts +12 -11
- 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 -89
- 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-CKo0Z2Iu.css +0 -1
- package/dist/ui-web/assets/index-DK-2aacv.js +0 -257
|
@@ -1,278 +1,242 @@
|
|
|
1
|
+
import { EntityManager, init_entity_manager } from "../../entity/entity-manager.js";
|
|
2
|
+
import { Template, init_template } from "../template.js";
|
|
3
|
+
import { getEnumInfoFromColName, getRelationNameFromColumnName, getRelationPropFromColName, init_helpers } from "../helpers.js";
|
|
1
4
|
import inflection from "inflection";
|
|
5
|
+
import { z as z$1 } from "zod";
|
|
2
6
|
import { flat } from "radashi";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
label = `SD("common.${camelName}")`;
|
|
237
|
-
} else {
|
|
238
|
-
const labelName = getRelationNameFromColumnName(entityId, col.name);
|
|
239
|
-
label = `SD("entity.${names.capital}.${labelName}")`;
|
|
240
|
-
}
|
|
241
|
-
return {
|
|
242
|
-
name: col.name,
|
|
243
|
-
label,
|
|
244
|
-
tc: `(row) => ${rendered}`,
|
|
245
|
-
fit: col.name === "id" || col.renderType === "number-id" || col.renderType === "datetime" || col.renderType === "string-datetime",
|
|
246
|
-
align: col.name === "id" || col.renderType === "number-id" ? "center" : undefined
|
|
247
|
-
};
|
|
248
|
-
});
|
|
249
|
-
// 필터 컬럼
|
|
250
|
-
const filterColumns = listParamsNode.children.filter((col)=>col.name !== "id" && col.name !== "queryMode" && [
|
|
251
|
-
"enums",
|
|
252
|
-
"number-id",
|
|
253
|
-
"number-fk_id",
|
|
254
|
-
"string-fk_id"
|
|
255
|
-
].includes(col.renderType))// orderBy가 가장 뒤로 오게 순서 조정
|
|
256
|
-
.sort((a)=>{
|
|
257
|
-
return a.name === "orderBy" ? 1 : -1;
|
|
258
|
-
});
|
|
259
|
-
// 필터 컬럼을 프리 템플릿으로 설정
|
|
260
|
-
const preTemplates = [];
|
|
261
|
-
// 컬럼에서 사용하는 enum들 수집
|
|
262
|
-
const columnEnums = [];
|
|
263
|
-
(columnsNode.children ?? []).forEach((col)=>{
|
|
264
|
-
if (col.renderType === "enums") {
|
|
265
|
-
try {
|
|
266
|
-
const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
|
|
267
|
-
columnEnums.push(enumId);
|
|
268
|
-
} catch {}
|
|
269
|
-
}
|
|
270
|
-
});
|
|
271
|
-
// 디폴트 파라미터
|
|
272
|
-
// const def = this.getDefault(filterColumns);
|
|
273
|
-
return {
|
|
274
|
-
...this.getTargetAndPath(names),
|
|
275
|
-
body: `
|
|
7
|
+
|
|
8
|
+
//#region src/template/implementations/view_list.template.ts
|
|
9
|
+
init_entity_manager();
|
|
10
|
+
init_helpers();
|
|
11
|
+
init_template();
|
|
12
|
+
var Template__view_list = class extends Template {
|
|
13
|
+
constructor() {
|
|
14
|
+
super("view_list");
|
|
15
|
+
}
|
|
16
|
+
getTargetAndPath(names) {
|
|
17
|
+
return {
|
|
18
|
+
target: "web/src/routes/admin",
|
|
19
|
+
path: `${names.fsPlural}/index.tsx`
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
getRequiredDictKeys() {
|
|
23
|
+
return ["entity.listManage", "common.all"];
|
|
24
|
+
}
|
|
25
|
+
wrapTc(body, key, collapsing = true, className = "") {
|
|
26
|
+
return `<Table.Cell key="${key}"${collapsing ? " collapsing" : ""}${className ? ` className={\`${className}\`}` : ""}>${body}</Table.Cell>`;
|
|
27
|
+
}
|
|
28
|
+
renderColumn(entityId, col, names, parentObj = "row", withoutName = false) {
|
|
29
|
+
let colName;
|
|
30
|
+
if (withoutName) {
|
|
31
|
+
colName = parentObj;
|
|
32
|
+
} else if (col.name.includes(".")) {
|
|
33
|
+
const parts = col.name.split(".");
|
|
34
|
+
colName = `${parentObj}.${parts.join("?.")}`;
|
|
35
|
+
} else {
|
|
36
|
+
colName = `${parentObj}.${col.name}`;
|
|
37
|
+
}
|
|
38
|
+
switch (col.renderType) {
|
|
39
|
+
case "string-plain":
|
|
40
|
+
case "string-date":
|
|
41
|
+
case "number-id":
|
|
42
|
+
case "string-id": return `<>{${colName}}</>`;
|
|
43
|
+
case "number-fk_id":
|
|
44
|
+
case "string-fk_id": {
|
|
45
|
+
try {
|
|
46
|
+
const baseName = col.name.includes(".") ? (col.name.split(".").pop() ?? col.name).replace("_id", "") : col.name.replace("_id", "");
|
|
47
|
+
const relPropFk = getRelationPropFromColName(entityId, baseName);
|
|
48
|
+
return `<>${relPropFk.with}#{${colName}}</>`;
|
|
49
|
+
} catch {
|
|
50
|
+
return `<>{${colName}}</>`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
case "datetime": if (col.nullable || col.name.includes(".")) {
|
|
54
|
+
return `<span>{${colName} ? datetimeF(${colName}) : '-'}</span>`;
|
|
55
|
+
} else {
|
|
56
|
+
return `<span>{datetimeF(${colName})}</span>`;
|
|
57
|
+
}
|
|
58
|
+
case "string-datetime": if (col.nullable || col.name.includes(".")) {
|
|
59
|
+
return `<span>{${colName} ? dateF(${colName}) : '-'}</span>`;
|
|
60
|
+
} else {
|
|
61
|
+
return `<span>{dateF(${colName})}</span>`;
|
|
62
|
+
}
|
|
63
|
+
case "boolean": return `<>{${colName} ? <Badge variant="default">O</Badge> : <Badge variant="secondary">X</Badge>}</>`;
|
|
64
|
+
case "enums": {
|
|
65
|
+
try {
|
|
66
|
+
const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
|
|
67
|
+
return `<>{${col.nullable ? `${colName} && ` : ""}${enumId}Label[${colName}]}</>`;
|
|
68
|
+
} catch {
|
|
69
|
+
return `<>{${colName}}</>`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
case "array-images": return `<div className="flex gap-1">{ ${colName}?.map((r, i) => ${col.nullable ? `r && ` : ""}<img key={i} src={r} alt={\`${col.label ?? col.name} \${i + 1}\`} className="h-8 w-8 object-cover rounded" />) }</div>`;
|
|
73
|
+
case "json-sonamufile": return `<div className="flex items-center gap-2">{${colName} ? <img src={${colName}.url} alt={${colName}.name} className="h-8 w-8 object-cover rounded" /> : '-'}</div>`;
|
|
74
|
+
case "json-sonamufile-array": return `<div className="flex gap-1">{ ${colName}?.map((r, i) => ${col.nullable ? `r && ` : ""}<img key={i} src={r.url} alt={\`${col.label ?? col.name} \${i + 1}\`} className="h-8 w-8 object-cover rounded" />) }</div>`;
|
|
75
|
+
case "number-plain": return `<>{${col.nullable || col.name.includes(".") ? `${colName} && ` : ""}numF(${colName})}</>`;
|
|
76
|
+
case "object": return `<span className="text-xs">{${col.nullable ? `${colName} ? ` : ""}JSON.stringify(${colName})${col.nullable ? ` : '-'` : ""}}</span>`;
|
|
77
|
+
case "object-pick": {
|
|
78
|
+
const pickedChild = col.children?.find((child) => child.name === col.config?.picked);
|
|
79
|
+
if (!pickedChild) {
|
|
80
|
+
throw new Error(`object-pick 선택 실패 (오브젝트: ${col.name})`);
|
|
81
|
+
}
|
|
82
|
+
return this.renderColumn(entityId, pickedChild, names, `${colName}${col.nullable ? "?" : ""}`);
|
|
83
|
+
}
|
|
84
|
+
case "array": return `<>{ /* array ${colName} */ }</>`;
|
|
85
|
+
case "vector": return `<>{${col.nullable ? `${colName} ? ` : ""}[Vector: {${colName}${col.nullable ? "" : " ?? []"}.length}d]${col.nullable ? " : '-'" : ""}}</>`;
|
|
86
|
+
default: throw new Error(`렌더 불가 컬럼 ${col.renderType}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
renderColumnImport(entityId, col, names) {
|
|
90
|
+
if (col.renderType === "enums") {
|
|
91
|
+
const { id: enumId } = getEnumInfoFromColName(names.capital, col.name);
|
|
92
|
+
return [`import { ${enumId}Label } from '@/services/sonamu.generated';`];
|
|
93
|
+
} else if (col.renderType === "object") {
|
|
94
|
+
try {
|
|
95
|
+
const relProp = getRelationPropFromColName(entityId, col.name);
|
|
96
|
+
const result = (col.children ?? []).map((child) => {
|
|
97
|
+
entityId = relProp.with;
|
|
98
|
+
names = EntityManager.getNamesFromId(relProp.with);
|
|
99
|
+
return this.renderColumnImport(entityId, child, names);
|
|
100
|
+
});
|
|
101
|
+
return flat(result);
|
|
102
|
+
} catch {
|
|
103
|
+
return [null];
|
|
104
|
+
}
|
|
105
|
+
} else if (col.renderType === "array") {
|
|
106
|
+
if (!col.element) return [null];
|
|
107
|
+
return this.renderColumnImport(entityId, col.element, names);
|
|
108
|
+
}
|
|
109
|
+
return [null];
|
|
110
|
+
}
|
|
111
|
+
renderFilterImport(entityId, col, names) {
|
|
112
|
+
if (col.name === "search") {
|
|
113
|
+
return `import { ${names.capital}SearchInput } from "@/components/${names.fs}/${names.capital}SearchInput";`;
|
|
114
|
+
} else if (col.renderType === "enums") {
|
|
115
|
+
if (col.name === "orderBy") {
|
|
116
|
+
const componentId = `${names.capital}${inflection.camelize(col.name)}Select`;
|
|
117
|
+
return `import { ${componentId} } from "@/components/${names.fs}/${componentId}";`;
|
|
118
|
+
} else {
|
|
119
|
+
try {
|
|
120
|
+
const { id, targetEntityNames: targetMDNames } = getEnumInfoFromColName(entityId, col.name);
|
|
121
|
+
const componentId = `${id}Select`;
|
|
122
|
+
return `import { ${componentId} } from "@/components/${targetMDNames.fs}/${componentId}";`;
|
|
123
|
+
} catch {
|
|
124
|
+
return "";
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
} else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
|
|
128
|
+
try {
|
|
129
|
+
const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
|
|
130
|
+
const targetNames = EntityManager.getNamesFromId(relProp.with);
|
|
131
|
+
const componentId = `${relProp.with}IdAsyncSelect`;
|
|
132
|
+
return `import { ${componentId} } from "@/components/${targetNames.fs}/${componentId}";`;
|
|
133
|
+
} catch {
|
|
134
|
+
return "";
|
|
135
|
+
}
|
|
136
|
+
} else {
|
|
137
|
+
throw new Error(`렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
renderFilter(entityId, col, names) {
|
|
141
|
+
if (col.name === "search") {
|
|
142
|
+
return "";
|
|
143
|
+
}
|
|
144
|
+
const isClearable = col.optional === true && col.name !== "orderBy";
|
|
145
|
+
let componentId;
|
|
146
|
+
if (col.renderType === "enums") {
|
|
147
|
+
if (col.name === "orderBy") {
|
|
148
|
+
componentId = `${names.capital}${inflection.camelize(col.name)}Select`;
|
|
149
|
+
} else {
|
|
150
|
+
try {
|
|
151
|
+
const { id } = getEnumInfoFromColName(entityId, col.name);
|
|
152
|
+
componentId = `${id}Select`;
|
|
153
|
+
} catch {
|
|
154
|
+
return "";
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return `<${componentId} {...register('${col.name}')} ${isClearable ? "clearable" : ""} />`;
|
|
158
|
+
} else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
|
|
159
|
+
try {
|
|
160
|
+
const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
|
|
161
|
+
componentId = `${relProp.with}IdAsyncSelect`;
|
|
162
|
+
return `<${componentId} {...register('${col.name}')} ${isClearable ? "clearable" : ""} subset="A" />`;
|
|
163
|
+
} catch {
|
|
164
|
+
return "";
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
throw new Error(`렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
getDefault(columns) {
|
|
171
|
+
const def = {
|
|
172
|
+
orderBy: "",
|
|
173
|
+
search: "",
|
|
174
|
+
hasSearch: false,
|
|
175
|
+
hasOrderBy: false
|
|
176
|
+
};
|
|
177
|
+
const orderByZodType = columns.find((col) => col.name === "orderBy")?.zodType;
|
|
178
|
+
if (orderByZodType && orderByZodType instanceof z$1.ZodEnum) {
|
|
179
|
+
def.orderBy = Object.keys(orderByZodType.enum)[0];
|
|
180
|
+
def.hasOrderBy = true;
|
|
181
|
+
}
|
|
182
|
+
const searchZodType = columns.find((col) => col.name === "search")?.zodType;
|
|
183
|
+
if (searchZodType && searchZodType instanceof z$1.ZodEnum) {
|
|
184
|
+
def.search = Object.keys(searchZodType.enum)[0];
|
|
185
|
+
def.hasSearch = true;
|
|
186
|
+
}
|
|
187
|
+
return def;
|
|
188
|
+
}
|
|
189
|
+
async render({ entityId }) {
|
|
190
|
+
const { getColumnsNode } = await import("../entity-converter.js");
|
|
191
|
+
const { getZodTypeById, zodTypeToRenderingNode } = await import("../zod-converter.js");
|
|
192
|
+
const columnsNode = await getColumnsNode(entityId, "A");
|
|
193
|
+
const listParamsZodType = await getZodTypeById(`${entityId}ListParams`);
|
|
194
|
+
const listParamsNode = zodTypeToRenderingNode(listParamsZodType);
|
|
195
|
+
const names = EntityManager.getNamesFromId(entityId);
|
|
196
|
+
const entity = EntityManager.get(entityId);
|
|
197
|
+
const pkType = entity.getPkType();
|
|
198
|
+
const idTsType = pkType === "string" || pkType === "uuid" ? "string" : "number";
|
|
199
|
+
const columns = columnsNode.children.toSorted((a, b) => a.name === "id" ? -1 : b.name === "id" ? 1 : 0).map((col) => {
|
|
200
|
+
const rendered = this.renderColumn(entityId, col, names);
|
|
201
|
+
let label;
|
|
202
|
+
if (col.name === "id") {
|
|
203
|
+
label = "\"ID\"";
|
|
204
|
+
} else if (["created_at"].includes(col.name)) {
|
|
205
|
+
const camelName = col.name.replace(/_([a-z])/g, (_, char) => char.toUpperCase());
|
|
206
|
+
label = `SD("common.${camelName}")`;
|
|
207
|
+
} else {
|
|
208
|
+
const labelName = getRelationNameFromColumnName(entityId, col.name);
|
|
209
|
+
label = `SD("entity.${names.capital}.${labelName}")`;
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
name: col.name,
|
|
213
|
+
label,
|
|
214
|
+
tc: `(row) => ${rendered}`,
|
|
215
|
+
fit: col.name === "id" || col.renderType === "number-id" || col.renderType === "datetime" || col.renderType === "string-datetime",
|
|
216
|
+
align: col.name === "id" || col.renderType === "number-id" ? "center" : undefined
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
const filterColumns = listParamsNode.children.filter((col) => col.name !== "id" && col.name !== "queryMode" && [
|
|
220
|
+
"enums",
|
|
221
|
+
"number-id",
|
|
222
|
+
"number-fk_id",
|
|
223
|
+
"string-fk_id"
|
|
224
|
+
].includes(col.renderType)).toSorted((a) => {
|
|
225
|
+
return a.name === "orderBy" ? 1 : -1;
|
|
226
|
+
});
|
|
227
|
+
const preTemplates = [];
|
|
228
|
+
const columnEnums = [];
|
|
229
|
+
(columnsNode.children ?? []).forEach((col) => {
|
|
230
|
+
if (col.renderType === "enums") {
|
|
231
|
+
try {
|
|
232
|
+
const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
|
|
233
|
+
columnEnums.push(enumId);
|
|
234
|
+
} catch {}
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
return {
|
|
238
|
+
...this.getTargetAndPath(names),
|
|
239
|
+
body: `
|
|
276
240
|
import { useState, Fragment } from "react";
|
|
277
241
|
import { createFileRoute, useNavigate } from "@tanstack/react-router";
|
|
278
242
|
|
|
@@ -290,57 +254,42 @@ import { useListParams, numF, dateF, datetimeF } from "@sonamu-kit/react-compone
|
|
|
290
254
|
import { ${names.capital}SubsetA, ${names.capital}BaseSchema } from "@/services/sonamu.generated";
|
|
291
255
|
import { ${names.capital}Service } from "@/services/services.generated";
|
|
292
256
|
import { ${names.capital}ListParams } from "@/services/${names.fs}/${names.fs}.types";
|
|
293
|
-
import { ${(()=>{
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
...new Set([
|
|
317
|
-
...filterEnumIds,
|
|
318
|
-
...columnEnums
|
|
319
|
-
])
|
|
320
|
-
];
|
|
321
|
-
const enumImports = allEnums.flatMap((enumId)=>[
|
|
322
|
-
`${enumId}`,
|
|
323
|
-
`${enumId}Label`
|
|
324
|
-
]);
|
|
325
|
-
return [
|
|
326
|
-
...baseEnums,
|
|
327
|
-
...enumImports
|
|
328
|
-
].join(", ");
|
|
329
|
-
})()} } from "@/services/sonamu.generated";
|
|
257
|
+
import { ${(() => {
|
|
258
|
+
const baseEnums = [];
|
|
259
|
+
if (filterColumns.some((col) => col.name === "orderBy")) {
|
|
260
|
+
baseEnums.push(`${names.capital}OrderBy`, `${names.capital}OrderByLabel`);
|
|
261
|
+
}
|
|
262
|
+
if (filterColumns.some((col) => col.name === "search")) {
|
|
263
|
+
baseEnums.push(`${names.capital}SearchField`, `${names.capital}SearchFieldLabel`);
|
|
264
|
+
}
|
|
265
|
+
const filterEnumIds = filterColumns.filter((col) => col.renderType === "enums" && col.name !== "search" && col.name !== "orderBy").map((col) => {
|
|
266
|
+
if (col.config && "enumId" in col.config) {
|
|
267
|
+
return col.config.enumId;
|
|
268
|
+
}
|
|
269
|
+
try {
|
|
270
|
+
const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
|
|
271
|
+
return enumId;
|
|
272
|
+
} catch {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
}).filter(Boolean);
|
|
276
|
+
const allEnums = [...new Set([...filterEnumIds, ...columnEnums])];
|
|
277
|
+
const enumImports = allEnums.flatMap((enumId) => [`${enumId}`, `${enumId}Label`]);
|
|
278
|
+
return [...baseEnums, ...enumImports].join(", ");
|
|
279
|
+
})()} } from "@/services/sonamu.generated";
|
|
330
280
|
import { IdAsyncSelect } from "@sonamu-kit/react-components/components";
|
|
331
|
-
${(()=>{
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
})()}
|
|
281
|
+
${(() => {
|
|
282
|
+
const fkColumns = filterColumns.filter((col) => col.renderType === "number-fk_id" || col.renderType === "string-fk_id");
|
|
283
|
+
const configNames = fkColumns.map((col) => {
|
|
284
|
+
try {
|
|
285
|
+
const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
|
|
286
|
+
return `${relProp.with}AsyncIdConfig`;
|
|
287
|
+
} catch {
|
|
288
|
+
return "";
|
|
289
|
+
}
|
|
290
|
+
}).filter(Boolean);
|
|
291
|
+
return configNames.length > 0 ? `import { ${configNames.join(", ")} } from "@/services/services.generated";` : "";
|
|
292
|
+
})()}
|
|
344
293
|
|
|
345
294
|
import EditIcon from "~icons/lucide/square-pen";
|
|
346
295
|
import TrashIcon from "~icons/lucide/trash-2";
|
|
@@ -365,8 +314,8 @@ function ${names.capital}List({}: ${names.capital}ListProps) {
|
|
|
365
314
|
const { listParams, register, setListParams } = useListParams(${names.capital}ListParams, {
|
|
366
315
|
num: 10,
|
|
367
316
|
page: 1,
|
|
368
|
-
keyword: "",${filterColumns.some((col)=>col.name === "search") ? `
|
|
369
|
-
search: ${names.capital}SearchField.options[0],` : ""}${filterColumns.some((col)=>col.name === "orderBy") ? `
|
|
317
|
+
keyword: "",${filterColumns.some((col) => col.name === "search") ? `
|
|
318
|
+
search: ${names.capital}SearchField.options[0],` : ""}${filterColumns.some((col) => col.name === "orderBy") ? `
|
|
370
319
|
orderBy: ${names.capital}OrderBy.options[0],` : ""}
|
|
371
320
|
sonamuFilter: {},
|
|
372
321
|
});
|
|
@@ -384,7 +333,7 @@ function ${names.capital}List({}: ${names.capital}ListProps) {
|
|
|
384
333
|
// 컬럼 정의
|
|
385
334
|
type ${names.capital}Row = NonNullable<typeof rows>[number];
|
|
386
335
|
const columns: TableCol<${names.capital}Row>[] = [
|
|
387
|
-
${columns.map((col)
|
|
336
|
+
${columns.map((col) => ` {
|
|
388
337
|
label: ${col.label},
|
|
389
338
|
tc: ${col.tc},${col.fit ? `
|
|
390
339
|
fit: true,` : ""}${col.align ? `
|
|
@@ -467,7 +416,7 @@ ${columns.map((col)=>` {
|
|
|
467
416
|
{/* Filters */}
|
|
468
417
|
<div className="bg-gray-100 px-6 py-4 space-y-3">
|
|
469
418
|
<div className="flex items-center gap-3 flex-wrap">
|
|
470
|
-
${filterColumns.some((col)=>col.name === "search") ? ` <EnumSelect
|
|
419
|
+
${filterColumns.some((col) => col.name === "search") ? ` <EnumSelect
|
|
471
420
|
enum={${names.capital}SearchField}
|
|
472
421
|
labels={${names.capital}SearchFieldLabel}
|
|
473
422
|
{...register("search")}
|
|
@@ -522,12 +471,11 @@ ${filterColumns.some((col)=>col.name === "search") ? ` <EnumSel
|
|
|
522
471
|
</div>
|
|
523
472
|
|
|
524
473
|
<div className="flex items-center gap-3 flex-wrap">
|
|
525
|
-
${filterColumns.filter((col)=>col.name !== "search" && col.name !== "orderBy").map((col)=>{
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
return ` <EnumSelect
|
|
474
|
+
${filterColumns.filter((col) => col.name !== "search" && col.name !== "orderBy").map((col) => {
|
|
475
|
+
if (col.renderType === "enums") {
|
|
476
|
+
try {
|
|
477
|
+
const enumId = col.config && "enumId" in col.config ? col.config.enumId : getEnumInfoFromColName(entityId, col.name).id;
|
|
478
|
+
return ` <EnumSelect
|
|
531
479
|
key={\`${col.name}-\${listParams.${col.name}}\`}
|
|
532
480
|
enum={${enumId}}
|
|
533
481
|
labels={${enumId}Label}
|
|
@@ -536,15 +484,14 @@ ${filterColumns.filter((col)=>col.name !== "search" && col.name !== "orderBy").m
|
|
|
536
484
|
clearable
|
|
537
485
|
className="w-50 h-8 bg-white border-gray-300 text-xs"
|
|
538
486
|
/>`;
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
return ` <IdAsyncSelect
|
|
487
|
+
} catch {
|
|
488
|
+
return "";
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
|
|
492
|
+
try {
|
|
493
|
+
const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
|
|
494
|
+
return ` <IdAsyncSelect
|
|
548
495
|
config={${relProp.with}AsyncIdConfig}
|
|
549
496
|
subset="A"
|
|
550
497
|
{...register("${col.name}")}
|
|
@@ -552,13 +499,13 @@ ${filterColumns.filter((col)=>col.name !== "search" && col.name !== "orderBy").m
|
|
|
552
499
|
clearable
|
|
553
500
|
className="w-50 h-8 text-xs"
|
|
554
501
|
/>`;
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
${filterColumns.some((col)=>col.name === "orderBy") ? ` <EnumSelect
|
|
502
|
+
} catch {
|
|
503
|
+
return "";
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
return "";
|
|
507
|
+
}).filter(Boolean).join("\n")}
|
|
508
|
+
${filterColumns.some((col) => col.name === "orderBy") ? ` <EnumSelect
|
|
562
509
|
enum={${names.capital}OrderBy}
|
|
563
510
|
labels={${names.capital}OrderByLabel}
|
|
564
511
|
{...register("orderBy")}
|
|
@@ -652,10 +599,12 @@ ${filterColumns.some((col)=>col.name === "orderBy") ? ` <EnumSe
|
|
|
652
599
|
);
|
|
653
600
|
}
|
|
654
601
|
`.trim(),
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
}
|
|
602
|
+
importKeys: [],
|
|
603
|
+
preTemplates
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
};
|
|
660
607
|
|
|
661
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19saXN0LnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBmbGF0IH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJpbmdOb2RlLCBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldEVudW1JbmZvRnJvbUNvbE5hbWUsXG4gIGdldFJlbGF0aW9uTmFtZUZyb21Db2x1bW5OYW1lLFxuICBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZSxcbn0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHsgUmVuZGVyZWRUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX192aWV3X2xpc3QgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwidmlld19saXN0XCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBcIndlYi9zcmMvcm91dGVzL2FkbWluXCIsXG4gICAgICBwYXRoOiBgJHtuYW1lcy5mc1BsdXJhbH0vaW5kZXgudHN4YCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0UmVxdWlyZWREaWN0S2V5cygpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgIHJldHVybiBbXCJlbnRpdHkubGlzdE1hbmFnZVwiLCBcImNvbW1vbi5hbGxcIl07XG4gIH1cblxuICB3cmFwVGMoYm9keTogc3RyaW5nLCBrZXk6IHN0cmluZywgY29sbGFwc2luZzogYm9vbGVhbiA9IHRydWUsIGNsYXNzTmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHJldHVybiBgPFRhYmxlLkNlbGwga2V5PVwiJHtrZXl9XCIke2NvbGxhcHNpbmcgPyBcIiBjb2xsYXBzaW5nXCIgOiBcIlwifSR7XG4gICAgICBjbGFzc05hbWUgPyBgIGNsYXNzTmFtZT17XFxgJHtjbGFzc05hbWV9XFxgfWAgOiBcIlwiXG4gICAgfT4ke2JvZHl9PC9UYWJsZS5DZWxsPmA7XG4gIH1cblxuICByZW5kZXJDb2x1bW4oXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBjb2w6IFJlbmRlcmluZ05vZGUsXG4gICAgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkLFxuICAgIHBhcmVudE9iajogc3RyaW5nID0gXCJyb3dcIixcbiAgICB3aXRob3V0TmFtZTogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmcge1xuICAgIC8vIOykkeyyqSDqsr3roZwg7LKY66asICjsmIg6IFwidXNlci5uYW1lXCIgLT4gXCJyb3cudXNlcj8ubmFtZVwiKVxuICAgIGxldCBjb2xOYW1lOiBzdHJpbmc7XG4gICAgaWYgKHdpdGhvdXROYW1lKSB7XG4gICAgICBjb2xOYW1lID0gcGFyZW50T2JqO1xuICAgIH0gZWxzZSBpZiAoY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAvLyDspJHssqkg6rK966Gc64qUIG9wdGlvbmFsIGNoYWluaW5n7Jy866GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBjb2wubmFtZS5zcGxpdChcIi5cIik7XG4gICAgICBjb2xOYW1lID0gYCR7cGFyZW50T2JqfS4ke3BhcnRzLmpvaW4oXCI/LlwiKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2xOYW1lID0gYCR7cGFyZW50T2JqfS4ke2NvbC5uYW1lfWA7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2wucmVuZGVyVHlwZSkge1xuICAgICAgY2FzZSBcInN0cmluZy1wbGFpblwiOlxuICAgICAgY2FzZSBcInN0cmluZy1kYXRlXCI6XG4gICAgICBjYXNlIFwibnVtYmVyLWlkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWlkXCI6XG4gICAgICAgIHJldHVybiBgPD57JHtjb2xOYW1lfX08Lz5gO1xuICAgICAgY2FzZSBcIm51bWJlci1ma19pZFwiOlxuICAgICAgY2FzZSBcInN0cmluZy1ma19pZFwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBjb2wubmFtZS5pbmNsdWRlcyhcIi5cIilcbiAgICAgICAgICAgID8gKGNvbC5uYW1lLnNwbGl0KFwiLlwiKS5wb3AoKSA/PyBjb2wubmFtZSkucmVwbGFjZShcIl9pZFwiLCBcIlwiKVxuICAgICAgICAgICAgOiBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpO1xuICAgICAgICAgIGNvbnN0IHJlbFByb3BGayA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBiYXNlTmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGA8PiR7cmVsUHJvcEZrLndpdGh9I3ske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBgPD57JHtjb2xOYW1lfX08Lz5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgaWYgKGNvbC5udWxsYWJsZSB8fCBjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgICByZXR1cm4gYDxzcGFuPnske2NvbE5hbWV9ID8gZGF0ZXRpbWVGKCR7Y29sTmFtZX0pIDogJy0nfTwvc3Bhbj5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+e2RhdGV0aW1lRigke2NvbE5hbWV9KX08L3NwYW4+YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcInN0cmluZy1kYXRldGltZVwiOlxuICAgICAgICBpZiAoY29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+eyR7Y29sTmFtZX0gPyBkYXRlRigke2NvbE5hbWV9KSA6ICctJ308L3NwYW4+YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYDxzcGFuPntkYXRlRigke2NvbE5hbWV9KX08L3NwYW4+YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9ID8gPEJhZGdlIHZhcmlhbnQ9XCJkZWZhdWx0XCI+TzwvQmFkZ2U+IDogPEJhZGdlIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIj5YPC9CYWRnZT59PC8+YDtcbiAgICAgIGNhc2UgXCJlbnVtc1wiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbC5udWxsYWJsZSA/IGAke2NvbE5hbWV9ICYmIGAgOiBcIlwifSR7ZW51bUlkfUxhYmVsWyR7Y29sTmFtZX1dfTwvPmA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBgPD57JHtjb2xOYW1lfX08Lz5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXJyYXktaW1hZ2VzXCI6XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0xXCI+eyAke2NvbE5hbWV9Py5tYXAoKHIsIGkpID0+ICR7XG4gICAgICAgICAgY29sLm51bGxhYmxlID8gYHIgJiYgYCA6IFwiXCJcbiAgICAgICAgfTxpbWcga2V5PXtpfSBzcmM9e3J9IGFsdD17XFxgJHtjb2wubGFiZWwgPz8gY29sLm5hbWV9IFxcJHtpICsgMX1cXGB9IGNsYXNzTmFtZT1cImgtOCB3LTggb2JqZWN0LWNvdmVyIHJvdW5kZWRcIiAvPikgfTwvZGl2PmA7XG4gICAgICBjYXNlIFwianNvbi1zb25hbXVmaWxlXCI6XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPnske2NvbE5hbWV9ID8gPGltZyBzcmM9eyR7Y29sTmFtZX0udXJsfSBhbHQ9eyR7Y29sTmFtZX0ubmFtZX0gY2xhc3NOYW1lPVwiaC04IHctOCBvYmplY3QtY292ZXIgcm91bmRlZFwiIC8+IDogJy0nfTwvZGl2PmA7XG4gICAgICBjYXNlIFwianNvbi1zb25hbXVmaWxlLWFycmF5XCI6XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0xXCI+eyAke2NvbE5hbWV9Py5tYXAoKHIsIGkpID0+ICR7XG4gICAgICAgICAgY29sLm51bGxhYmxlID8gYHIgJiYgYCA6IFwiXCJcbiAgICAgICAgfTxpbWcga2V5PXtpfSBzcmM9e3IudXJsfSBhbHQ9e1xcYCR7Y29sLmxhYmVsID8/IGNvbC5uYW1lfSBcXCR7aSArIDF9XFxgfSBjbGFzc05hbWU9XCJoLTggdy04IG9iamVjdC1jb3ZlciByb3VuZGVkXCIgLz4pIH08L2Rpdj5gO1xuICAgICAgY2FzZSBcIm51bWJlci1wbGFpblwiOlxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSA/IGAke2NvbE5hbWV9ICYmIGAgOiBcIlwifW51bUYoJHtjb2xOYW1lfSl9PC8+YDtcbiAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzXCI+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gPyBgIDogXCJcIn1KU09OLnN0cmluZ2lmeSgke2NvbE5hbWV9KSR7Y29sLm51bGxhYmxlID8gYCA6ICctJ2AgOiBcIlwifX08L3NwYW4+YDtcbiAgICAgIGNhc2UgXCJvYmplY3QtcGlja1wiOiB7XG4gICAgICAgIGNvbnN0IHBpY2tlZENoaWxkID0gY29sLmNoaWxkcmVuPy5maW5kKChjaGlsZCkgPT4gY2hpbGQubmFtZSA9PT0gY29sLmNvbmZpZz8ucGlja2VkKTtcbiAgICAgICAgaWYgKCFwaWNrZWRDaGlsZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgb2JqZWN0LXBpY2sg7ISg7YOdIOyLpO2MqCAo7Jik67iM7KCd7Yq4OiAke2NvbC5uYW1lfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDb2x1bW4oXG4gICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgcGlja2VkQ2hpbGQsXG4gICAgICAgICAgbmFtZXMsXG4gICAgICAgICAgYCR7Y29sTmFtZX0ke2NvbC5udWxsYWJsZSA/IFwiP1wiIDogXCJcIn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgIHJldHVybiBgPD57IC8qIGFycmF5ICR7Y29sTmFtZX0gKi8gfTwvPmA7XG4gICAgICBjYXNlIFwidmVjdG9yXCI6XG4gICAgICAgIC8vIHZlY3RvciDtg4DsnoXsnYAg7LCo7JuQIOyImOunjCDtkZzsi5wgKOyLpOygnCDrjbDsnbTthLDripQg64SI66y0IOq5gClcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbC5udWxsYWJsZSA/IGAke2NvbE5hbWV9ID8gYCA6IFwiXCJ9W1ZlY3RvcjogeyR7Y29sTmFtZX0ke2NvbC5udWxsYWJsZSA/IFwiXCIgOiBcIiA/PyBbXVwifS5sZW5ndGh9ZF0ke2NvbC5udWxsYWJsZSA/IFwiIDogJy0nXCIgOiBcIlwifX08Lz5gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDroIzrjZQg67aI6rCAIOy7rOufvCAke2NvbC5yZW5kZXJUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlckNvbHVtbkltcG9ydChcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGNvbDogUmVuZGVyaW5nTm9kZSxcbiAgICBuYW1lczogRW50aXR5TmFtZXNSZWNvcmQsXG4gICk6IChzdHJpbmcgfCBudWxsKVtdIHtcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKG5hbWVzLmNhcGl0YWwsIGNvbC5uYW1lKTtcbiAgICAgIHJldHVybiBbYGltcG9ydCB7ICR7ZW51bUlkfUxhYmVsIH0gZnJvbSAnQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkJztgXTtcbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGNvbC5jaGlsZHJlbiA/PyBbXSkubWFwKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGVudGl0eUlkID0gcmVsUHJvcC53aXRoO1xuICAgICAgICAgIG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChyZWxQcm9wLndpdGgpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbkltcG9ydChlbnRpdHlJZCwgY2hpbGQsIG5hbWVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmbGF0KHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtudWxsXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICAgIGlmICghY29sLmVsZW1lbnQpIHJldHVybiBbbnVsbF07XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJDb2x1bW5JbXBvcnQoZW50aXR5SWQsIGNvbC5lbGVtZW50LCBuYW1lcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtudWxsXTtcbiAgfVxuXG4gIHJlbmRlckZpbHRlckltcG9ydChlbnRpdHlJZDogc3RyaW5nLCBjb2w6IFJlbmRlcmluZ05vZGUsIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIGlmIChjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikge1xuICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9U2VhcmNoSW5wdXQgfSBmcm9tIFwiQC9jb21wb25lbnRzLyR7bmFtZXMuZnN9LyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dFwiO2A7XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBpZiAoY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gYCR7bmFtZXMuY2FwaXRhbH0ke2luZmxlY3Rpb24uY2FtZWxpemUoY29sLm5hbWUpfVNlbGVjdGA7XG4gICAgICAgIHJldHVybiBgaW1wb3J0IHsgJHtjb21wb25lbnRJZH0gfSBmcm9tIFwiQC9jb21wb25lbnRzLyR7bmFtZXMuZnN9LyR7Y29tcG9uZW50SWR9XCI7YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCwgdGFyZ2V0RW50aXR5TmFtZXM6IHRhcmdldE1ETmFtZXMgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoXG4gICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgIGNvbC5uYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBgJHtpZH1TZWxlY3RgO1xuICAgICAgICAgIHJldHVybiBgaW1wb3J0IHsgJHtjb21wb25lbnRJZH0gfSBmcm9tIFwiQC9jb21wb25lbnRzLyR7dGFyZ2V0TUROYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIGNvbnN0IHRhcmdldE5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChyZWxQcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGAke3JlbFByb3Aud2l0aH1JZEFzeW5jU2VsZWN0YDtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHt0YXJnZXROYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOugjOuNlCDrtojqsIDriqXtlZwg7ZWE7YSwIOyehO2PrO2KuCAke2NvbC5uYW1lfSAke2NvbC5yZW5kZXJUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlckZpbHRlcihlbnRpdHlJZDogc3RyaW5nLCBjb2w6IFJlbmRlcmluZ05vZGUsIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIGlmIChjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgY29uc3QgaXNDbGVhcmFibGUgPSBjb2wub3B0aW9uYWwgPT09IHRydWUgJiYgY29sLm5hbWUgIT09IFwib3JkZXJCeVwiO1xuICAgIGxldCBjb21wb25lbnRJZDogc3RyaW5nO1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBpZiAoY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKSB7XG4gICAgICAgIGNvbXBvbmVudElkID0gYCR7bmFtZXMuY2FwaXRhbH0ke2luZmxlY3Rpb24uY2FtZWxpemUoY29sLm5hbWUpfVNlbGVjdGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICBjb21wb25lbnRJZCA9IGAke2lkfVNlbGVjdGA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYDwke2NvbXBvbmVudElkfSB7Li4ucmVnaXN0ZXIoJyR7Y29sLm5hbWV9Jyl9ICR7aXNDbGVhcmFibGUgPyBcImNsZWFyYWJsZVwiIDogXCJcIn0gLz5gO1xuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIGNvbXBvbmVudElkID0gYCR7cmVsUHJvcC53aXRofUlkQXN5bmNTZWxlY3RgO1xuICAgICAgICByZXR1cm4gYDwke2NvbXBvbmVudElkfSB7Li4ucmVnaXN0ZXIoJyR7Y29sLm5hbWV9Jyl9ICR7XG4gICAgICAgICAgaXNDbGVhcmFibGUgPyBcImNsZWFyYWJsZVwiIDogXCJcIlxuICAgICAgICB9IHN1YnNldD1cIkFcIiAvPmA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg66CM642UIOu2iOqwgOuKpe2VnCDtlYTthLAg7J6E7Y+s7Yq4ICR7Y29sLm5hbWV9ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVmYXVsdChjb2x1bW5zOiBSZW5kZXJpbmdOb2RlW10pOiB7XG4gICAgb3JkZXJCeTogc3RyaW5nO1xuICAgIHNlYXJjaDogc3RyaW5nO1xuICAgIGhhc1NlYXJjaDogYm9vbGVhbjtcbiAgICBoYXNPcmRlckJ5OiBib29sZWFuO1xuICB9IHtcbiAgICBjb25zdCBkZWYgPSB7XG4gICAgICBvcmRlckJ5OiBcIlwiLFxuICAgICAgc2VhcmNoOiBcIlwiLFxuICAgICAgaGFzU2VhcmNoOiBmYWxzZSxcbiAgICAgIGhhc09yZGVyQnk6IGZhbHNlLFxuICAgIH07XG4gICAgY29uc3Qgb3JkZXJCeVpvZFR5cGUgPSBjb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKT8uem9kVHlwZTtcbiAgICBpZiAob3JkZXJCeVpvZFR5cGUgJiYgb3JkZXJCeVpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICAgIGRlZi5vcmRlckJ5ID0gT2JqZWN0LmtleXMob3JkZXJCeVpvZFR5cGUuZW51bSlbMF07XG4gICAgICBkZWYuaGFzT3JkZXJCeSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFpvZFR5cGUgPSBjb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwic2VhcmNoXCIpPy56b2RUeXBlO1xuICAgIGlmIChzZWFyY2hab2RUeXBlICYmIHNlYXJjaFpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICAgIGRlZi5zZWFyY2ggPSBPYmplY3Qua2V5cyhzZWFyY2hab2RUeXBlLmVudW0pWzBdO1xuICAgICAgZGVmLmhhc1NlYXJjaCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBkZWY7XG4gIH1cblxuICBhc3luYyByZW5kZXIoeyBlbnRpdHlJZCB9OiBUZW1wbGF0ZU9wdGlvbnNbXCJ2aWV3X2xpc3RcIl0pIHtcbiAgICBjb25zdCB7IGdldENvbHVtbnNOb2RlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHktY29udmVydGVyXCIpO1xuICAgIGNvbnN0IHsgZ2V0Wm9kVHlwZUJ5SWQsIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3pvZC1jb252ZXJ0ZXJcIik7XG5cbiAgICBjb25zdCBjb2x1bW5zTm9kZSA9IGF3YWl0IGdldENvbHVtbnNOb2RlKGVudGl0eUlkLCBcIkFcIik7XG4gICAgY29uc3QgbGlzdFBhcmFtc1pvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChgJHtlbnRpdHlJZH1MaXN0UGFyYW1zYCk7XG4gICAgY29uc3QgbGlzdFBhcmFtc05vZGUgPSB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGxpc3RQYXJhbXNab2RUeXBlKTtcblxuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgLy8gUEsg7YOA7J6FIOqwkOyngFxuICAgIGNvbnN0IHBrVHlwZSA9IGVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICBjb25zdCBpZFRzVHlwZSA9IHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiID8gXCJzdHJpbmdcIiA6IFwibnVtYmVyXCI7XG5cbiAgICAvLyDsi6TsoJwg66as7Iqk7Yq4IOy7rOufvFxuICAgIGNvbnN0IGNvbHVtbnMgPSAoY29sdW1uc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdKVxuXG4gICAgICAuc29ydCgoYSwgYikgPT4gKGEubmFtZSA9PT0gXCJpZFwiID8gLTEgOiBiLm5hbWUgPT09IFwiaWRcIiA/IDEgOiAwKSlcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IHRoaXMucmVuZGVyQ29sdW1uKGVudGl0eUlkLCBjb2wsIG5hbWVzKTtcblxuICAgICAgICAvLyDrnbzrsqgg7IOd7ISxOiBjb21tb24g7ZWE65OcKGNyZWF0ZWRfYXQp64qUIFNEKFwiY29tbW9uLntmaWVsZH1cIiksIGVudGl0eSDtlYTrk5zripQgU0QoXCJlbnRpdHkue0VudGl0eX0ue2ZpZWxkfVwiKVxuICAgICAgICBsZXQgbGFiZWw6IHN0cmluZztcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgICBsYWJlbCA9ICdcIklEXCInO1xuICAgICAgICB9IGVsc2UgaWYgKFtcImNyZWF0ZWRfYXRcIl0uaW5jbHVkZXMoY29sLm5hbWUpKSB7XG4gICAgICAgICAgLy8gY2FtZWxDYXNl66GcIOuzgO2ZmCAoY3JlYXRlZF9hdCAtPiBjcmVhdGVkQXQpXG4gICAgICAgICAgY29uc3QgY2FtZWxOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGNoYXIpID0+IGNoYXIudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgbGFiZWwgPSBgU0QoXCJjb21tb24uJHtjYW1lbE5hbWV9XCIpYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsYWJlbE5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGxhYmVsID0gYFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH0uJHtsYWJlbE5hbWV9XCIpYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdGM6IGAocm93KSA9PiAke3JlbmRlcmVkfWAsXG4gICAgICAgICAgZml0OlxuICAgICAgICAgICAgY29sLm5hbWUgPT09IFwiaWRcIiB8fFxuICAgICAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWlkXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcImRhdGV0aW1lXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRldGltZVwiLFxuICAgICAgICAgIGFsaWduOiBjb2wubmFtZSA9PT0gXCJpZFwiIHx8IGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1pZFwiID8gXCJjZW50ZXJcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvFxuICAgIGNvbnN0IGZpbHRlckNvbHVtbnMgPSAobGlzdFBhcmFtc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGNvbCkgPT5cbiAgICAgICAgICBjb2wubmFtZSAhPT0gXCJpZFwiICYmXG4gICAgICAgICAgY29sLm5hbWUgIT09IFwicXVlcnlNb2RlXCIgJiZcbiAgICAgICAgICBbXCJlbnVtc1wiLCBcIm51bWJlci1pZFwiLCBcIm51bWJlci1ma19pZFwiLCBcInN0cmluZy1ma19pZFwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSksXG4gICAgICApXG4gICAgICAvLyBvcmRlckJ56rCAIOqwgOyepSDrkqTroZwg7Jik6rKMIOyInOyEnCDsobDsoJVcbiAgICAgIC5zb3J0KChhKSA9PiB7XG4gICAgICAgIHJldHVybiBhLm5hbWUgPT09IFwib3JkZXJCeVwiID8gMSA6IC0xO1xuICAgICAgfSk7XG5cbiAgICAvLyDtlYTthLAg7Lus65+87J2EIO2UhOumrCDthZztlIzrpr/snLzroZwg7ISk7KCVXG4gICAgY29uc3QgcHJlVGVtcGxhdGVzOiBSZW5kZXJlZFRlbXBsYXRlW1wicHJlVGVtcGxhdGVzXCJdID0gW107XG5cbiAgICAvLyDsu6zrn7zsl5DshJwg7IKs7Jqp7ZWY64qUIGVudW3rk6Qg7IiY7KeRXG4gICAgY29uc3QgY29sdW1uRW51bXM6IHN0cmluZ1tdID0gW107XG4gICAgKGNvbHVtbnNOb2RlLmNoaWxkcmVuID8/IFtdKS5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgY29sdW1uRW51bXMucHVzaChlbnVtSWQpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDrlJTtj7Ttirgg7YyM652866+47YSwXG4gICAgLy8gY29uc3QgZGVmID0gdGhpcy5nZXREZWZhdWx0KGZpbHRlckNvbHVtbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyksXG4gICAgICBib2R5OiBgXG5pbXBvcnQgeyB1c2VTdGF0ZSwgRnJhZ21lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVSb3V0ZSwgdXNlTmF2aWdhdGUgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXJvdXRlclwiO1xuXG5pbXBvcnQgeyBDYXJkLCBDYXJkQ29udGVudCwgQ2FyZEhlYWRlciB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEJhZGdlIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgUGFnaW5hdGlvbiwgVGFibGUsIFRhYmxlQm9keSwgVGFibGVDZWxsLCB0eXBlIFRhYmxlQ29sLCBUYWJsZUhlYWQsIFRhYmxlSGVhZGVyLCBUYWJsZVJvdyB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEVudW1TZWxlY3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBBbGVydERpYWxvZywgQWxlcnREaWFsb2dBY3Rpb24sIEFsZXJ0RGlhbG9nQ2FuY2VsLCBBbGVydERpYWxvZ0NvbnRlbnQsIEFsZXJ0RGlhbG9nRGVzY3JpcHRpb24sIEFsZXJ0RGlhbG9nRm9vdGVyLCBBbGVydERpYWxvZ0hlYWRlciwgQWxlcnREaWFsb2dUaXRsZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IElucHV0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQ2hlY2tib3ggfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBTb25hbXVGaWx0ZXJNb2RhbCwgU29uYW11RmlsdGVyUG9wb3ZlciwgZXh0cmFjdEZpZWxkTWV0YUZyb21TY2hlbWEsIHR5cGUgUnVsZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcblxuaW1wb3J0IHsgdXNlTGlzdFBhcmFtcywgbnVtRiwgZGF0ZUYsIGRhdGV0aW1lRiB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2xpYlwiO1xuaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfVN1YnNldEEsICR7bmFtZXMuY2FwaXRhbH1CYXNlU2NoZW1hIH0gZnJvbSBcIkAvc2VydmljZXMvc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zIH0gZnJvbSBcIkAvc2VydmljZXMvJHtuYW1lcy5mc30vJHtuYW1lcy5mc30udHlwZXNcIjtcbmltcG9ydCB7ICR7KCgpID0+IHtcbiAgICAgICAgLy8g6riw67O4IGVudW0g7IiY7KeRIChmaWx0ZXJDb2x1bW5z7JeQIOyeiOuKlCDqsoPrp4wpXG4gICAgICAgIGNvbnN0IGJhc2VFbnVtczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpKSB7XG4gICAgICAgICAgYmFzZUVudW1zLnB1c2goYCR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5YCwgYCR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5TGFiZWxgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSkge1xuICAgICAgICAgIGJhc2VFbnVtcy5wdXNoKGAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRgLCBgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkTGFiZWxgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2VhO2EsCBlbnVtIOyImOynkSAoY29uZmlnLmVudW1JZCDsmrDshKAsIOyXhuycvOuptCBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKVxuICAgICAgICBjb25zdCBmaWx0ZXJFbnVtSWRzID0gZmlsdGVyQ29sdW1uc1xuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiICYmIGNvbC5uYW1lICE9PSBcInNlYXJjaFwiICYmIGNvbC5uYW1lICE9PSBcIm9yZGVyQnlcIixcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sLmNvbmZpZyAmJiBcImVudW1JZFwiIGluIGNvbC5jb25maWcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChjb2wuY29uZmlnIGFzIHsgZW51bUlkOiBzdHJpbmcgfSkuZW51bUlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiBlbnVtSWQ7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIC8vIOuqqOuToCBlbnVtIO2Vqey5mOqzoCDspJHrs7Ug7KCc6rGwXG4gICAgICAgIGNvbnN0IGFsbEVudW1zID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckVudW1JZHMsIC4uLmNvbHVtbkVudW1zXSldO1xuICAgICAgICBjb25zdCBlbnVtSW1wb3J0cyA9IGFsbEVudW1zLmZsYXRNYXAoKGVudW1JZCkgPT4gW2Ake2VudW1JZH1gLCBgJHtlbnVtSWR9TGFiZWxgXSk7XG5cbiAgICAgICAgcmV0dXJuIFsuLi5iYXNlRW51bXMsIC4uLmVudW1JbXBvcnRzXS5qb2luKFwiLCBcIik7XG4gICAgICB9KSgpfSB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IElkQXN5bmNTZWxlY3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG4keygoKSA9PiB7XG4gIC8vIEZLIO2VhOuTnOydmCBBc3luY0lkQ29uZmlnIGltcG9ydFxuICBjb25zdCBma0NvbHVtbnMgPSBmaWx0ZXJDb2x1bW5zLmZpbHRlcihcbiAgICAoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIixcbiAgKTtcbiAgY29uc3QgY29uZmlnTmFtZXMgPSBma0NvbHVtbnNcbiAgICAubWFwKChjb2wpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIHJldHVybiBgJHtyZWxQcm9wLndpdGh9QXN5bmNJZENvbmZpZ2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICByZXR1cm4gY29uZmlnTmFtZXMubGVuZ3RoID4gMFxuICAgID8gYGltcG9ydCB7ICR7Y29uZmlnTmFtZXMuam9pbihcIiwgXCIpfSB9IGZyb20gXCJAL3NlcnZpY2VzL3NlcnZpY2VzLmdlbmVyYXRlZFwiO2BcbiAgICA6IFwiXCI7XG59KSgpfVxuXG5pbXBvcnQgRWRpdEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvc3F1YXJlLXBlblwiO1xuaW1wb3J0IFRyYXNoSWNvbiBmcm9tIFwifmljb25zL2x1Y2lkZS90cmFzaC0yXCI7XG5pbXBvcnQgRmlsdGVySWNvbiBmcm9tIFwifmljb25zL21kaS9maWx0ZXItdmFyaWFudFwiO1xuaW1wb3J0IExpc3RJY29uIGZyb20gXCJ+aWNvbnMvbWRpL2Zvcm1hdC1saXN0LWJ1bGxldGVkXCI7XG5pbXBvcnQgU2VhcmNoSWNvbiBmcm9tIFwifmljb25zL21kaS9tYWduaWZ5XCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCJAL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5cbmV4cG9ydCBjb25zdCBSb3V0ZSA9IGNyZWF0ZUZpbGVSb3V0ZShcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfS9cIikoe1xcbiAgaGVhZDogKCkgPT4gKHtcXG4gICAgbWV0YTogW1xcbiAgICAgIHsgdGl0bGU6IFwiJHtlbnRpdHkudGl0bGUgPz8gbmFtZXMuY2FwaXRhbH0gTGlzdFwiIH0sXFxuICAgICAgeyBuYW1lOiBcImRlc2NyaXB0aW9uXCIsIGNvbnRlbnQ6IFNEKFwiZW50aXR5Lmxpc3RNYW5hZ2VcIikoXCIke2VudGl0eS50aXRsZSA/PyBuYW1lcy5jYXBpdGFsfVwiKSB9LFxcbiAgICBdLFxcbiAgfSksXFxuICBjb21wb25lbnQ6ICR7bmFtZXMuY2FwaXRhbH1MaXN0LFxcbn0pO1xcblxcbnR5cGUgJHtuYW1lcy5jYXBpdGFsfUxpc3RQcm9wcyA9IHt9O1xuXG5mdW5jdGlvbiAke25hbWVzLmNhcGl0YWx9TGlzdCh7fTogJHtuYW1lcy5jYXBpdGFsfUxpc3RQcm9wcykge1xuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG5cbiAgLy8g7IOB7YOcIOq0gOumrFxuICBjb25zdCBbc2VsZWN0ZWRJdGVtcywgc2V0U2VsZWN0ZWRJdGVtc10gPSB1c2VTdGF0ZTxTZXQ8JHtpZFRzVHlwZX0+PihuZXcgU2V0KCkpO1xuICBjb25zdCBbZGVsZXRlRGlhbG9nT3Blbiwgc2V0RGVsZXRlRGlhbG9nT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpdGVtVG9EZWxldGUsIHNldEl0ZW1Ub0RlbGV0ZV0gPSB1c2VTdGF0ZTx7IGlkOiAke2lkVHNUeXBlfTsgbmFtZT86IHN0cmluZyB9IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtmaWx0ZXJNb2RhbE9wZW4sIHNldEZpbHRlck1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFthcHBsaWVkUnVsZXMsIHNldEFwcGxpZWRSdWxlc10gPSB1c2VTdGF0ZTxSdWxlW10+KFtdKTtcblxuICAvLyDrpqzsiqTtirgg7ZWE7YSwXG4gIGNvbnN0IHsgbGlzdFBhcmFtcywgcmVnaXN0ZXIsIHNldExpc3RQYXJhbXMgfSA9IHVzZUxpc3RQYXJhbXMoJHtuYW1lcy5jYXBpdGFsfUxpc3RQYXJhbXMsIHtcbiAgICBudW06IDEwLFxuICAgIHBhZ2U6IDEsXG4gICAga2V5d29yZDogXCJcIiwke1xuICAgICAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKVxuICAgICAgICA/IGBcbiAgICBzZWFyY2g6ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZC5vcHRpb25zWzBdLGBcbiAgICAgICAgOiBcIlwiXG4gICAgfSR7XG4gICAgICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKVxuICAgICAgICA/IGBcbiAgICBvcmRlckJ5OiAke25hbWVzLmNhcGl0YWx9T3JkZXJCeS5vcHRpb25zWzBdLGBcbiAgICAgICAgOiBcIlwiXG4gICAgfVxuICAgIHNvbmFtdUZpbHRlcjoge30sXG4gIH0pO1xuXG4gIC8vIOumrOyKpO2KuCDsv7zrpqxcbiAgY29uc3QgeyBkYXRhLCByZWZldGNoLCBpc0xvYWRpbmcgfSA9ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLnVzZSR7bmFtZXMuY2FwaXRhbFBsdXJhbH0oXCJBXCIsIGxpc3RQYXJhbXMpO1xuICBjb25zdCB7IHJvd3MsIHRvdGFsIH0gPSBkYXRhID8/IHt9O1xuXG4gIC8vIO2YhOyerCDqsr3roZzsmYAg7YOA7J207YuAXG4gIGNvbnN0IFBBR0UgPSB7XG4gICAgcm91dGU6IFwiL2FkbWluLyR7bmFtZXMuZnNQbHVyYWx9XCIsXG4gICAgdGl0bGU6IFNEKFwiZW50aXR5Lmxpc3RcIikoU0QoXCJlbnRpdHkuJHtuYW1lcy5jYXBpdGFsfVwiKSksXG4gIH07XG5cbiAgLy8g7Lus65+8IOygleydmFxuICB0eXBlICR7bmFtZXMuY2FwaXRhbH1Sb3cgPSBOb25OdWxsYWJsZTx0eXBlb2Ygcm93cz5bbnVtYmVyXTtcbiAgY29uc3QgY29sdW1uczogVGFibGVDb2w8JHtuYW1lcy5jYXBpdGFsfVJvdz5bXSA9IFtcbiR7Y29sdW1uc1xuICAubWFwKFxuICAgIChjb2wpID0+IGAgICAge1xuICAgICAgbGFiZWw6ICR7Y29sLmxhYmVsfSxcbiAgICAgIHRjOiAke2NvbC50Y30sJHtcbiAgICAgICAgY29sLmZpdFxuICAgICAgICAgID8gYFxuICAgICAgZml0OiB0cnVlLGBcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH0ke1xuICAgICAgICBjb2wuYWxpZ25cbiAgICAgICAgICA/IGBcbiAgICAgIGFsaWduOiBcIiR7Y29sLmFsaWdufVwiLGBcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH1cbiAgICB9YCxcbiAgKVxuICAuam9pbihcIixcXG5cIil9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBTRChcImNvbW1vbi5tYW5hZ2VcIiksXG4gICAgICBmaXQ6IHRydWUsXG4gICAgICBhbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIHRjOiAocm93KSA9PiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwieWVsbG93XCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICBpY29uPXs8RWRpdEljb24gLz59XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZSh7IHRvOiBcXGBcXCR7UEFHRS5yb3V0ZX0vZm9ybVxcYCwgc2VhcmNoOiB7IGlkOiByb3cuaWQgfSB9KX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJyZWRcIlxuICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgIGljb249ezxUcmFzaEljb24gLz59XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVEZWxldGVDbGljayhyb3cuaWQpfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSxcbiAgICB9LFxuICBdO1xuXG4gIC8vIOyEoO2DnSDtlbjrk6Trn6xcbiAgY29uc3QgaGFuZGxlVG9nZ2xlSXRlbSA9IChpZDogJHtpZFRzVHlwZX0pID0+IHtcbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgU2V0KHNlbGVjdGVkSXRlbXMpO1xuICAgIGlmIChuZXdTZWxlY3Rpb24uaGFzKGlkKSkge1xuICAgICAgbmV3U2VsZWN0aW9uLmRlbGV0ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1NlbGVjdGlvbi5hZGQoaWQpO1xuICAgIH1cbiAgICBzZXRTZWxlY3RlZEl0ZW1zKG5ld1NlbGVjdGlvbik7XG4gIH07XG5cbiAgY29uc3QgaXNBbGxTZWxlY3RlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gKHJvd3M/Lmxlbmd0aCA/PyAwKSA+IDAgJiYgcm93cyEuZXZlcnkoKHJvdykgPT4gc2VsZWN0ZWRJdGVtcy5oYXMocm93LmlkKSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0QWxsID0gKGNoZWNrZWQ6IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgc2V0U2VsZWN0ZWRJdGVtcyhuZXcgU2V0KHJvd3M/Lm1hcCgocm93KSA9PiByb3cuaWQpID8/IFtdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNlbGVjdGVkSXRlbXMobmV3IFNldCgpKTtcbiAgICB9XG4gIH07XG5cbiAgLy8g7IKt7KCcIO2VuOuTpOufrFxuICBjb25zdCBoYW5kbGVEZWxldGVDbGljayA9IChpZDogJHtpZFRzVHlwZX0sIG5hbWU/OiBzdHJpbmcpID0+IHtcbiAgICBzZXRJdGVtVG9EZWxldGUoeyBpZCwgbmFtZSB9KTtcbiAgICBzZXREZWxldGVEaWFsb2dPcGVuKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvbmZpcm1EZWxldGUgPSAoKSA9PiB7XG4gICAgaWYgKGl0ZW1Ub0RlbGV0ZSkge1xuICAgICAgJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UuZGVsKFtpdGVtVG9EZWxldGUuaWRdKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmVmZXRjaCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHNldERlbGV0ZURpYWxvZ09wZW4oZmFsc2UpO1xuICAgIHNldEl0ZW1Ub0RlbGV0ZShudWxsKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LXctWzE4MDBweF0gbXgtYXV0byBwLThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTYgbWItOFwiPlxuICAgICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPExpc3RJY29uIGNsYXNzTmFtZT1cImgtNSB3LTVcIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIGgtNVwiPntQQUdFLnRpdGxlfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxDYXJkIGNsYXNzTmFtZT1cInNoYWRvdy1zbSBib3JkZXItYm9yZGVyLzQwIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgPENhcmRIZWFkZXIgY2xhc3NOYW1lPVwicGItMCBweC0wIHB0LTBcIj5cbiAgICAgICAgICAgICAgey8qIEZpbHRlcnMgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctZ3JheS0xMDAgcHgtNiBweS00IHNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgZmxleC13cmFwXCI+XG4ke1xuICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwic2VhcmNoXCIpXG4gICAgPyBgICAgICAgICAgICAgICAgICAgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgZW51bT17JHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkfVxuICAgICAgICAgICAgICAgICAgICBsYWJlbHM9eyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZExhYmVsfVxuICAgICAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCJzZWFyY2hcIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtTRChcImNvbW1vbi5zZWFyY2hUeXBlXCIpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmBcbiAgICA6IFwiXCJcbn1cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBmbGV4LTEgbWF4LXcteHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwia2V5d29yZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCBwci04IHRleHQteHMgYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPXs8U2VhcmNoSWNvbiAvPn1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSByaWdodC0wIHRvcC0wIGgtOCB3LTggaG92ZXI6YmctdHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWwtYXV0byBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04IHB4LTQgYmctcHJpbWFyeSBob3ZlcjpiZy1wcmltYXJ5LzkwIHRleHQtd2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG5hdmlnYXRlKHsgdG86IFxcYFxcJHtQQUdFLnJvdXRlfS9mb3JtXFxgIH0pfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14c1wiPntTRChcImNvbW1vbi5jcmVhdGVcIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPFNvbmFtdUZpbHRlclBvcG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICBydWxlcz17YXBwbGllZFJ1bGVzfVxuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTWV0YT17ZXh0cmFjdEZpZWxkTWV0YUZyb21TY2hlbWEoXG4gICAgICAgICAgICAgICAgICAgICAgICAke25hbWVzLmNhcGl0YWx9QmFzZVNjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFNEIGFzIChrZXk6IHN0cmluZykgPT4gc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17PEZpbHRlckljb24gLz59XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRGaWx0ZXJNb2RhbE9wZW4odHJ1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLThcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57U0QoXCJyYy5zb25hbXVGaWx0ZXIudGl0bGVcIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAge2FwcGxpZWRSdWxlcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEJhZGdlIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBjbGFzc05hbWU9XCJtbC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2FwcGxpZWRSdWxlcy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvQmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L1NvbmFtdUZpbHRlclBvcG92ZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgZmxleC13cmFwXCI+XG4ke2ZpbHRlckNvbHVtbnNcbiAgLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gXCJzZWFyY2hcIiAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCIpXG4gIC5tYXAoKGNvbCkgPT4ge1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBjb25maWcuZW51bUlk6rCAIOyeiOycvOuptCDsmrDshKAg7IKs7JqpLCDsl4bsnLzrqbQgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSDsi5zrj4RcbiAgICAgICAgY29uc3QgZW51bUlkID1cbiAgICAgICAgICBjb2wuY29uZmlnICYmIFwiZW51bUlkXCIgaW4gY29sLmNvbmZpZ1xuICAgICAgICAgICAgPyAoY29sLmNvbmZpZyBhcyB7IGVudW1JZDogc3RyaW5nIH0pLmVudW1JZFxuICAgICAgICAgICAgOiBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSkuaWQ7XG4gICAgICAgIHJldHVybiBgICAgICAgICAgICAgICAgICAgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAga2V5PXtcXGAke2NvbC5uYW1lfS1cXCR7bGlzdFBhcmFtcy4ke2NvbC5uYW1lfX1cXGB9XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7ZW51bUlkfX1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXske2VudW1JZH1MYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwiJHtjb2wubmFtZX1cIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtjb2wubGFiZWx9XCJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJhYmxlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNTAgaC04IGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRksg7ZWE65OcIChJZEFzeW5jU2VsZWN0KVxuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgcmV0dXJuIGAgICAgICAgICAgICAgICAgICA8SWRBc3luY1NlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjb25maWc9eyR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWd9XG4gICAgICAgICAgICAgICAgICAgIHN1YnNldD1cIkFcIlxuICAgICAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCIke2NvbC5uYW1lfVwiKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2NvbC5sYWJlbCA/PyByZWxQcm9wLndpdGh9XCJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJhYmxlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNTAgaC04IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfSlcbiAgLmZpbHRlcihCb29sZWFuKVxuICAuam9pbihcIlxcblwiKX1cbiR7XG4gIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpXG4gICAgPyBgICAgICAgICAgICAgICAgICAgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgZW51bT17JHtuYW1lcy5jYXBpdGFsfU9yZGVyQnl9XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscz17JHtuYW1lcy5jYXBpdGFsfU9yZGVyQnlMYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwib3JkZXJCeVwiKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e1NEKFwiY29tbW9uLnNvcnRcIil9XG4gICAgICAgICAgICAgICAgICAgIHRleHRQcmVmaXg9e1xcYFxcJHtTRChcImNvbW1vbi5zb3J0XCIpfTogXFxgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmBcbiAgICA6IFwiXCJcbn1cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e1NEKFwiY29tbW9uLnJlc3VsdHNcIikodG90YWwgPz8gMCl9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvQ2FyZEhlYWRlcj5cblxuICAgICAgICAgICAgPENhcmRDb250ZW50IGNsYXNzTmFtZT1cInB4LTYgcGItNiBwdC02IGJnLXdoaXRlXCI+XG4gICAgICAgICAgICAgIHsvKiBUYWJsZSAqL31cbiAgICAgICAgICAgICAgPFRhYmxlPlxuICAgICAgICAgICAgICAgIDxUYWJsZUhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZVJvdyBjbGFzc05hbWU9XCJob3ZlcjpiZy10cmFuc3BhcmVudCBiZy1ncmF5LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICA8VGFibGVIZWFkIGNsYXNzTmFtZT1cImgtOSB0ZXh0LXhzIHctWzQwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtpc0FsbFNlbGVjdGVkKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXtoYW5kbGVTZWxlY3RBbGx9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIHtjb2x1bW5zLm1hcCgoY29sLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8VGFibGVIZWFkIGtleT17aWR4fSBmaXQ9e2NvbC5maXR9IGFsaWduPXtjb2wuYWxpZ259PlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlSGVhZD5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlUm93PlxuICAgICAgICAgICAgICAgIDwvVGFibGVIZWFkZXI+XG4gICAgICAgICAgICAgICAgPFRhYmxlQm9keT5cbiAgICAgICAgICAgICAgICAgIHshaXNMb2FkaW5nICYmIHJvd3MgJiYgcm93cy5tYXAoKHJvdykgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8RnJhZ21lbnQga2V5PXtyb3cuaWR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxUYWJsZVJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUYWJsZUNlbGwgY2xhc3NOYW1lPVwicHktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZEl0ZW1zLmhhcyhyb3cuaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eygpID0+IGhhbmRsZVRvZ2dsZUl0ZW0ocm93LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbnMubWFwKChjb2wsIGlkeCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsIGtleT17aWR4fSBmaXQ9e2NvbC5maXR9IGFsaWduPXtjb2wuYWxpZ259IGNsYXNzTmFtZT1cInB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sLnRjKHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvVGFibGVCb2R5PlxuICAgICAgICAgICAgICA8L1RhYmxlPlxuXG4gICAgICAgICAgICAgIHsvKiBQYWdpbmF0aW9uICovfVxuICAgICAgICAgICAgICA8UGFnaW5hdGlvblxuICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcInBhZ2VcIil9XG4gICAgICAgICAgICAgICAgdG90YWw9e3RvdGFsID8/IDB9XG4gICAgICAgICAgICAgICAgaXRlbXNQZXJQYWdlPXtsaXN0UGFyYW1zLm51bSA/PyAxMH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgICAgICAgPC9DYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogRGVsZXRlIERpYWxvZyAqL31cbiAgICAgIDxBbGVydERpYWxvZyBvcGVuPXtkZWxldGVEaWFsb2dPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERlbGV0ZURpYWxvZ09wZW59PlxuICAgICAgICA8QWxlcnREaWFsb2dDb250ZW50PlxuICAgICAgICAgIDxBbGVydERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ1RpdGxlPntTRChcImRlbGV0ZS5jb25maXJtLnRpdGxlXCIpfTwvQWxlcnREaWFsb2dUaXRsZT5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ0Rlc2NyaXB0aW9uPntTRChcImRlbGV0ZS5jb25maXJtLmRlc2NyaXB0aW9uXCIpfTwvQWxlcnREaWFsb2dEZXNjcmlwdGlvbj5cbiAgICAgICAgICA8L0FsZXJ0RGlhbG9nSGVhZGVyPlxuICAgICAgICAgIDxBbGVydERpYWxvZ0Zvb3Rlcj5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ0NhbmNlbD57U0QoXCJjb21tb24uY2FuY2VsXCIpfTwvQWxlcnREaWFsb2dDYW5jZWw+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dBY3Rpb24gb25DbGljaz17aGFuZGxlQ29uZmlybURlbGV0ZX0+XG4gICAgICAgICAgICAgIHtTRChcImNvbW1vbi5kZWxldGVcIil9XG4gICAgICAgICAgICA8L0FsZXJ0RGlhbG9nQWN0aW9uPlxuICAgICAgICAgIDwvQWxlcnREaWFsb2dGb290ZXI+XG4gICAgICAgIDwvQWxlcnREaWFsb2dDb250ZW50PlxuICAgICAgPC9BbGVydERpYWxvZz5cblxuICAgICAgey8qIFNvbmFtdSBGaWx0ZXIgTW9kYWwgKi99XG4gICAgICA8U29uYW11RmlsdGVyTW9kYWxcbiAgICAgICAgYmFzZVNjaGVtYT17JHtuYW1lcy5jYXBpdGFsfUJhc2VTY2hlbWF9XG4gICAgICAgIG9wZW49e2ZpbHRlck1vZGFsT3Blbn1cbiAgICAgICAgb25PcGVuQ2hhbmdlPXtzZXRGaWx0ZXJNb2RhbE9wZW59XG4gICAgICAgIGluaXRpYWxSdWxlcz17YXBwbGllZFJ1bGVzfVxuICAgICAgICBvbkFwcGx5PXsoZmlsdGVycywgcnVsZXMpID0+IHtcbiAgICAgICAgICBzZXRMaXN0UGFyYW1zKHsgLi4ubGlzdFBhcmFtcywgc29uYW11RmlsdGVyOiBmaWx0ZXJzLCBwYWdlOiAxIH0pO1xuICAgICAgICAgIHNldEFwcGxpZWRSdWxlcyhydWxlcyk7XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIHByZVRlbXBsYXRlcyxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsImZsYXQiLCJ6IiwiRW50aXR5TWFuYWdlciIsImdldEVudW1JbmZvRnJvbUNvbE5hbWUiLCJnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZSIsImdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lIiwiVGVtcGxhdGUiLCJUZW1wbGF0ZV9fdmlld19saXN0IiwiZ2V0VGFyZ2V0QW5kUGF0aCIsIm5hbWVzIiwidGFyZ2V0IiwicGF0aCIsImZzUGx1cmFsIiwiZ2V0UmVxdWlyZWREaWN0S2V5cyIsIndyYXBUYyIsImJvZHkiLCJrZXkiLCJjb2xsYXBzaW5nIiwiY2xhc3NOYW1lIiwicmVuZGVyQ29sdW1uIiwiZW50aXR5SWQiLCJjb2wiLCJwYXJlbnRPYmoiLCJ3aXRob3V0TmFtZSIsImNvbE5hbWUiLCJuYW1lIiwiaW5jbHVkZXMiLCJwYXJ0cyIsInNwbGl0Iiwiam9pbiIsInJlbmRlclR5cGUiLCJiYXNlTmFtZSIsInBvcCIsInJlcGxhY2UiLCJyZWxQcm9wRmsiLCJ3aXRoIiwibnVsbGFibGUiLCJpZCIsImVudW1JZCIsImxhYmVsIiwicGlja2VkQ2hpbGQiLCJjaGlsZHJlbiIsImZpbmQiLCJjaGlsZCIsImNvbmZpZyIsInBpY2tlZCIsIkVycm9yIiwicmVuZGVyQ29sdW1uSW1wb3J0IiwiY2FwaXRhbCIsInJlbFByb3AiLCJyZXN1bHQiLCJtYXAiLCJnZXROYW1lc0Zyb21JZCIsImVsZW1lbnQiLCJyZW5kZXJGaWx0ZXJJbXBvcnQiLCJmcyIsImNvbXBvbmVudElkIiwiY2FtZWxpemUiLCJ0YXJnZXRFbnRpdHlOYW1lcyIsInRhcmdldE1ETmFtZXMiLCJ0YXJnZXROYW1lcyIsInJlbmRlckZpbHRlciIsImlzQ2xlYXJhYmxlIiwib3B0aW9uYWwiLCJnZXREZWZhdWx0IiwiY29sdW1ucyIsImRlZiIsIm9yZGVyQnkiLCJzZWFyY2giLCJoYXNTZWFyY2giLCJoYXNPcmRlckJ5Iiwib3JkZXJCeVpvZFR5cGUiLCJ6b2RUeXBlIiwiWm9kRW51bSIsIk9iamVjdCIsImtleXMiLCJlbnVtIiwic2VhcmNoWm9kVHlwZSIsInJlbmRlciIsImdldENvbHVtbnNOb2RlIiwiZ2V0Wm9kVHlwZUJ5SWQiLCJ6b2RUeXBlVG9SZW5kZXJpbmdOb2RlIiwiY29sdW1uc05vZGUiLCJsaXN0UGFyYW1zWm9kVHlwZSIsImxpc3RQYXJhbXNOb2RlIiwiZW50aXR5IiwiZ2V0IiwicGtUeXBlIiwiZ2V0UGtUeXBlIiwiaWRUc1R5cGUiLCJzb3J0IiwiYSIsImIiLCJyZW5kZXJlZCIsImNhbWVsTmFtZSIsIl8iLCJjaGFyIiwidG9VcHBlckNhc2UiLCJsYWJlbE5hbWUiLCJ0YyIsImZpdCIsImFsaWduIiwidW5kZWZpbmVkIiwiZmlsdGVyQ29sdW1ucyIsImZpbHRlciIsInByZVRlbXBsYXRlcyIsImNvbHVtbkVudW1zIiwiZm9yRWFjaCIsInB1c2giLCJiYXNlRW51bXMiLCJzb21lIiwiZmlsdGVyRW51bUlkcyIsIkJvb2xlYW4iLCJhbGxFbnVtcyIsIlNldCIsImVudW1JbXBvcnRzIiwiZmxhdE1hcCIsImZrQ29sdW1ucyIsImNvbmZpZ05hbWVzIiwibGVuZ3RoIiwidGl0bGUiLCJjYXBpdGFsUGx1cmFsIiwidHJpbSIsImltcG9ydEtleXMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLGdCQUFnQixhQUFhO0FBQ3BDLFNBQVNDLElBQUksUUFBUSxVQUFVO0FBQy9CLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBQ3hCLFNBQVNDLGFBQWEsUUFBZ0MsaUNBQThCO0FBRXBGLFNBQ0VDLHNCQUFzQixFQUN0QkMsNkJBQTZCLEVBQzdCQywwQkFBMEIsUUFDckIsZ0JBQWE7QUFFcEIsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBRXZDLE9BQU8sTUFBTUMsNEJBQTRCRDtJQUN2QyxhQUFjO1FBQ1osS0FBSyxDQUFDO0lBQ1I7SUFFQUUsaUJBQWlCQyxLQUF3QixFQUFFO1FBQ3pDLE9BQU87WUFDTEMsUUFBUTtZQUNSQyxNQUFNLEdBQUdGLE1BQU1HLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDckM7SUFDRjtJQUVTQyxzQkFBdUM7UUFDOUMsT0FBTztZQUFDO1lBQXFCO1NBQWE7SUFDNUM7SUFFQUMsT0FBT0Ms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
|
|
608
|
+
//#endregion
|
|
609
|
+
export { Template__view_list };
|
|
610
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19saXN0LnRlbXBsYXRlLmpzIiwibmFtZXMiOlsiY29sTmFtZTogc3RyaW5nIiwiY29tcG9uZW50SWQ6IHN0cmluZyIsInoiLCJsYWJlbDogc3RyaW5nIiwicHJlVGVtcGxhdGVzOiBSZW5kZXJlZFRlbXBsYXRlW1wicHJlVGVtcGxhdGVzXCJdIiwiY29sdW1uRW51bXM6IHN0cmluZ1tdIiwiYmFzZUVudW1zOiBzdHJpbmdbXSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19saXN0LnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBmbGF0IH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJpbmdOb2RlLCB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSxcbiAgZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUsXG4gIGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lLFxufSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfbGlzdCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJ2aWV3X2xpc3RcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwid2ViL3NyYy9yb3V0ZXMvYWRtaW5cIixcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzUGx1cmFsfS9pbmRleC50c3hgLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXF1aXJlZERpY3RLZXlzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIFtcImVudGl0eS5saXN0TWFuYWdlXCIsIFwiY29tbW9uLmFsbFwiXTtcbiAgfVxuXG4gIHdyYXBUYyhib2R5OiBzdHJpbmcsIGtleTogc3RyaW5nLCBjb2xsYXBzaW5nOiBib29sZWFuID0gdHJ1ZSwgY2xhc3NOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgcmV0dXJuIGA8VGFibGUuQ2VsbCBrZXk9XCIke2tleX1cIiR7Y29sbGFwc2luZyA/IFwiIGNvbGxhcHNpbmdcIiA6IFwiXCJ9JHtcbiAgICAgIGNsYXNzTmFtZSA/IGAgY2xhc3NOYW1lPXtcXGAke2NsYXNzTmFtZX1cXGB9YCA6IFwiXCJcbiAgICB9PiR7Ym9keX08L1RhYmxlLkNlbGw+YDtcbiAgfVxuXG4gIHJlbmRlckNvbHVtbihcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGNvbDogUmVuZGVyaW5nTm9kZSxcbiAgICBuYW1lczogRW50aXR5TmFtZXNSZWNvcmQsXG4gICAgcGFyZW50T2JqOiBzdHJpbmcgPSBcInJvd1wiLFxuICAgIHdpdGhvdXROYW1lOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZyB7XG4gICAgLy8g7KSR7LKpIOqyveuhnCDsspjrpqwgKOyYiDogXCJ1c2VyLm5hbWVcIiAtPiBcInJvdy51c2VyPy5uYW1lXCIpXG4gICAgbGV0IGNvbE5hbWU6IHN0cmluZztcbiAgICBpZiAod2l0aG91dE5hbWUpIHtcbiAgICAgIGNvbE5hbWUgPSBwYXJlbnRPYmo7XG4gICAgfSBlbHNlIGlmIChjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIC8vIOykkeyyqSDqsr3roZzripQgb3B0aW9uYWwgY2hhaW5pbmfsnLzroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGNvbC5uYW1lLnNwbGl0KFwiLlwiKTtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7cGFydHMuam9pbihcIj8uXCIpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7Y29sLm5hbWV9YDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbC5yZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nLXBsYWluXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGVcIjpcbiAgICAgIGNhc2UgXCJudW1iZXItaWRcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmctaWRcIjpcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICBjYXNlIFwibnVtYmVyLWZrX2lkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWZrX2lkXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKVxuICAgICAgICAgICAgPyAoY29sLm5hbWUuc3BsaXQoXCIuXCIpLnBvcCgpID8/IGNvbC5uYW1lKS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpXG4gICAgICAgICAgICA6IGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIik7XG4gICAgICAgICAgY29uc3QgcmVsUHJvcEZrID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGJhc2VOYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+JHtyZWxQcm9wRmsud2l0aH0jeyR7Y29sTmFtZX19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxuICAgICAgICBpZiAoY29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+eyR7Y29sTmFtZX0gPyBkYXRldGltZUYoJHtjb2xOYW1lfSkgOiAnLSd9PC9zcGFuPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57ZGF0ZXRpbWVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGV0aW1lXCI6XG4gICAgICAgIGlmIChjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57JHtjb2xOYW1lfSA/IGRhdGVGKCR7Y29sTmFtZX0pIDogJy0nfTwvc3Bhbj5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+e2RhdGVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sTmFtZX0gPyA8QmFkZ2UgdmFyaWFudD1cImRlZmF1bHRcIj5PPC9CYWRnZT4gOiA8QmFkZ2UgdmFyaWFudD1cInNlY29uZGFyeVwiPlg8L0JhZGdlPn08Lz5gO1xuICAgICAgY2FzZSBcImVudW1zXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9JHtlbnVtSWR9TGFiZWxbJHtjb2xOYW1lfV19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhcnJheS1pbWFnZXNcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17cn0gYWx0PXtcXGAke2NvbC5sYWJlbCA/PyBjb2wubmFtZX0gXFwke2kgKyAxfVxcYH0gY2xhc3NOYW1lPVwiaC04IHctOCBvYmplY3QtY292ZXIgcm91bmRlZFwiIC8+KSB9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGVcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+eyR7Y29sTmFtZX0gPyA8aW1nIHNyYz17JHtjb2xOYW1lfS51cmx9IGFsdD17JHtjb2xOYW1lfS5uYW1lfSBjbGFzc05hbWU9XCJoLTggdy04IG9iamVjdC1jb3ZlciByb3VuZGVkXCIgLz4gOiAnLSd9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17ci51cmx9IGFsdD17XFxgJHtjb2wubGFiZWwgPz8gY29sLm5hbWV9IFxcJHtpICsgMX1cXGB9IGNsYXNzTmFtZT1cImgtOCB3LTggb2JqZWN0LWNvdmVyIHJvdW5kZWRcIiAvPikgfTwvZGl2PmA7XG4gICAgICBjYXNlIFwibnVtYmVyLXBsYWluXCI6XG4gICAgICAgIHJldHVybiBgPD57JHtjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9bnVtRigke2NvbE5hbWV9KX08Lz5gO1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57JHtjb2wubnVsbGFibGUgPyBgJHtjb2xOYW1lfSA/IGAgOiBcIlwifUpTT04uc3RyaW5naWZ5KCR7Y29sTmFtZX0pJHtjb2wubnVsbGFibGUgPyBgIDogJy0nYCA6IFwiXCJ9fTwvc3Bhbj5gO1xuICAgICAgY2FzZSBcIm9iamVjdC1waWNrXCI6IHtcbiAgICAgICAgY29uc3QgcGlja2VkQ2hpbGQgPSBjb2wuY2hpbGRyZW4/LmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5uYW1lID09PSBjb2wuY29uZmlnPy5waWNrZWQpO1xuICAgICAgICBpZiAoIXBpY2tlZENoaWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvYmplY3QtcGljayDshKDtg50g7Iuk7YyoICjsmKTruIzsoJ3tirg6ICR7Y29sLm5hbWV9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbihcbiAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICBwaWNrZWRDaGlsZCxcbiAgICAgICAgICBuYW1lcyxcbiAgICAgICAgICBgJHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCI/XCIgOiBcIlwifWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8PnsgLyogYXJyYXkgJHtjb2xOYW1lfSAqLyB9PC8+YDtcbiAgICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgICAgLy8gdmVjdG9yIO2DgOyeheydgCDssKjsm5Ag7IiY66eMIO2RnOyLnCAo7Iuk7KCcIOuNsOydtO2EsOuKlCDrhIjrrLQg6rmAKVxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gPyBgIDogXCJcIn1bVmVjdG9yOiB7JHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCJcIiA6IFwiID8/IFtdXCJ9Lmxlbmd0aH1kXSR7Y29sLm51bGxhYmxlID8gXCIgOiAnLSdcIiA6IFwiXCJ9fTwvPmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOugjOuNlCDrtojqsIAg7Lus65+8ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyQ29sdW1uSW1wb3J0KFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgY29sOiBSZW5kZXJpbmdOb2RlLFxuICAgIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCxcbiAgKTogKHN0cmluZyB8IG51bGwpW10ge1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUobmFtZXMuY2FwaXRhbCwgY29sLm5hbWUpO1xuICAgICAgcmV0dXJuIFtgaW1wb3J0IHsgJHtlbnVtSWR9TGFiZWwgfSBmcm9tICdAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWQnO2BdO1xuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoY29sLmNoaWxkcmVuID8/IFtdKS5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgZW50aXR5SWQgPSByZWxQcm9wLndpdGg7XG4gICAgICAgICAgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ29sdW1uSW1wb3J0KGVudGl0eUlkLCBjaGlsZCwgbmFtZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZsYXQocmVzdWx0KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW251bGxdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgICAgaWYgKCFjb2wuZWxlbWVudCkgcmV0dXJuIFtudWxsXTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbkltcG9ydChlbnRpdHlJZCwgY29sLmVsZW1lbnQsIG5hbWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW251bGxdO1xuICB9XG5cbiAgcmVuZGVyRmlsdGVySW1wb3J0KGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gYGltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dCB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0XCI7YDtcbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkLCB0YXJnZXRFbnRpdHlOYW1lczogdGFyZ2V0TUROYW1lcyB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShcbiAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgY29sLm5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGAke2lkfVNlbGVjdGA7XG4gICAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHt0YXJnZXRNRE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gYCR7cmVsUHJvcC53aXRofUlkQXN5bmNTZWxlY3RgO1xuICAgICAgICByZXR1cm4gYGltcG9ydCB7ICR7Y29tcG9uZW50SWR9IH0gZnJvbSBcIkAvY29tcG9uZW50cy8ke3RhcmdldE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg66CM642UIOu2iOqwgOuKpe2VnCDtlYTthLAg7J6E7Y+s7Yq4ICR7Y29sLm5hbWV9ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyRmlsdGVyKGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NsZWFyYWJsZSA9IGNvbC5vcHRpb25hbCA9PT0gdHJ1ZSAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCI7XG4gICAgbGV0IGNvbXBvbmVudElkOiBzdHJpbmc7XG4gICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGNvbXBvbmVudElkID0gYCR7aWR9U2VsZWN0YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwifSAvPmA7XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtyZWxQcm9wLndpdGh9SWRBc3luY1NlbGVjdGA7XG4gICAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtcbiAgICAgICAgICBpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwiXG4gICAgICAgIH0gc3Vic2V0PVwiQVwiIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDroIzrjZQg67aI6rCA64ql7ZWcIO2VhO2EsCDsnoTtj6ztirggJHtjb2wubmFtZX0gJHtjb2wucmVuZGVyVHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBnZXREZWZhdWx0KGNvbHVtbnM6IFJlbmRlcmluZ05vZGVbXSk6IHtcbiAgICBvcmRlckJ5OiBzdHJpbmc7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgaGFzU2VhcmNoOiBib29sZWFuO1xuICAgIGhhc09yZGVyQnk6IGJvb2xlYW47XG4gIH0ge1xuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgIG9yZGVyQnk6IFwiXCIsXG4gICAgICBzZWFyY2g6IFwiXCIsXG4gICAgICBoYXNTZWFyY2g6IGZhbHNlLFxuICAgICAgaGFzT3JkZXJCeTogZmFsc2UsXG4gICAgfTtcbiAgICBjb25zdCBvcmRlckJ5Wm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpPy56b2RUeXBlO1xuICAgIGlmIChvcmRlckJ5Wm9kVHlwZSAmJiBvcmRlckJ5Wm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLm9yZGVyQnkgPSBPYmplY3Qua2V5cyhvcmRlckJ5Wm9kVHlwZS5lbnVtKVswXTtcbiAgICAgIGRlZi5oYXNPcmRlckJ5ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoWm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIik/LnpvZFR5cGU7XG4gICAgaWYgKHNlYXJjaFpvZFR5cGUgJiYgc2VhcmNoWm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLnNlYXJjaCA9IE9iamVjdC5rZXlzKHNlYXJjaFpvZFR5cGUuZW51bSlbMF07XG4gICAgICBkZWYuaGFzU2VhcmNoID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZjtcbiAgfVxuXG4gIGFzeW5jIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcInZpZXdfbGlzdFwiXSkge1xuICAgIGNvbnN0IHsgZ2V0Q29sdW1uc05vZGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS1jb252ZXJ0ZXJcIik7XG4gICAgY29uc3QgeyBnZXRab2RUeXBlQnlJZCwgem9kVHlwZVRvUmVuZGVyaW5nTm9kZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vem9kLWNvbnZlcnRlclwiKTtcblxuICAgIGNvbnN0IGNvbHVtbnNOb2RlID0gYXdhaXQgZ2V0Q29sdW1uc05vZGUoZW50aXR5SWQsIFwiQVwiKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zWm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfUxpc3RQYXJhbXNgKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUobGlzdFBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAvLyBQSyDtg4DsnoUg6rCQ7KeAXG4gICAgY29uc3QgcGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgIGNvbnN0IGlkVHNUeXBlID0gcGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcblxuICAgIC8vIOyLpOygnCDrpqzsiqTtirgg7Lus65+8XG4gICAgY29uc3QgY29sdW1ucyA9IChjb2x1bW5zTm9kZS5jaGlsZHJlbiBhcyBSZW5kZXJpbmdOb2RlW10pXG5cbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gKGEubmFtZSA9PT0gXCJpZFwiID8gLTEgOiBiLm5hbWUgPT09IFwiaWRcIiA/IDEgOiAwKSlcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IHRoaXMucmVuZGVyQ29sdW1uKGVudGl0eUlkLCBjb2wsIG5hbWVzKTtcblxuICAgICAgICAvLyDrnbzrsqgg7IOd7ISxOiBjb21tb24g7ZWE65OcKGNyZWF0ZWRfYXQp64qUIFNEKFwiY29tbW9uLntmaWVsZH1cIiksIGVudGl0eSDtlYTrk5zripQgU0QoXCJlbnRpdHkue0VudGl0eX0ue2ZpZWxkfVwiKVxuICAgICAgICBsZXQgbGFiZWw6IHN0cmluZztcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgICBsYWJlbCA9ICdcIklEXCInO1xuICAgICAgICB9IGVsc2UgaWYgKFtcImNyZWF0ZWRfYXRcIl0uaW5jbHVkZXMoY29sLm5hbWUpKSB7XG4gICAgICAgICAgLy8gY2FtZWxDYXNl66GcIOuzgO2ZmCAoY3JlYXRlZF9hdCAtPiBjcmVhdGVkQXQpXG4gICAgICAgICAgY29uc3QgY2FtZWxOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGNoYXIpID0+IGNoYXIudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgbGFiZWwgPSBgU0QoXCJjb21tb24uJHtjYW1lbE5hbWV9XCIpYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsYWJlbE5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGxhYmVsID0gYFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH0uJHtsYWJlbE5hbWV9XCIpYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdGM6IGAocm93KSA9PiAke3JlbmRlcmVkfWAsXG4gICAgICAgICAgZml0OlxuICAgICAgICAgICAgY29sLm5hbWUgPT09IFwiaWRcIiB8fFxuICAgICAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWlkXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcImRhdGV0aW1lXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRldGltZVwiLFxuICAgICAgICAgIGFsaWduOiBjb2wubmFtZSA9PT0gXCJpZFwiIHx8IGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1pZFwiID8gXCJjZW50ZXJcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvFxuICAgIGNvbnN0IGZpbHRlckNvbHVtbnMgPSAobGlzdFBhcmFtc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGNvbCkgPT5cbiAgICAgICAgICBjb2wubmFtZSAhPT0gXCJpZFwiICYmXG4gICAgICAgICAgY29sLm5hbWUgIT09IFwicXVlcnlNb2RlXCIgJiZcbiAgICAgICAgICBbXCJlbnVtc1wiLCBcIm51bWJlci1pZFwiLCBcIm51bWJlci1ma19pZFwiLCBcInN0cmluZy1ma19pZFwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSksXG4gICAgICApXG4gICAgICAvLyBvcmRlckJ56rCAIOqwgOyepSDrkqTroZwg7Jik6rKMIOyInOyEnCDsobDsoJVcbiAgICAgIC50b1NvcnRlZCgoYSkgPT4ge1xuICAgICAgICByZXR1cm4gYS5uYW1lID09PSBcIm9yZGVyQnlcIiA/IDEgOiAtMTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvOydhCDtlITrpqwg7YWc7ZSM66a/7Jy866GcIOyEpOyglVxuICAgIGNvbnN0IHByZVRlbXBsYXRlczogUmVuZGVyZWRUZW1wbGF0ZVtcInByZVRlbXBsYXRlc1wiXSA9IFtdO1xuXG4gICAgLy8g7Lus65+87JeQ7IScIOyCrOyaqe2VmOuKlCBlbnVt65OkIOyImOynkVxuICAgIGNvbnN0IGNvbHVtbkVudW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIChjb2x1bW5zTm9kZS5jaGlsZHJlbiA/PyBbXSkuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGNvbHVtbkVudW1zLnB1c2goZW51bUlkKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g65SU7Y+07Yq4IO2MjOudvOuvuO2EsFxuICAgIC8vIGNvbnN0IGRlZiA9IHRoaXMuZ2V0RGVmYXVsdChmaWx0ZXJDb2x1bW5zKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IHsgdXNlU3RhdGUsIEZyYWdtZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVGaWxlUm91dGUsIHVzZU5hdmlnYXRlIH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIjtcblxuaW1wb3J0IHsgQ2FyZCwgQ2FyZENvbnRlbnQsIENhcmRIZWFkZXIgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBCYWRnZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IFBhZ2luYXRpb24sIFRhYmxlLCBUYWJsZUJvZHksIFRhYmxlQ2VsbCwgdHlwZSBUYWJsZUNvbCwgVGFibGVIZWFkLCBUYWJsZUhlYWRlciwgVGFibGVSb3cgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBFbnVtU2VsZWN0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQWxlcnREaWFsb2csIEFsZXJ0RGlhbG9nQWN0aW9uLCBBbGVydERpYWxvZ0NhbmNlbCwgQWxlcnREaWFsb2dDb250ZW50LCBBbGVydERpYWxvZ0Rlc2NyaXB0aW9uLCBBbGVydERpYWxvZ0Zvb3RlciwgQWxlcnREaWFsb2dIZWFkZXIsIEFsZXJ0RGlhbG9nVGl0bGUgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IENoZWNrYm94IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgU29uYW11RmlsdGVyTW9kYWwsIFNvbmFtdUZpbHRlclBvcG92ZXIsIGV4dHJhY3RGaWVsZE1ldGFGcm9tU2NoZW1hLCB0eXBlIFJ1bGUgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5cbmltcG9ydCB7IHVzZUxpc3RQYXJhbXMsIG51bUYsIGRhdGVGLCBkYXRldGltZUYgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9saWJcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRBLCAke25hbWVzLmNhcGl0YWx9QmFzZVNjaGVtYSB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvc2VydmljZXMuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9TGlzdFBhcmFtcyB9IGZyb20gXCJAL3NlcnZpY2VzLyR7bmFtZXMuZnN9LyR7bmFtZXMuZnN9LnR5cGVzXCI7XG5pbXBvcnQgeyAkeygoKSA9PiB7XG4gICAgICAgIC8vIOq4sOuzuCBlbnVtIOyImOynkSAoZmlsdGVyQ29sdW1uc+yXkCDsnojripQg6rKD66eMKVxuICAgICAgICBjb25zdCBiYXNlRW51bXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKSkge1xuICAgICAgICAgIGJhc2VFbnVtcy5wdXNoKGAke25hbWVzLmNhcGl0YWx9T3JkZXJCeWAsIGAke25hbWVzLmNhcGl0YWx9T3JkZXJCeUxhYmVsYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikpIHtcbiAgICAgICAgICBiYXNlRW51bXMucHVzaChgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkYCwgYCR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZExhYmVsYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtlYTthLAgZW51bSDsiJjsp5EgKGNvbmZpZy5lbnVtSWQg7Jqw7ISgLCDsl4bsnLzrqbQgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSlcbiAgICAgICAgY29uc3QgZmlsdGVyRW51bUlkcyA9IGZpbHRlckNvbHVtbnNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIiAmJiBjb2wubmFtZSAhPT0gXCJzZWFyY2hcIiAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC5jb25maWcgJiYgXCJlbnVtSWRcIiBpbiBjb2wuY29uZmlnKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoY29sLmNvbmZpZyBhcyB7IGVudW1JZDogc3RyaW5nIH0pLmVudW1JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICByZXR1cm4gZW51bUlkO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAvLyDrqqjrk6AgZW51bSDtlansuZjqs6Ag7KSR67O1IOygnOqxsFxuICAgICAgICBjb25zdCBhbGxFbnVtcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFbnVtSWRzLCAuLi5jb2x1bW5FbnVtc10pXTtcbiAgICAgICAgY29uc3QgZW51bUltcG9ydHMgPSBhbGxFbnVtcy5mbGF0TWFwKChlbnVtSWQpID0+IFtgJHtlbnVtSWR9YCwgYCR7ZW51bUlkfUxhYmVsYF0pO1xuXG4gICAgICAgIHJldHVybiBbLi4uYmFzZUVudW1zLCAuLi5lbnVtSW1wb3J0c10uam9pbihcIiwgXCIpO1xuICAgICAgfSkoKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBJZEFzeW5jU2VsZWN0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuJHsoKCkgPT4ge1xuICAvLyBGSyDtlYTrk5zsnZggQXN5bmNJZENvbmZpZyBpbXBvcnRcbiAgY29uc3QgZmtDb2x1bW5zID0gZmlsdGVyQ29sdW1ucy5maWx0ZXIoXG4gICAgKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIsXG4gICk7XG4gIGNvbnN0IGNvbmZpZ05hbWVzID0gZmtDb2x1bW5zXG4gICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICByZXR1cm4gYCR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWdgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIGNvbmZpZ05hbWVzLmxlbmd0aCA+IDBcbiAgICA/IGBpbXBvcnQgeyAke2NvbmZpZ05hbWVzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtgXG4gICAgOiBcIlwiO1xufSkoKX1cblxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCJ+aWNvbnMvbHVjaWRlL3NxdWFyZS1wZW5cIjtcbmltcG9ydCBUcmFzaEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvdHJhc2gtMlwiO1xuaW1wb3J0IEZpbHRlckljb24gZnJvbSBcIn5pY29ucy9tZGkvZmlsdGVyLXZhcmlhbnRcIjtcbmltcG9ydCBMaXN0SWNvbiBmcm9tIFwifmljb25zL21kaS9mb3JtYXQtbGlzdC1idWxsZXRlZFwiO1xuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIn5pY29ucy9tZGkvbWFnbmlmeVwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiQC9pMThuL3NkLmdlbmVyYXRlZFwiO1xuXG5leHBvcnQgY29uc3QgUm91dGUgPSBjcmVhdGVGaWxlUm91dGUoXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH0vXCIpKHtcXG4gIGhlYWQ6ICgpID0+ICh7XFxuICAgIG1ldGE6IFtcXG4gICAgICB7IHRpdGxlOiBcIiR7ZW50aXR5LnRpdGxlID8/IG5hbWVzLmNhcGl0YWx9IExpc3RcIiB9LFxcbiAgICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvblwiLCBjb250ZW50OiBTRChcImVudGl0eS5saXN0TWFuYWdlXCIpKFwiJHtlbnRpdHkudGl0bGUgPz8gbmFtZXMuY2FwaXRhbH1cIikgfSxcXG4gICAgXSxcXG4gIH0pLFxcbiAgY29tcG9uZW50OiAke25hbWVzLmNhcGl0YWx9TGlzdCxcXG59KTtcXG5cXG50eXBlICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMgPSB7fTtcblxuZnVuY3Rpb24gJHtuYW1lcy5jYXBpdGFsfUxpc3Qoe306ICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMpIHtcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuXG4gIC8vIOyDge2DnCDqtIDrpqxcbiAgY29uc3QgW3NlbGVjdGVkSXRlbXMsIHNldFNlbGVjdGVkSXRlbXNdID0gdXNlU3RhdGU8U2V0PCR7aWRUc1R5cGV9Pj4obmV3IFNldCgpKTtcbiAgY29uc3QgW2RlbGV0ZURpYWxvZ09wZW4sIHNldERlbGV0ZURpYWxvZ09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXRlbVRvRGVsZXRlLCBzZXRJdGVtVG9EZWxldGVdID0gdXNlU3RhdGU8eyBpZDogJHtpZFRzVHlwZX07IG5hbWU/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbZmlsdGVyTW9kYWxPcGVuLCBzZXRGaWx0ZXJNb2RhbE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbYXBwbGllZFJ1bGVzLCBzZXRBcHBsaWVkUnVsZXNdID0gdXNlU3RhdGU8UnVsZVtdPihbXSk7XG5cbiAgLy8g66as7Iqk7Yq4IO2VhO2EsFxuICBjb25zdCB7IGxpc3RQYXJhbXMsIHJlZ2lzdGVyLCBzZXRMaXN0UGFyYW1zIH0gPSB1c2VMaXN0UGFyYW1zKCR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zLCB7XG4gICAgbnVtOiAxMCxcbiAgICBwYWdlOiAxLFxuICAgIGtleXdvcmQ6IFwiXCIsJHtcbiAgICAgIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIilcbiAgICAgICAgPyBgXG4gICAgc2VhcmNoOiAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGQub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH0ke1xuICAgICAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIilcbiAgICAgICAgPyBgXG4gICAgb3JkZXJCeTogJHtuYW1lcy5jYXBpdGFsfU9yZGVyQnkub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH1cbiAgICBzb25hbXVGaWx0ZXI6IHt9LFxuICB9KTtcblxuICAvLyDrpqzsiqTtirgg7L+866asXG4gIGNvbnN0IHsgZGF0YSwgcmVmZXRjaCwgaXNMb2FkaW5nIH0gPSAke25hbWVzLmNhcGl0YWx9U2VydmljZS51c2Uke25hbWVzLmNhcGl0YWxQbHVyYWx9KFwiQVwiLCBsaXN0UGFyYW1zKTtcbiAgY29uc3QgeyByb3dzLCB0b3RhbCB9ID0gZGF0YSA/PyB7fTtcblxuICAvLyDtmITsnqwg6rK966Gc7JmAIO2DgOydtO2LgFxuICBjb25zdCBQQUdFID0ge1xuICAgIHJvdXRlOiBcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfVwiLFxuICAgIHRpdGxlOiBTRChcImVudGl0eS5saXN0XCIpKFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH1cIikpLFxuICB9O1xuXG4gIC8vIOy7rOufvCDsoJXsnZhcbiAgdHlwZSAke25hbWVzLmNhcGl0YWx9Um93ID0gTm9uTnVsbGFibGU8dHlwZW9mIHJvd3M+W251bWJlcl07XG4gIGNvbnN0IGNvbHVtbnM6IFRhYmxlQ29sPCR7bmFtZXMuY2FwaXRhbH1Sb3c+W10gPSBbXG4ke2NvbHVtbnNcbiAgLm1hcChcbiAgICAoY29sKSA9PiBgICAgIHtcbiAgICAgIGxhYmVsOiAke2NvbC5sYWJlbH0sXG4gICAgICB0YzogJHtjb2wudGN9LCR7XG4gICAgICAgIGNvbC5maXRcbiAgICAgICAgICA/IGBcbiAgICAgIGZpdDogdHJ1ZSxgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9JHtcbiAgICAgICAgY29sLmFsaWduXG4gICAgICAgICAgPyBgXG4gICAgICBhbGlnbjogXCIke2NvbC5hbGlnbn1cIixgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9XG4gICAgfWAsXG4gIClcbiAgLmpvaW4oXCIsXFxuXCIpfSxcbiAgICB7XG4gICAgICBsYWJlbDogU0QoXCJjb21tb24ubWFuYWdlXCIpLFxuICAgICAgZml0OiB0cnVlLFxuICAgICAgYWxpZ246IFwiY2VudGVyXCIsXG4gICAgICB0YzogKHJvdykgPT4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cInllbGxvd1wiXG4gICAgICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICAgICAgaWNvbj17PEVkaXRJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gbmF2aWdhdGUoeyB0bzogXFxgXFwke1BBR0Uucm91dGV9L2Zvcm1cXGAsIHNlYXJjaDogeyBpZDogcm93LmlkIH0gfSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwicmVkXCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICBpY29uPXs8VHJhc2hJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVsZXRlQ2xpY2socm93LmlkKX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICksXG4gICAgfSxcbiAgXTtcblxuICAvLyDshKDtg50g7ZW465Ok65+sXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZUl0ZW0gPSAoaWQ6ICR7aWRUc1R5cGV9KSA9PiB7XG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IFNldChzZWxlY3RlZEl0ZW1zKTtcbiAgICBpZiAobmV3U2VsZWN0aW9uLmhhcyhpZCkpIHtcbiAgICAgIG5ld1NlbGVjdGlvbi5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTZWxlY3Rpb24uYWRkKGlkKTtcbiAgICB9XG4gICAgc2V0U2VsZWN0ZWRJdGVtcyhuZXdTZWxlY3Rpb24pO1xuICB9O1xuXG4gIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChyb3dzPy5sZW5ndGggPz8gMCkgPiAwICYmIHJvd3MhLmV2ZXJ5KChyb3cpID0+IHNlbGVjdGVkSXRlbXMuaGFzKHJvdy5pZCkpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdEFsbCA9IChjaGVja2VkOiBib29sZWFuKSA9PiB7XG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIHNldFNlbGVjdGVkSXRlbXMobmV3IFNldChyb3dzPy5tYXAoKHJvdykgPT4gcm93LmlkKSA/PyBbXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTZWxlY3RlZEl0ZW1zKG5ldyBTZXQoKSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIOyCreygnCDtlbjrk6Trn6xcbiAgY29uc3QgaGFuZGxlRGVsZXRlQ2xpY2sgPSAoaWQ6ICR7aWRUc1R5cGV9LCBuYW1lPzogc3RyaW5nKSA9PiB7XG4gICAgc2V0SXRlbVRvRGVsZXRlKHsgaWQsIG5hbWUgfSk7XG4gICAgc2V0RGVsZXRlRGlhbG9nT3Blbih0cnVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb25maXJtRGVsZXRlID0gKCkgPT4ge1xuICAgIGlmIChpdGVtVG9EZWxldGUpIHtcbiAgICAgICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLmRlbChbaXRlbVRvRGVsZXRlLmlkXSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJlZmV0Y2goKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXREZWxldGVEaWFsb2dPcGVuKGZhbHNlKTtcbiAgICBzZXRJdGVtVG9EZWxldGUobnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LVsxODAwcHhdIG14LWF1dG8gcC04XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02IG1iLThcIj5cbiAgICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxMaXN0SWNvbiBjbGFzc05hbWU9XCJoLTUgdy01XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCBoLTVcIj57UEFHRS50aXRsZX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJzaGFkb3ctc20gYm9yZGVyLWJvcmRlci80MCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cInBiLTAgcHgtMCBwdC0wXCI+XG4gICAgICAgICAgICAgIHsvKiBGaWx0ZXJzICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWdyYXktMTAwIHB4LTYgcHktNCBzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtcbiAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKVxuICAgID8gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZH1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXske25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRMYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwic2VhcmNoXCIpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoVHlwZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy01MCBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleC0xIG1heC13LXhzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcImtleXdvcmRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e1NEKFwiY29tbW9uLnNlYXJjaFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggcHItOCB0ZXh0LXhzIGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj17PFNlYXJjaEljb24gLz59XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMCB0b3AtMCBoLTggdy04IGhvdmVyOmJnLXRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1sLWF1dG8gZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCBweC00IGJnLXByaW1hcnkgaG92ZXI6YmctcHJpbWFyeS85MCB0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZSh7IHRvOiBcXGBcXCR7UEFHRS5yb3V0ZX0vZm9ybVxcYCB9KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57U0QoXCJjb21tb24uY3JlYXRlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxTb25hbXVGaWx0ZXJQb3BvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgcnVsZXM9e2FwcGxpZWRSdWxlc31cbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZE1ldGE9e2V4dHJhY3RGaWVsZE1ldGFGcm9tU2NoZW1hKFxuICAgICAgICAgICAgICAgICAgICAgICAgJHtuYW1lcy5jYXBpdGFsfUJhc2VTY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICBTRCBhcyAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxGaWx0ZXJJY29uIC8+fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0RmlsdGVyTW9kYWxPcGVuKHRydWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzXCI+e1NEKFwicmMuc29uYW11RmlsdGVyLnRpdGxlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZSB2YXJpYW50PVwic2Vjb25kYXJ5XCIgY2xhc3NOYW1lPVwibWwtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RofVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0JhZGdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9Tb25hbXVGaWx0ZXJQb3BvdmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtmaWx0ZXJDb2x1bW5zXG4gIC5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IFwic2VhcmNoXCIgJiYgY29sLm5hbWUgIT09IFwib3JkZXJCeVwiKVxuICAubWFwKChjb2wpID0+IHtcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29uZmlnLmVudW1JZOqwgCDsnojsnLzrqbQg7Jqw7ISgIOyCrOyaqSwg7JeG7Jy866m0IGdldEVudW1JbmZvRnJvbUNvbE5hbWUg7Iuc64+EXG4gICAgICAgIGNvbnN0IGVudW1JZCA9XG4gICAgICAgICAgY29sLmNvbmZpZyAmJiBcImVudW1JZFwiIGluIGNvbC5jb25maWdcbiAgICAgICAgICAgID8gKGNvbC5jb25maWcgYXMgeyBlbnVtSWQ6IHN0cmluZyB9KS5lbnVtSWRcbiAgICAgICAgICAgIDogZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpLmlkO1xuICAgICAgICByZXR1cm4gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGtleT17XFxgJHtjb2wubmFtZX0tXFwke2xpc3RQYXJhbXMuJHtjb2wubmFtZX19XFxgfVxuICAgICAgICAgICAgICAgICAgICBlbnVtPXske2VudW1JZH19XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscz17JHtlbnVtSWR9TGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcIiR7Y29sLm5hbWV9XCIpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiR7Y29sLmxhYmVsfVwiXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyYWJsZVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZLIO2VhOuTnCAoSWRBc3luY1NlbGVjdClcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIHJldHVybiBgICAgICAgICAgICAgICAgICAgPElkQXN5bmNTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnPXske3JlbFByb3Aud2l0aH1Bc3luY0lkQ29uZmlnfVxuICAgICAgICAgICAgICAgICAgICBzdWJzZXQ9XCJBXCJcbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwiJHtjb2wubmFtZX1cIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtjb2wubGFiZWwgPz8gcmVsUHJvcC53aXRofVwiXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyYWJsZVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH0pXG4gIC5maWx0ZXIoQm9vbGVhbilcbiAgLmpvaW4oXCJcXG5cIil9XG4ke1xuICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKVxuICAgID8gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5fVxuICAgICAgICAgICAgICAgICAgICBsYWJlbHM9eyR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5TGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcIm9yZGVyQnlcIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtTRChcImNvbW1vbi5zb3J0XCIpfVxuICAgICAgICAgICAgICAgICAgICB0ZXh0UHJlZml4PXtcXGBcXCR7U0QoXCJjb21tb24uc29ydFwiKX06IFxcYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy01MCBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPntTRChcImNvbW1vbi5yZXN1bHRzXCIpKHRvdGFsID8/IDApfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG5cbiAgICAgICAgICAgIDxDYXJkQ29udGVudCBjbGFzc05hbWU9XCJweC02IHBiLTYgcHQtNiBiZy13aGl0ZVwiPlxuICAgICAgICAgICAgICB7LyogVGFibGUgKi99XG4gICAgICAgICAgICAgIDxUYWJsZT5cbiAgICAgICAgICAgICAgICA8VGFibGVIZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8VGFibGVSb3cgY2xhc3NOYW1lPVwiaG92ZXI6YmctdHJhbnNwYXJlbnQgYmctZ3JheS0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPFRhYmxlSGVhZCBjbGFzc05hbWU9XCJoLTkgdGV4dC14cyB3LVs0MHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aXNBbGxTZWxlY3RlZCgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17aGFuZGxlU2VsZWN0QWxsfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvVGFibGVIZWFkPlxuICAgICAgICAgICAgICAgICAgICB7Y29sdW1ucy5tYXAoKGNvbCwgaWR4KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPFRhYmxlSGVhZCBrZXk9e2lkeH0gZml0PXtjb2wuZml0fSBhbGlnbj17Y29sLmFsaWdufT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2wubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICAgICAgICA8L1RhYmxlSGVhZGVyPlxuICAgICAgICAgICAgICAgIDxUYWJsZUJvZHk+XG4gICAgICAgICAgICAgICAgICB7IWlzTG9hZGluZyAmJiByb3dzICYmIHJvd3MubWFwKChyb3cpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPEZyYWdtZW50IGtleT17cm93LmlkfT5cbiAgICAgICAgICAgICAgICAgICAgICA8VGFibGVSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsIGNsYXNzTmFtZT1cInB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWRJdGVtcy5oYXMocm93LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoKSA9PiBoYW5kbGVUb2dnbGVJdGVtKHJvdy5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW5zLm1hcCgoY29sLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFRhYmxlQ2VsbCBrZXk9e2lkeH0gZml0PXtjb2wuZml0fSBhbGlnbj17Y29sLmFsaWdufSBjbGFzc05hbWU9XCJweS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbC50Yyhyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVSb3c+XG4gICAgICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L1RhYmxlQm9keT5cbiAgICAgICAgICAgICAgPC9UYWJsZT5cblxuICAgICAgICAgICAgICB7LyogUGFnaW5hdGlvbiAqL31cbiAgICAgICAgICAgICAgPFBhZ2luYXRpb25cbiAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCJwYWdlXCIpfVxuICAgICAgICAgICAgICAgIHRvdGFsPXt0b3RhbCA/PyAwfVxuICAgICAgICAgICAgICAgIGl0ZW1zUGVyUGFnZT17bGlzdFBhcmFtcy5udW0gPz8gMTB9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERlbGV0ZSBEaWFsb2cgKi99XG4gICAgICA8QWxlcnREaWFsb2cgb3Blbj17ZGVsZXRlRGlhbG9nT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXREZWxldGVEaWFsb2dPcGVufT5cbiAgICAgICAgPEFsZXJ0RGlhbG9nQ29udGVudD5cbiAgICAgICAgICA8QWxlcnREaWFsb2dIZWFkZXI+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dUaXRsZT57U0QoXCJkZWxldGUuY29uZmlybS50aXRsZVwiKX08L0FsZXJ0RGlhbG9nVGl0bGU+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dEZXNjcmlwdGlvbj57U0QoXCJkZWxldGUuY29uZmlybS5kZXNjcmlwdGlvblwiKX08L0FsZXJ0RGlhbG9nRGVzY3JpcHRpb24+XG4gICAgICAgICAgPC9BbGVydERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICA8QWxlcnREaWFsb2dGb290ZXI+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dDYW5jZWw+e1NEKFwiY29tbW9uLmNhbmNlbFwiKX08L0FsZXJ0RGlhbG9nQ2FuY2VsPlxuICAgICAgICAgICAgPEFsZXJ0RGlhbG9nQWN0aW9uIG9uQ2xpY2s9e2hhbmRsZUNvbmZpcm1EZWxldGV9PlxuICAgICAgICAgICAgICB7U0QoXCJjb21tb24uZGVsZXRlXCIpfVxuICAgICAgICAgICAgPC9BbGVydERpYWxvZ0FjdGlvbj5cbiAgICAgICAgICA8L0FsZXJ0RGlhbG9nRm9vdGVyPlxuICAgICAgICA8L0FsZXJ0RGlhbG9nQ29udGVudD5cbiAgICAgIDwvQWxlcnREaWFsb2c+XG5cbiAgICAgIHsvKiBTb25hbXUgRmlsdGVyIE1vZGFsICovfVxuICAgICAgPFNvbmFtdUZpbHRlck1vZGFsXG4gICAgICAgIGJhc2VTY2hlbWE9eyR7bmFtZXMuY2FwaXRhbH1CYXNlU2NoZW1hfVxuICAgICAgICBvcGVuPXtmaWx0ZXJNb2RhbE9wZW59XG4gICAgICAgIG9uT3BlbkNoYW5nZT17c2V0RmlsdGVyTW9kYWxPcGVufVxuICAgICAgICBpbml0aWFsUnVsZXM9e2FwcGxpZWRSdWxlc31cbiAgICAgICAgb25BcHBseT17KGZpbHRlcnMsIHJ1bGVzKSA9PiB7XG4gICAgICAgICAgc2V0TGlzdFBhcmFtcyh7IC4uLmxpc3RQYXJhbXMsIHNvbmFtdUZpbHRlcjogZmlsdGVycywgcGFnZTogMSB9KTtcbiAgICAgICAgICBzZXRBcHBsaWVkUnVsZXMocnVsZXMpO1xuICAgICAgICB9fVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiAgICAgIGAudHJpbSgpLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICBwcmVUZW1wbGF0ZXMsXG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztxQkFJNEQ7Y0FPeEM7ZUFFbUI7QUFFdkMsSUFBYSxzQkFBYixjQUF5QyxTQUFTO0NBQ2hELGNBQWM7QUFDWixRQUFNLFlBQVk7O0NBR3BCLGlCQUFpQixPQUEwQjtBQUN6QyxTQUFPO0dBQ0wsUUFBUTtHQUNSLE1BQU0sR0FBRyxNQUFNLFNBQVM7R0FDekI7O0NBR0gsQUFBUyxzQkFBdUM7QUFDOUMsU0FBTyxDQUFDLHFCQUFxQixhQUFhOztDQUc1QyxPQUFPLE1BQWMsS0FBYSxhQUFzQixNQUFNLFlBQW9CLElBQUk7QUFDcEYsU0FBTyxvQkFBb0IsSUFBSSxHQUFHLGFBQWEsZ0JBQWdCLEtBQzdELFlBQVksaUJBQWlCLFVBQVUsT0FBTyxHQUMvQyxHQUFHLEtBQUs7O0NBR1gsYUFDRSxVQUNBLEtBQ0EsT0FDQSxZQUFvQixPQUNwQixjQUF1QixPQUNmO0VBRVIsSUFBSUE7QUFDSixNQUFJLGFBQWE7QUFDZixhQUFVO2FBQ0QsSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFO0dBRWpDLE1BQU0sUUFBUSxJQUFJLEtBQUssTUFBTSxJQUFJO0FBQ2pDLGFBQVUsR0FBRyxVQUFVLEdBQUcsTUFBTSxLQUFLLEtBQUs7U0FDckM7QUFDTCxhQUFVLEdBQUcsVUFBVSxHQUFHLElBQUk7O0FBR2hDLFVBQVEsSUFBSSxZQUFaO0dBQ0UsS0FBSztHQUNMLEtBQUs7R0FDTCxLQUFLO0dBQ0wsS0FBSyxZQUNILFFBQU8sTUFBTSxRQUFRO0dBQ3ZCLEtBQUs7R0FDTCxLQUFLLGdCQUFnQjtBQUNuQixRQUFJO0tBQ0YsTUFBTSxXQUFXLElBQUksS0FBSyxTQUFTLElBQUksSUFDbEMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLE1BQU0sUUFBUSxPQUFPLEdBQUcsR0FDMUQsSUFBSSxLQUFLLFFBQVEsT0FBTyxHQUFHO0tBQy9CLE1BQU0sWUFBWSwyQkFBMkIsVUFBVSxTQUFTO0FBQ2hFLFlBQU8sS0FBSyxVQUFVLEtBQUssSUFBSSxRQUFRO1lBQ2pDO0FBQ04sWUFBTyxNQUFNLFFBQVE7OztHQUd6QixLQUFLLFdBQ0gsS0FBSSxJQUFJLFlBQVksSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFO0FBQzFDLFdBQU8sVUFBVSxRQUFRLGVBQWUsUUFBUTtVQUMzQztBQUNMLFdBQU8sb0JBQW9CLFFBQVE7O0dBRXZDLEtBQUssa0JBQ0gsS0FBSSxJQUFJLFlBQVksSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFO0FBQzFDLFdBQU8sVUFBVSxRQUFRLFdBQVcsUUFBUTtVQUN2QztBQUNMLFdBQU8sZ0JBQWdCLFFBQVE7O0dBRW5DLEtBQUssVUFDSCxRQUFPLE1BQU0sUUFBUTtHQUN2QixLQUFLLFNBQVM7QUFDWixRQUFJO0tBQ0YsTUFBTSxFQUFFLElBQUksV0FBVyx1QkFBdUIsVUFBVSxJQUFJLEtBQUs7QUFDakUsWUFBTyxNQUFNLElBQUksV0FBVyxHQUFHLFFBQVEsUUFBUSxLQUFLLE9BQU8sUUFBUSxRQUFRO1lBQ3JFO0FBQ04sWUFBTyxNQUFNLFFBQVE7OztHQUd6QixLQUFLLGVBQ0gsUUFBTyxpQ0FBaUMsUUFBUSxrQkFDOUMsSUFBSSxXQUFXLFVBQVUsR0FDMUIsOEJBQThCLElBQUksU0FBUyxJQUFJLEtBQUs7R0FDdkQsS0FBSyxrQkFDSCxRQUFPLDZDQUE2QyxRQUFRLGVBQWUsUUFBUSxhQUFhLFFBQVE7R0FDMUcsS0FBSyx3QkFDSCxRQUFPLGlDQUFpQyxRQUFRLGtCQUM5QyxJQUFJLFdBQVcsVUFBVSxHQUMxQixrQ0FBa0MsSUFBSSxTQUFTLElBQUksS0FBSztHQUMzRCxLQUFLLGVBQ0gsUUFBTyxNQUFNLElBQUksWUFBWSxJQUFJLEtBQUssU0FBUyxJQUFJLEdBQUcsR0FBRyxRQUFRLFFBQVEsR0FBRyxPQUFPLFFBQVE7R0FDN0YsS0FBSyxTQUNILFFBQU8sOEJBQThCLElBQUksV0FBVyxHQUFHLFFBQVEsT0FBTyxHQUFHLGlCQUFpQixRQUFRLEdBQUcsSUFBSSxXQUFXLFdBQVcsR0FBRztHQUNwSSxLQUFLLGVBQWU7SUFDbEIsTUFBTSxjQUFjLElBQUksVUFBVSxNQUFNLFVBQVUsTUFBTSxTQUFTLElBQUksUUFBUSxPQUFPO0FBQ3BGLFFBQUksQ0FBQyxhQUFhO0FBQ2hCLFdBQU0sSUFBSSxNQUFNLDRCQUE0QixJQUFJLEtBQUssR0FBRzs7QUFFMUQsV0FBTyxLQUFLLGFBQ1YsVUFDQSxhQUNBLE9BQ0EsR0FBRyxVQUFVLElBQUksV0FBVyxNQUFNLEtBQ25DOztHQUVILEtBQUssUUFDSCxRQUFPLGdCQUFnQixRQUFRO0dBQ2pDLEtBQUssU0FFSCxRQUFPLE1BQU0sSUFBSSxXQUFXLEdBQUcsUUFBUSxPQUFPLEdBQUcsWUFBWSxVQUFVLElBQUksV0FBVyxLQUFLLFNBQVMsWUFBWSxJQUFJLFdBQVcsV0FBVyxHQUFHO0dBQy9JLFFBQ0UsT0FBTSxJQUFJLE1BQU0sWUFBWSxJQUFJLGFBQWE7OztDQUluRCxtQkFDRSxVQUNBLEtBQ0EsT0FDbUI7QUFDbkIsTUFBSSxJQUFJLGVBQWUsU0FBUztHQUM5QixNQUFNLEVBQUUsSUFBSSxXQUFXLHVCQUF1QixNQUFNLFNBQVMsSUFBSSxLQUFLO0FBQ3RFLFVBQU8sQ0FBQyxZQUFZLE9BQU8sNkNBQTZDO2FBQy9ELElBQUksZUFBZSxVQUFVO0FBQ3RDLE9BQUk7SUFDRixNQUFNLFVBQVUsMkJBQTJCLFVBQVUsSUFBSSxLQUFLO0lBQzlELE1BQU0sVUFBVSxJQUFJLFlBQVksRUFBRSxFQUFFLEtBQUssVUFBVTtBQUNqRCxnQkFBVyxRQUFRO0FBQ25CLGFBQVEsY0FBYyxlQUFlLFFBQVEsS0FBSztBQUNsRCxZQUFPLEtBQUssbUJBQW1CLFVBQVUsT0FBTyxNQUFNO01BQ3REO0FBQ0YsV0FBTyxLQUFLLE9BQU87V0FDYjtBQUNOLFdBQU8sQ0FBQyxLQUFLOzthQUVOLElBQUksZUFBZSxTQUFTO0FBQ3JDLE9BQUksQ0FBQyxJQUFJLFFBQVMsUUFBTyxDQUFDLEtBQUs7QUFDL0IsVUFBTyxLQUFLLG1CQUFtQixVQUFVLElBQUksU0FBUyxNQUFNOztBQUc5RCxTQUFPLENBQUMsS0FBSzs7Q0FHZixtQkFBbUIsVUFBa0IsS0FBb0IsT0FBMEI7QUFDakYsTUFBSSxJQUFJLFNBQVMsVUFBVTtBQUN6QixVQUFPLFlBQVksTUFBTSxRQUFRLG1DQUFtQyxNQUFNLEdBQUcsR0FBRyxNQUFNLFFBQVE7YUFDckYsSUFBSSxlQUFlLFNBQVM7QUFDckMsT0FBSSxJQUFJLFNBQVMsV0FBVztJQUMxQixNQUFNLGNBQWMsR0FBRyxNQUFNLFVBQVUsV0FBVyxTQUFTLElBQUksS0FBSyxDQUFDO0FBQ3JFLFdBQU8sWUFBWSxZQUFZLHdCQUF3QixNQUFNLEdBQUcsR0FBRyxZQUFZO1VBQzFFO0FBQ0wsUUFBSTtLQUNGLE1BQU0sRUFBRSxJQUFJLG1CQUFtQixrQkFBa0IsdUJBQy9DLFVBQ0EsSUFBSSxLQUNMO0tBQ0QsTUFBTSxjQUFjLEdBQUcsR0FBRztBQUMxQixZQUFPLFlBQVksWUFBWSx3QkFBd0IsY0FBYyxHQUFHLEdBQUcsWUFBWTtZQUNqRjtBQUNOLFlBQU87OzthQUdGLElBQUksZUFBZSxrQkFBa0IsSUFBSSxlQUFlLGdCQUFnQjtBQUNqRixPQUFJO0lBQ0YsTUFBTSxVQUFVLDJCQUEyQixVQUFVLElBQUksS0FBSyxRQUFRLE9BQU8sR0FBRyxDQUFDO0lBQ2pGLE1BQU0sY0FBYyxjQUFjLGVBQWUsUUFBUSxLQUFLO0lBQzlELE1BQU0sY0FBYyxHQUFHLFFBQVEsS0FBSztBQUNwQyxXQUFPLFlBQVksWUFBWSx3QkFBd0IsWUFBWSxHQUFHLEdBQUcsWUFBWTtXQUMvRTtBQUNOLFdBQU87O1NBRUo7QUFDTCxTQUFNLElBQUksTUFBTSxrQkFBa0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxhQUFhOzs7Q0FJbkUsYUFBYSxVQUFrQixLQUFvQixPQUEwQjtBQUMzRSxNQUFJLElBQUksU0FBUyxVQUFVO0FBQ3pCLFVBQU87O0VBR1QsTUFBTSxjQUFjLElBQUksYUFBYSxRQUFRLElBQUksU0FBUztFQUMxRCxJQUFJQztBQUNKLE1BQUksSUFBSSxlQUFlLFNBQVM7QUFDOUIsT0FBSSxJQUFJLFNBQVMsV0FBVztBQUMxQixrQkFBYyxHQUFHLE1BQU0sVUFBVSxXQUFXLFNBQVMsSUFBSSxLQUFLLENBQUM7VUFDMUQ7QUFDTCxRQUFJO0tBQ0YsTUFBTSxFQUFFLE9BQU8sdUJBQXVCLFVBQVUsSUFBSSxLQUFLO0FBQ3pELG1CQUFjLEdBQUcsR0FBRztZQUNkO0FBQ04sWUFBTzs7O0FBR1gsVUFBTyxJQUFJLFlBQVksaUJBQWlCLElBQUksS0FBSyxNQUFNLGNBQWMsY0FBYyxHQUFHO2FBQzdFLElBQUksZUFBZSxrQkFBa0IsSUFBSSxlQUFlLGdCQUFnQjtBQUNqRixPQUFJO0lBQ0YsTUFBTSxVQUFVLDJCQUEyQixVQUFVLElBQUksS0FBSyxRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQ2pGLGtCQUFjLEdBQUcsUUFBUSxLQUFLO0FBQzlCLFdBQU8sSUFBSSxZQUFZLGlCQUFpQixJQUFJLEtBQUssTUFDL0MsY0FBYyxjQUFjLEdBQzdCO1dBQ0s7QUFDTixXQUFPOztTQUVKO0FBQ0wsU0FBTSxJQUFJLE1BQU0sa0JBQWtCLElBQUksS0FBSyxHQUFHLElBQUksYUFBYTs7O0NBSW5FLFdBQVcsU0FLVDtFQUNBLE1BQU0sTUFBTTtHQUNWLFNBQVM7R0FDVCxRQUFRO0dBQ1IsV0FBVztHQUNYLFlBQVk7R0FDYjtFQUNELE1BQU0saUJBQWlCLFFBQVEsTUFBTSxRQUFRLElBQUksU0FBUyxVQUFVLEVBQUU7QUFDdEUsTUFBSSxrQkFBa0IsMEJBQTBCQyxJQUFFLFNBQVM7QUFDekQsT0FBSSxVQUFVLE9BQU8sS0FBSyxlQUFlLEtBQUssQ0FBQztBQUMvQyxPQUFJLGFBQWE7O0VBRW5CLE1BQU0sZ0JBQWdCLFFBQVEsTUFBTSxRQUFRLElBQUksU0FBUyxTQUFTLEVBQUU7QUFDcEUsTUFBSSxpQkFBaUIseUJBQXlCQSxJQUFFLFNBQVM7QUFDdkQsT0FBSSxTQUFTLE9BQU8sS0FBSyxjQUFjLEtBQUssQ0FBQztBQUM3QyxPQUFJLFlBQVk7O0FBRWxCLFNBQU87O0NBR1QsTUFBTSxPQUFPLEVBQUUsWUFBMEM7RUFDdkQsTUFBTSxFQUFFLG1CQUFtQixNQUFNLE9BQU87RUFDeEMsTUFBTSxFQUFFLGdCQUFnQiwyQkFBMkIsTUFBTSxPQUFPO0VBRWhFLE1BQU0sY0FBYyxNQUFNLGVBQWUsVUFBVSxJQUFJO0VBQ3ZELE1BQU0sb0JBQW9CLE1BQU0sZUFBZSxHQUFHLFNBQVMsWUFBWTtFQUN2RSxNQUFNLGlCQUFpQix1QkFBdUIsa0JBQWtCO0VBRWhFLE1BQU0sUUFBUSxjQUFjLGVBQWUsU0FBUztFQUNwRCxNQUFNLFNBQVMsY0FBYyxJQUFJLFNBQVM7RUFHMUMsTUFBTSxTQUFTLE9BQU8sV0FBVztFQUNqQyxNQUFNLFdBQVcsV0FBVyxZQUFZLFdBQVcsU0FBUyxXQUFXO0VBR3ZFLE1BQU0sVUFBVyxZQUFZLFNBRTFCLFVBQVUsR0FBRyxNQUFPLEVBQUUsU0FBUyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsT0FBTyxJQUFJLEVBQUcsQ0FDcEUsS0FBSyxRQUFRO0dBQ1osTUFBTSxXQUFXLEtBQUssYUFBYSxVQUFVLEtBQUssTUFBTTtHQUd4RCxJQUFJQztBQUNKLE9BQUksSUFBSSxTQUFTLE1BQU07QUFDckIsWUFBUTtjQUNDLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxLQUFLLEVBQUU7SUFFNUMsTUFBTSxZQUFZLElBQUksS0FBSyxRQUFRLGNBQWMsR0FBRyxTQUFTLEtBQUssYUFBYSxDQUFDO0FBQ2hGLFlBQVEsY0FBYyxVQUFVO1VBQzNCO0lBQ0wsTUFBTSxZQUFZLDhCQUE4QixVQUFVLElBQUksS0FBSztBQUNuRSxZQUFRLGNBQWMsTUFBTSxRQUFRLEdBQUcsVUFBVTs7QUFHbkQsVUFBTztJQUNMLE1BQU0sSUFBSTtJQUNWO0lBQ0EsSUFBSSxZQUFZO0lBQ2hCLEtBQ0UsSUFBSSxTQUFTLFFBQ2IsSUFBSSxlQUFlLGVBQ25CLElBQUksZUFBZSxjQUNuQixJQUFJLGVBQWU7SUFDckIsT0FBTyxJQUFJLFNBQVMsUUFBUSxJQUFJLGVBQWUsY0FBYyxXQUFXO0lBQ3pFO0lBQ0Q7RUFHSixNQUFNLGdCQUFpQixlQUFlLFNBQ25DLFFBQ0UsUUFDQyxJQUFJLFNBQVMsUUFDYixJQUFJLFNBQVMsZUFDYjtHQUFDO0dBQVM7R0FBYTtHQUFnQjtHQUFlLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FDbEYsQ0FFQSxVQUFVLE1BQU07QUFDZixVQUFPLEVBQUUsU0FBUyxZQUFZLElBQUksQ0FBQztJQUNuQztFQUdKLE1BQU1DLGVBQWlELEVBQUU7RUFHekQsTUFBTUMsY0FBd0IsRUFBRTtBQUNoQyxHQUFDLFlBQVksWUFBWSxFQUFFLEVBQUUsU0FBUyxRQUFRO0FBQzVDLE9BQUksSUFBSSxlQUFlLFNBQVM7QUFDOUIsUUFBSTtLQUNGLE1BQU0sRUFBRSxJQUFJLFdBQVcsdUJBQXVCLFVBQVUsSUFBSSxLQUFLO0FBQ2pFLGlCQUFZLEtBQUssT0FBTztZQUNsQjs7SUFFVjtBQUtGLFNBQU87R0FDTCxHQUFHLEtBQUssaUJBQWlCLE1BQU07R0FDL0IsTUFBTTs7Ozs7Ozs7Ozs7Ozs7O1dBZUQsTUFBTSxRQUFRLFdBQVcsTUFBTSxRQUFRO1dBQ3ZDLE1BQU0sUUFBUTtXQUNkLE1BQU0sUUFBUSxnQ0FBZ0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxHQUFHO2tCQUM1RDtJQUVWLE1BQU1DLFlBQXNCLEVBQUU7QUFDOUIsUUFBSSxjQUFjLE1BQU0sUUFBUSxJQUFJLFNBQVMsVUFBVSxFQUFFO0FBQ3ZELGVBQVUsS0FBSyxHQUFHLE1BQU0sUUFBUSxVQUFVLEdBQUcsTUFBTSxRQUFRLGNBQWM7O0FBRTNFLFFBQUksY0FBYyxNQUFNLFFBQVEsSUFBSSxTQUFTLFNBQVMsRUFBRTtBQUN0RCxlQUFVLEtBQUssR0FBRyxNQUFNLFFBQVEsY0FBYyxHQUFHLE1BQU0sUUFBUSxrQkFBa0I7O0lBSW5GLE1BQU0sZ0JBQWdCLGNBQ25CLFFBQ0UsUUFBUSxJQUFJLGVBQWUsV0FBVyxJQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVMsVUFDOUUsQ0FDQSxLQUFLLFFBQVE7QUFDWixTQUFJLElBQUksVUFBVSxZQUFZLElBQUksUUFBUTtBQUN4QyxhQUFRLElBQUksT0FBOEI7O0FBRTVDLFNBQUk7TUFDRixNQUFNLEVBQUUsSUFBSSxXQUFXLHVCQUF1QixVQUFVLElBQUksS0FBSztBQUNqRSxhQUFPO2FBQ0Q7QUFDTixhQUFPOztNQUVULENBQ0QsT0FBTyxRQUFRO0lBR2xCLE1BQU0sV0FBVyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxlQUFlLEdBQUcsWUFBWSxDQUFDLENBQUM7SUFDakUsTUFBTSxjQUFjLFNBQVMsU0FBUyxXQUFXLENBQUMsR0FBRyxVQUFVLEdBQUcsT0FBTyxPQUFPLENBQUM7QUFFakYsV0FBTyxDQUFDLEdBQUcsV0FBVyxHQUFHLFlBQVksQ0FBQyxLQUFLLEtBQUs7T0FDOUMsQ0FBQzs7U0FFRjtJQUVQLE1BQU0sWUFBWSxjQUFjLFFBQzdCLFFBQVEsSUFBSSxlQUFlLGtCQUFrQixJQUFJLGVBQWUsZUFDbEU7SUFDRCxNQUFNLGNBQWMsVUFDakIsS0FBSyxRQUFRO0FBQ1osU0FBSTtNQUNGLE1BQU0sVUFBVSwyQkFBMkIsVUFBVSxJQUFJLEtBQUssUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNqRixhQUFPLEdBQUcsUUFBUSxLQUFLO2FBQ2pCO0FBQ04sYUFBTzs7TUFFVCxDQUNELE9BQU8sUUFBUTtBQUNsQixXQUFPLFlBQVksU0FBUyxJQUN4QixZQUFZLFlBQVksS0FBSyxLQUFLLENBQUMsNENBQ25DO09BQ0YsQ0FBQzs7Ozs7Ozs7OytDQVMwQyxNQUFNLFNBQVMsd0RBQXdELE9BQU8sU0FBUyxNQUFNLFFBQVEsNEVBQTRFLE9BQU8sU0FBUyxNQUFNLFFBQVEscUNBQXFDLE1BQU0sUUFBUSxxQkFBcUIsTUFBTSxRQUFROztXQUV6VSxNQUFNLFFBQVEsV0FBVyxNQUFNLFFBQVE7Ozs7MkRBSVMsU0FBUzs7MkRBRVQsU0FBUzs7Ozs7a0VBS0YsTUFBTSxRQUFROzs7a0JBSTFFLGNBQWMsTUFBTSxRQUFRLElBQUksU0FBUyxTQUFTLEdBQzlDO2NBQ0ksTUFBTSxRQUFRLDJCQUNsQixLQUVKLGNBQWMsTUFBTSxRQUFRLElBQUksU0FBUyxVQUFVLEdBQy9DO2VBQ0ssTUFBTSxRQUFRLHVCQUNuQixHQUNMOzs7Ozt5Q0FLb0MsTUFBTSxRQUFRLGFBQWEsTUFBTSxjQUFjOzs7OztxQkFLbkUsTUFBTSxTQUFTOzBDQUNNLE1BQU0sUUFBUTs7OztTQUkvQyxNQUFNLFFBQVE7NEJBQ0ssTUFBTSxRQUFRO0VBQ3hDLFFBQ0MsS0FDRSxRQUFRO2VBQ0UsSUFBSSxNQUFNO1lBQ2IsSUFBSSxHQUFHLEdBQ1gsSUFBSSxNQUNBO29CQUVBLEtBRUosSUFBSSxRQUNBO2dCQUNJLElBQUksTUFBTSxNQUNkLEdBQ0w7T0FFSixDQUNBLEtBQUssTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tDQXlCbUIsU0FBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7bUNBdUJSLFNBQVM7Ozs7Ozs7UUFPcEMsTUFBTSxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXdCcEIsY0FBYyxNQUFNLFFBQVEsSUFBSSxTQUFTLFNBQVMsR0FDOUM7NEJBQ3NCLE1BQU0sUUFBUTs4QkFDWixNQUFNLFFBQVE7Ozs7d0JBS3RDLEdBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQTBCeUIsTUFBTSxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXVCdEMsY0FDQyxRQUFRLFFBQVEsSUFBSSxTQUFTLFlBQVksSUFBSSxTQUFTLFVBQVUsQ0FDaEUsS0FBSyxRQUFRO0FBQ1osUUFBSSxJQUFJLGVBQWUsU0FBUztBQUM5QixTQUFJO01BRUYsTUFBTSxTQUNKLElBQUksVUFBVSxZQUFZLElBQUksU0FDekIsSUFBSSxPQUE4QixTQUNuQyx1QkFBdUIsVUFBVSxJQUFJLEtBQUssQ0FBQztBQUNqRCxhQUFPOzZCQUNjLElBQUksS0FBSyxpQkFBaUIsSUFBSSxLQUFLOzRCQUNwQyxPQUFPOzhCQUNMLE9BQU87b0NBQ0QsSUFBSSxLQUFLO21DQUNWLElBQUksTUFBTTs7OzthQUkvQjtBQUNOLGFBQU87OztBQUlYLFFBQUksSUFBSSxlQUFlLGtCQUFrQixJQUFJLGVBQWUsZ0JBQWdCO0FBQzFFLFNBQUk7TUFDRixNQUFNLFVBQVUsMkJBQTJCLFVBQVUsSUFBSSxLQUFLLFFBQVEsT0FBTyxHQUFHLENBQUM7QUFDakYsYUFBTzs4QkFDZSxRQUFRLEtBQUs7O29DQUVQLElBQUksS0FBSzttQ0FDVixJQUFJLFNBQVMsUUFBUSxLQUFLOzs7O2FBSS9DO0FBQ04sYUFBTzs7O0FBR1gsV0FBTztLQUNQLENBQ0QsT0FBTyxRQUFRLENBQ2YsS0FBSyxLQUFLLENBQUM7RUFFWixjQUFjLE1BQU0sUUFBUSxJQUFJLFNBQVMsVUFBVSxHQUMvQzs0QkFDc0IsTUFBTSxRQUFROzhCQUNaLE1BQU0sUUFBUTs7Ozs7d0JBTXRDLEdBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQTBFcUIsTUFBTSxRQUFROzs7Ozs7Ozs7Ozs7UUFZNUIsTUFBTTtHQUNSLFlBQVksRUFBRTtHQUNkO0dBQ0QifQ==
|