@lifeready/core 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -62
- package/karma.conf.js +32 -0
- package/ng-package.json +26 -0
- package/package.json +21 -29
- package/src/lib/_common/ast.ts +75 -0
- package/src/lib/_common/deferred-promise.ts +35 -0
- package/src/lib/_common/exceptions.ts +189 -0
- package/src/lib/_common/queries.gql.ts +200 -0
- package/src/lib/_common/run-outside-angular.ts +125 -0
- package/src/lib/_common/tests.ts +82 -0
- package/{lib/_common/types.d.ts → src/lib/_common/types.ts} +13 -10
- package/src/lib/_common/utils.ts +57 -0
- package/src/lib/api/api-mutation.spec.ts +547 -0
- package/src/lib/api/api-query.spec.ts +40 -0
- package/src/lib/api/contact-card.gql.ts +85 -0
- package/src/lib/api/contact-card.service.spec.ts +249 -0
- package/src/lib/api/contact-card.service.ts +228 -0
- package/src/lib/api/contact-card2.gql.ts +93 -0
- package/src/lib/api/contact-card2.service.spec.ts +297 -0
- package/src/lib/api/contact-card2.service.ts +139 -0
- package/src/lib/api/file.service.spec.ts +14 -0
- package/src/lib/api/file.service.ts +81 -0
- package/src/lib/api/item2.gql.ts +211 -0
- package/src/lib/api/item2.service.spec.ts +1043 -0
- package/src/lib/api/item2.service.ts +481 -0
- package/src/lib/api/key-exchange.gql.ts +196 -0
- package/src/lib/api/key-exchange.service.spec.ts +470 -0
- package/src/lib/api/key-exchange.service.ts +731 -0
- package/src/lib/api/key-exchange.types.ts +235 -0
- package/src/lib/api/key-exchange2.gql.ts +310 -0
- package/src/lib/api/key-exchange2.service.spec.ts +892 -0
- package/src/lib/api/key-exchange2.service.ts +875 -0
- package/src/lib/api/lock.gql.ts +67 -0
- package/src/lib/api/lock.service.spec.ts +549 -0
- package/src/lib/api/lock.service.ts +57 -0
- package/src/lib/api/lr-apollo.service.spec.ts +27 -0
- package/src/lib/api/lr-apollo.service.ts +43 -0
- package/{lib/api/lr-graphql/index.d.ts → src/lib/api/lr-graphql/index.ts} +5 -5
- package/src/lib/api/lr-graphql/lr-graphql.service.ts +313 -0
- package/src/lib/api/lr-graphql/lr-merged-mutation.ts +377 -0
- package/src/lib/api/lr-graphql/lr-mutation-base.ts +67 -0
- package/src/lib/api/lr-graphql/lr-mutation.ts +74 -0
- package/src/lib/api/lr-graphql/lr.service.ts +28 -0
- package/src/lib/api/message.service.spec.ts +20 -0
- package/src/lib/api/message.service.ts +210 -0
- package/src/lib/api/persist.service.spec.ts +209 -0
- package/src/lib/api/persist.service.ts +220 -0
- package/src/lib/api/query-processor/common-processors.service.ts +148 -0
- package/{lib/api/query-processor/index.d.ts → src/lib/api/query-processor/index.ts} +2 -2
- package/src/lib/api/query-processor/query-processor.service.ts +240 -0
- package/src/lib/api/query-processor/tp-password-reset-processor.service.ts +177 -0
- package/src/lib/api/shared-contact-card.service.ts +156 -0
- package/src/lib/api/shared-contact-card2.gql.ts +76 -0
- package/src/lib/api/shared-contact-card2.service.ts +154 -0
- package/src/lib/api/time.service.spec.ts +48 -0
- package/src/lib/api/time.service.ts +155 -0
- package/src/lib/api/types/graphql.types.ts +48 -0
- package/{lib/api/types/index.d.ts → src/lib/api/types/index.ts} +2 -2
- package/src/lib/api/types/lr-graphql.types.ts +467 -0
- package/src/lib/auth/auth.config.ts +83 -0
- package/src/lib/auth/auth.gql.ts +62 -0
- package/src/lib/auth/auth.types.ts +79 -0
- package/src/lib/auth/idle.service.spec.ts +119 -0
- package/src/lib/auth/idle.service.ts +208 -0
- package/src/lib/auth/idle.types.ts +11 -0
- package/src/lib/auth/lbop.service.spec.ts +56 -0
- package/src/lib/auth/lbop.service.ts +539 -0
- package/src/lib/auth/life-ready-auth.service.spec.ts +70 -0
- package/src/lib/auth/life-ready-auth.service.ts +454 -0
- package/src/lib/auth/password.service.spec.ts +51 -0
- package/src/lib/auth/password.service.ts +438 -0
- package/src/lib/auth/register.service.spec.ts +31 -0
- package/src/lib/auth/register.service.ts +181 -0
- package/src/lib/auth/two-factor.service.spec.ts +21 -0
- package/src/lib/auth/two-factor.service.ts +69 -0
- package/src/lib/category/category-meta.service.spec.ts +28 -0
- package/src/lib/category/category-meta.service.ts +125 -0
- package/src/lib/category/category.gql.ts +449 -0
- package/src/lib/category/category.service.spec.ts +26 -0
- package/src/lib/category/category.service.ts +498 -0
- package/src/lib/category/category.types.ts +89 -0
- package/src/lib/cryptography/cryptography.types.ts +108 -0
- package/src/lib/cryptography/encryption.service.spec.ts +125 -0
- package/src/lib/cryptography/encryption.service.ts +243 -0
- package/src/lib/cryptography/key-factory.service.spec.ts +15 -0
- package/src/lib/cryptography/key-factory.service.ts +303 -0
- package/src/lib/cryptography/key-graph.service.spec.ts +16 -0
- package/src/lib/cryptography/key-graph.service.ts +354 -0
- package/src/lib/cryptography/key-meta.service.spec.ts +40 -0
- package/src/lib/cryptography/key-meta.service.ts +254 -0
- package/src/lib/cryptography/key.service.spec.ts +16 -0
- package/src/lib/cryptography/key.service.ts +154 -0
- package/src/lib/cryptography/slip39.service.spec.ts +44 -0
- package/src/lib/cryptography/slip39.service.ts +204 -0
- package/src/lib/cryptography/web-crypto.service.ts +22 -0
- package/src/lib/life-ready.config.ts +127 -0
- package/src/lib/life-ready.module.ts +81 -0
- package/src/lib/plan/plan.gql.ts +133 -0
- package/src/lib/plan/plan.service.spec.ts +294 -0
- package/src/lib/plan/plan.service.ts +198 -0
- package/src/lib/plan/plan.types.ts +37 -0
- package/src/lib/record/record-attachment.service.spec.ts +31 -0
- package/src/lib/record/record-attachment.service.ts +101 -0
- package/src/lib/record/record.gql.ts +192 -0
- package/src/lib/record/record.service.spec.ts +598 -0
- package/src/lib/record/record.service.ts +236 -0
- package/src/lib/record/record.types.ts +86 -0
- package/src/lib/record-type/record-type.service.spec.ts +16 -0
- package/src/lib/record-type/record-type.service.ts +71 -0
- package/src/lib/record-type/record-type.types.ts +58 -0
- package/src/lib/scenario/approvals/scenario-approval.gql.ts +112 -0
- package/src/lib/scenario/approvals/scenario-approval.types.ts +85 -0
- package/src/lib/scenario/approvals/scenario-approver.service.spec.ts +16 -0
- package/src/lib/scenario/approvals/scenario-approver.service.ts +422 -0
- package/src/lib/scenario/claimants/scenario-claimant.gql.ts +56 -0
- package/src/lib/scenario/claimants/scenario-claimant.service.spec.ts +16 -0
- package/src/lib/scenario/claimants/scenario-claimant.service.ts +100 -0
- package/src/lib/scenario/claimants/scenario-claimant.types.ts +21 -0
- package/src/lib/scenario/receivers/scenario-receiver.gql.ts +157 -0
- package/src/lib/scenario/receivers/scenario-receiver.service.spec.ts +16 -0
- package/src/lib/scenario/receivers/scenario-receiver.service.ts +278 -0
- package/src/lib/scenario/receivers/scenario-receiver.types.ts +66 -0
- package/src/lib/scenario/scenario-setup.service.spec.ts +22 -0
- package/src/lib/scenario/scenario-setup.service.ts +369 -0
- package/src/lib/scenario/scenario.gql.ts +404 -0
- package/src/lib/scenario/scenario.service.spec.ts +1586 -0
- package/src/lib/scenario/scenario.service.ts +811 -0
- package/src/lib/scenario/scenario.types.ts +258 -0
- package/src/lib/search/search.gql.ts +62 -0
- package/src/lib/search/search.service.spec.ts +57 -0
- package/src/lib/search/search.service.ts +174 -0
- package/src/lib/search/search.types.ts +24 -0
- package/src/lib/trusted-parties/tp-password-reset-request.service.ts +140 -0
- package/src/lib/trusted-parties/tp-password-reset-user.service.ts +359 -0
- package/src/lib/trusted-parties/tp-password-reset.gql.ts +453 -0
- package/src/lib/trusted-parties/tp-password-reset.service.spec.ts +602 -0
- package/src/lib/trusted-parties/tp-password-reset.service.ts +482 -0
- package/src/lib/trusted-parties/trusted-party.gql.ts +159 -0
- package/src/lib/trusted-parties/trusted-party.service.spec.ts +1008 -0
- package/src/lib/trusted-parties/trusted-party.service.ts +394 -0
- package/src/lib/trusted-parties/trusted-party.types.ts +119 -0
- package/src/lib/trusted-parties/trusted-party2.gql.ts +165 -0
- package/src/lib/trusted-parties/trusted-party2.service.spec.ts +1782 -0
- package/src/lib/trusted-parties/trusted-party2.service.ts +272 -0
- package/src/lib/users/profile-details.service.spec.ts +45 -0
- package/src/lib/users/profile-details.service.ts +278 -0
- package/src/lib/users/profile.gql.ts +108 -0
- package/src/lib/users/profile.service.spec.ts +97 -0
- package/src/lib/users/profile.service.ts +224 -0
- package/src/lib/users/profile.types.ts +101 -0
- package/src/lib/users/user.gql.ts +69 -0
- package/src/lib/users/user.service.spec.ts +161 -0
- package/src/lib/users/user.service.ts +72 -0
- package/src/lib/users/user.types.ts +27 -0
- package/{public-api.d.ts → src/public-api.ts} +96 -77
- package/src/test.ts +21 -0
- package/tsconfig.lib.json +21 -0
- package/tsconfig.lib.prod.json +6 -0
- package/tsconfig.spec.json +10 -0
- package/tslint.json +17 -0
- package/bundles/lifeready-core.umd.js +0 -15876
- package/bundles/lifeready-core.umd.js.map +0 -1
- package/bundles/lifeready-core.umd.min.js +0 -16
- package/bundles/lifeready-core.umd.min.js.map +0 -1
- package/esm2015/lib/_common/ast.js +0 -40
- package/esm2015/lib/_common/deferred-promise.js +0 -24
- package/esm2015/lib/_common/exceptions.js +0 -157
- package/esm2015/lib/_common/queries.gql.js +0 -190
- package/esm2015/lib/_common/run-outside-angular.js +0 -79
- package/esm2015/lib/_common/types.js +0 -1
- package/esm2015/lib/_common/utils.js +0 -44
- package/esm2015/lib/api/contact-card.gql.js +0 -79
- package/esm2015/lib/api/contact-card.service.js +0 -154
- package/esm2015/lib/api/contact-card2.gql.js +0 -60
- package/esm2015/lib/api/contact-card2.service.js +0 -103
- package/esm2015/lib/api/file.service.js +0 -74
- package/esm2015/lib/api/item2.gql.js +0 -110
- package/esm2015/lib/api/item2.service.js +0 -311
- package/esm2015/lib/api/key-exchange.gql.js +0 -188
- package/esm2015/lib/api/key-exchange.service.js +0 -442
- package/esm2015/lib/api/key-exchange.types.js +0 -18
- package/esm2015/lib/api/key-exchange2.gql.js +0 -171
- package/esm2015/lib/api/key-exchange2.service.js +0 -479
- package/esm2015/lib/api/lock.gql.js +0 -40
- package/esm2015/lib/api/lock.service.js +0 -64
- package/esm2015/lib/api/lr-apollo.service.js +0 -46
- package/esm2015/lib/api/lr-graphql/index.js +0 -6
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +0 -155
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +0 -213
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +0 -51
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +0 -48
- package/esm2015/lib/api/lr-graphql/lr.service.js +0 -18
- package/esm2015/lib/api/message.service.js +0 -138
- package/esm2015/lib/api/persist.service.js +0 -181
- package/esm2015/lib/api/query-processor/common-processors.service.js +0 -93
- package/esm2015/lib/api/query-processor/index.js +0 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +0 -192
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +0 -109
- package/esm2015/lib/api/shared-contact-card.service.js +0 -119
- package/esm2015/lib/api/shared-contact-card2.gql.js +0 -41
- package/esm2015/lib/api/shared-contact-card2.service.js +0 -117
- package/esm2015/lib/api/time.service.js +0 -146
- package/esm2015/lib/api/types/graphql.types.js +0 -7
- package/esm2015/lib/api/types/index.js +0 -3
- package/esm2015/lib/api/types/lr-graphql.types.js +0 -71
- package/esm2015/lib/auth/auth.config.js +0 -57
- package/esm2015/lib/auth/auth.gql.js +0 -48
- package/esm2015/lib/auth/auth.types.js +0 -27
- package/esm2015/lib/auth/idle.service.js +0 -168
- package/esm2015/lib/auth/idle.types.js +0 -7
- package/esm2015/lib/auth/lbop.service.js +0 -355
- package/esm2015/lib/auth/life-ready-auth.service.js +0 -333
- package/esm2015/lib/auth/password.service.js +0 -320
- package/esm2015/lib/auth/register.service.js +0 -172
- package/esm2015/lib/auth/two-factor.service.js +0 -74
- package/esm2015/lib/category/category-meta.service.js +0 -99
- package/esm2015/lib/category/category.gql.js +0 -406
- package/esm2015/lib/category/category.service.js +0 -390
- package/esm2015/lib/category/category.types.js +0 -29
- package/esm2015/lib/cryptography/cryptography.types.js +0 -11
- package/esm2015/lib/cryptography/encryption.service.js +0 -189
- package/esm2015/lib/cryptography/key-factory.service.js +0 -237
- package/esm2015/lib/cryptography/key-graph.service.js +0 -280
- package/esm2015/lib/cryptography/key-meta.service.js +0 -200
- package/esm2015/lib/cryptography/key.service.js +0 -124
- package/esm2015/lib/cryptography/slip39.service.js +0 -169
- package/esm2015/lib/cryptography/web-crypto.service.js +0 -29
- package/esm2015/lib/life-ready.config.js +0 -84
- package/esm2015/lib/life-ready.module.js +0 -74
- package/esm2015/lib/plan/plan.gql.js +0 -123
- package/esm2015/lib/plan/plan.service.js +0 -149
- package/esm2015/lib/plan/plan.types.js +0 -11
- package/esm2015/lib/record/record-attachment.service.js +0 -101
- package/esm2015/lib/record/record.gql.js +0 -179
- package/esm2015/lib/record/record.service.js +0 -206
- package/esm2015/lib/record/record.types.js +0 -15
- package/esm2015/lib/record-type/record-type.service.js +0 -75
- package/esm2015/lib/record-type/record-type.types.js +0 -28
- package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +0 -105
- package/esm2015/lib/scenario/approvals/scenario-approval.types.js +0 -1
- package/esm2015/lib/scenario/approvals/scenario-approver.service.js +0 -300
- package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +0 -52
- package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +0 -97
- package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +0 -1
- package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +0 -150
- package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +0 -229
- package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +0 -1
- package/esm2015/lib/scenario/scenario-setup.service.js +0 -269
- package/esm2015/lib/scenario/scenario.gql.js +0 -368
- package/esm2015/lib/scenario/scenario.service.js +0 -611
- package/esm2015/lib/scenario/scenario.types.js +0 -64
- package/esm2015/lib/search/search.gql.js +0 -62
- package/esm2015/lib/search/search.service.js +0 -156
- package/esm2015/lib/search/search.types.js +0 -6
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +0 -112
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +0 -266
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +0 -232
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +0 -300
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +0 -148
- package/esm2015/lib/trusted-parties/trusted-party.service.js +0 -326
- package/esm2015/lib/trusted-parties/trusted-party.types.js +0 -41
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +0 -87
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +0 -215
- package/esm2015/lib/users/profile-details.service.js +0 -214
- package/esm2015/lib/users/profile.gql.js +0 -97
- package/esm2015/lib/users/profile.service.js +0 -169
- package/esm2015/lib/users/profile.types.js +0 -34
- package/esm2015/lib/users/user.gql.js +0 -60
- package/esm2015/lib/users/user.service.js +0 -79
- package/esm2015/lib/users/user.types.js +0 -5
- package/esm2015/lifeready-core.js +0 -10
- package/esm2015/public-api.js +0 -81
- package/fesm2015/lifeready-core.js +0 -13282
- package/fesm2015/lifeready-core.js.map +0 -1
- package/lib/_common/ast.d.ts +0 -11
- package/lib/_common/deferred-promise.d.ts +0 -12
- package/lib/_common/exceptions.d.ts +0 -109
- package/lib/_common/queries.gql.d.ts +0 -10
- package/lib/_common/run-outside-angular.d.ts +0 -14
- package/lib/_common/utils.d.ts +0 -3
- package/lib/api/contact-card.gql.d.ts +0 -7
- package/lib/api/contact-card.service.d.ts +0 -52
- package/lib/api/contact-card2.gql.d.ts +0 -34
- package/lib/api/contact-card2.service.d.ts +0 -49
- package/lib/api/file.service.d.ts +0 -18
- package/lib/api/item2.gql.d.ts +0 -96
- package/lib/api/item2.service.d.ts +0 -177
- package/lib/api/key-exchange.gql.d.ts +0 -9
- package/lib/api/key-exchange.service.d.ts +0 -39
- package/lib/api/key-exchange.types.d.ts +0 -196
- package/lib/api/key-exchange2.gql.d.ts +0 -125
- package/lib/api/key-exchange2.service.d.ts +0 -187
- package/lib/api/lock.gql.d.ts +0 -27
- package/lib/api/lock.service.d.ts +0 -25
- package/lib/api/lr-apollo.service.d.ts +0 -15
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +0 -60
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +0 -27
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +0 -28
- package/lib/api/lr-graphql/lr-mutation.d.ts +0 -8
- package/lib/api/lr-graphql/lr.service.d.ts +0 -9
- package/lib/api/message.service.d.ts +0 -58
- package/lib/api/persist.service.d.ts +0 -31
- package/lib/api/query-processor/common-processors.service.d.ts +0 -36
- package/lib/api/query-processor/query-processor.service.d.ts +0 -18
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +0 -15
- package/lib/api/shared-contact-card.service.d.ts +0 -33
- package/lib/api/shared-contact-card2.gql.d.ts +0 -36
- package/lib/api/shared-contact-card2.service.d.ts +0 -45
- package/lib/api/time.service.d.ts +0 -16
- package/lib/api/types/graphql.types.d.ts +0 -29
- package/lib/api/types/lr-graphql.types.d.ts +0 -385
- package/lib/auth/auth.config.d.ts +0 -5
- package/lib/auth/auth.gql.d.ts +0 -15
- package/lib/auth/auth.types.d.ts +0 -66
- package/lib/auth/idle.service.d.ts +0 -40
- package/lib/auth/idle.types.d.ts +0 -10
- package/lib/auth/lbop.service.d.ts +0 -91
- package/lib/auth/life-ready-auth.service.d.ts +0 -46
- package/lib/auth/password.service.d.ts +0 -78
- package/lib/auth/register.service.d.ts +0 -25
- package/lib/auth/two-factor.service.d.ts +0 -15
- package/lib/category/category-meta.service.d.ts +0 -23
- package/lib/category/category.gql.d.ts +0 -45
- package/lib/category/category.service.d.ts +0 -67
- package/lib/category/category.types.d.ts +0 -79
- package/lib/cryptography/cryptography.types.d.ts +0 -83
- package/lib/cryptography/encryption.service.d.ts +0 -41
- package/lib/cryptography/key-factory.service.d.ts +0 -38
- package/lib/cryptography/key-graph.service.d.ts +0 -33
- package/lib/cryptography/key-meta.service.d.ts +0 -44
- package/lib/cryptography/key.service.d.ts +0 -36
- package/lib/cryptography/slip39.service.d.ts +0 -43
- package/lib/cryptography/web-crypto.service.d.ts +0 -5
- package/lib/life-ready.config.d.ts +0 -14
- package/lib/life-ready.module.d.ts +0 -5
- package/lib/plan/plan.gql.d.ts +0 -11
- package/lib/plan/plan.service.d.ts +0 -33
- package/lib/plan/plan.types.d.ts +0 -31
- package/lib/record/record-attachment.service.d.ts +0 -16
- package/lib/record/record.gql.d.ts +0 -14
- package/lib/record/record.service.d.ts +0 -25
- package/lib/record/record.types.d.ts +0 -57
- package/lib/record-type/record-type.service.d.ts +0 -11
- package/lib/record-type/record-type.types.d.ts +0 -50
- package/lib/scenario/approvals/scenario-approval.gql.d.ts +0 -7
- package/lib/scenario/approvals/scenario-approval.types.d.ts +0 -63
- package/lib/scenario/approvals/scenario-approver.service.d.ts +0 -32
- package/lib/scenario/claimants/scenario-claimant.gql.d.ts +0 -5
- package/lib/scenario/claimants/scenario-claimant.service.d.ts +0 -17
- package/lib/scenario/claimants/scenario-claimant.types.d.ts +0 -18
- package/lib/scenario/receivers/scenario-receiver.gql.d.ts +0 -8
- package/lib/scenario/receivers/scenario-receiver.service.d.ts +0 -30
- package/lib/scenario/receivers/scenario-receiver.types.d.ts +0 -54
- package/lib/scenario/scenario-setup.service.d.ts +0 -22
- package/lib/scenario/scenario.gql.d.ts +0 -34
- package/lib/scenario/scenario.service.d.ts +0 -58
- package/lib/scenario/scenario.types.d.ts +0 -217
- package/lib/search/search.gql.d.ts +0 -1
- package/lib/search/search.service.d.ts +0 -25
- package/lib/search/search.types.d.ts +0 -20
- package/lib/trusted-parties/tp-password-reset-request.service.d.ts +0 -20
- package/lib/trusted-parties/tp-password-reset-user.service.d.ts +0 -41
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +0 -218
- package/lib/trusted-parties/tp-password-reset.service.d.ts +0 -131
- package/lib/trusted-parties/trusted-party.gql.d.ts +0 -9
- package/lib/trusted-parties/trusted-party.service.d.ts +0 -44
- package/lib/trusted-parties/trusted-party.types.d.ts +0 -102
- package/lib/trusted-parties/trusted-party2.gql.d.ts +0 -79
- package/lib/trusted-parties/trusted-party2.service.d.ts +0 -114
- package/lib/users/profile-details.service.d.ts +0 -21
- package/lib/users/profile.gql.d.ts +0 -11
- package/lib/users/profile.service.d.ts +0 -35
- package/lib/users/profile.types.d.ts +0 -96
- package/lib/users/user.gql.d.ts +0 -9
- package/lib/users/user.service.d.ts +0 -12
- package/lib/users/user.types.d.ts +0 -23
- package/lifeready-core.d.ts +0 -9
- package/lifeready-core.metadata.json +0 -1
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
import { __awaiter, __decorate } from "tslib";
|
|
2
|
-
import { Hub } from '@aws-amplify/core';
|
|
3
|
-
import { Inject, Injectable, Injector, NgZone } from '@angular/core';
|
|
4
|
-
import { EncryptionService } from '../cryptography/encryption.service';
|
|
5
|
-
import { KeyGraphService } from '../cryptography/key-graph.service';
|
|
6
|
-
import { LR_CONFIG } from '../life-ready.config';
|
|
7
|
-
import * as slip from '../cryptography/slip39.service';
|
|
8
|
-
import { JWK } from 'node-jose';
|
|
9
|
-
import { LrBadStateException, LrException } from '../_common/exceptions';
|
|
10
|
-
import { CompleteTpPasswordResetRequestMutation, CreateTpAssemblyKeyChallengeMutation, PreCompleteTpPasswordResetRequestMutation, } from './tp-password-reset.gql';
|
|
11
|
-
import { PasswordService } from '../auth/password.service';
|
|
12
|
-
import { HttpClient } from '@angular/common/http';
|
|
13
|
-
import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
|
|
14
|
-
import { TpPasswordResetService, } from './tp-password-reset.service';
|
|
15
|
-
import { LifeReadyAuthService } from '../auth/life-ready-auth.service';
|
|
16
|
-
import { KeyFactoryService } from '../cryptography/key-factory.service';
|
|
17
|
-
import { TpClaimState } from '../api/types';
|
|
18
|
-
import { LrMutation, LrService } from '../api/lr-graphql';
|
|
19
|
-
import { RunOutsideAngular } from '../_common/run-outside-angular';
|
|
20
|
-
import * as i0 from "@angular/core";
|
|
21
|
-
import * as i1 from "../life-ready.config";
|
|
22
|
-
import * as i2 from "../cryptography/key-factory.service";
|
|
23
|
-
import * as i3 from "../cryptography/encryption.service";
|
|
24
|
-
import * as i4 from "../cryptography/key-graph.service";
|
|
25
|
-
import * as i5 from "../cryptography/slip39.service";
|
|
26
|
-
import * as i6 from "../auth/password.service";
|
|
27
|
-
import * as i7 from "@angular/common/http";
|
|
28
|
-
import * as i8 from "@aws-amplify/auth/lib-esm/Auth";
|
|
29
|
-
import * as i9 from "../auth/life-ready-auth.service";
|
|
30
|
-
let TpPasswordResetUserService = class TpPasswordResetUserService extends LrService {
|
|
31
|
-
constructor(ngZone, injector, config, keyFactory, encryptionService, keyGraphService, slip39Service, passwordService, http, auth, lrAuth) {
|
|
32
|
-
super(injector);
|
|
33
|
-
this.ngZone = ngZone;
|
|
34
|
-
this.injector = injector;
|
|
35
|
-
this.config = config;
|
|
36
|
-
this.keyFactory = keyFactory;
|
|
37
|
-
this.encryptionService = encryptionService;
|
|
38
|
-
this.keyGraphService = keyGraphService;
|
|
39
|
-
this.slip39Service = slip39Service;
|
|
40
|
-
this.passwordService = passwordService;
|
|
41
|
-
this.http = http;
|
|
42
|
-
this.auth = auth;
|
|
43
|
-
this.lrAuth = lrAuth;
|
|
44
|
-
this.CLIENT_NONCE_LENGTH = 32;
|
|
45
|
-
}
|
|
46
|
-
verifyEmailContact(email) {
|
|
47
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
-
const params = {
|
|
49
|
-
email,
|
|
50
|
-
};
|
|
51
|
-
return this.http
|
|
52
|
-
.post(`${this.config.authUrl}tp/password-reset/verify-contact/`, params)
|
|
53
|
-
.toPromise();
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
verifyContactRespond(claimId, claimCode) {
|
|
57
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
58
|
-
const { token } = yield this.http
|
|
59
|
-
.post(`${this.config.authUrl}cove/respond/`, {
|
|
60
|
-
claim_id: claimId,
|
|
61
|
-
v_code: claimCode,
|
|
62
|
-
})
|
|
63
|
-
.toPromise();
|
|
64
|
-
return token;
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
requestReset(password, claimId, claimToken) {
|
|
68
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
-
// Generate the key materials
|
|
70
|
-
const passKeyBundle = yield this.passwordService.createPassKeyBundle(password);
|
|
71
|
-
const masterKey = yield this.keyFactory.createKey();
|
|
72
|
-
const wrappedMasterKey = yield this.encryptionService.encrypt(passKeyBundle.passKey, masterKey.toJSON(true));
|
|
73
|
-
// Ephemeral PKC key
|
|
74
|
-
const prk = yield this.keyFactory.createPkcKey();
|
|
75
|
-
const masterKeyWrappedPrk = yield this.encryptionService.encrypt(masterKey, prk.toJSON(true));
|
|
76
|
-
// API call to setup reset request
|
|
77
|
-
const requestResetResult = yield this.http
|
|
78
|
-
.post(`${this.config.authUrl}tp/password-reset/request/`, {
|
|
79
|
-
claimId,
|
|
80
|
-
claimToken,
|
|
81
|
-
pass_key_params: passKeyBundle.passKeyParams,
|
|
82
|
-
pass_idp_params: passKeyBundle.passIdpParams,
|
|
83
|
-
pass_idp_verifier_pbk: passKeyBundle.passIdpVerifier.toJSON(),
|
|
84
|
-
wrapped_pass_idp_verifier_prk: passKeyBundle.wrappedPassIdpVerifierPrk,
|
|
85
|
-
wrapped_master_key: wrappedMasterKey,
|
|
86
|
-
pbk: prk.toJSON(),
|
|
87
|
-
master_key_wrapped_prk: masterKeyWrappedPrk,
|
|
88
|
-
})
|
|
89
|
-
.toPromise();
|
|
90
|
-
console.log(requestResetResult);
|
|
91
|
-
console.log('Using new password: ', this.passwordService.getPassIdpString(passKeyBundle.passIdp));
|
|
92
|
-
// API call to create user on cognito
|
|
93
|
-
const signUpResult = yield this.auth.signUp({
|
|
94
|
-
username: requestResetResult.reset_username,
|
|
95
|
-
password: this.passwordService.getPassIdpString(passKeyBundle.passIdp),
|
|
96
|
-
clientMetadata: {
|
|
97
|
-
tp_password_reset_request: JSON.stringify({
|
|
98
|
-
id: requestResetResult.id,
|
|
99
|
-
associate_reset_user_token: requestResetResult.associate_reset_user_token,
|
|
100
|
-
}),
|
|
101
|
-
},
|
|
102
|
-
});
|
|
103
|
-
console.log('requestRest done: ', signUpResult);
|
|
104
|
-
return {
|
|
105
|
-
requestResetResult,
|
|
106
|
-
signUpResult,
|
|
107
|
-
};
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
getResetUser(reload = false) {
|
|
111
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
-
if (!reload && this.resetUser) {
|
|
113
|
-
return this.resetUser;
|
|
114
|
-
}
|
|
115
|
-
this.resetUser = yield this.lrAuth.loadResetUser();
|
|
116
|
-
return this.resetUser;
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
recoverAssemblyKey(resetUser) {
|
|
120
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
121
|
-
// Recover the assembly key.
|
|
122
|
-
let assemblyKeyParams;
|
|
123
|
-
const prk = yield this.keyGraphService.getKey(resetUser.pxk.id);
|
|
124
|
-
const shares = yield Promise.all(resetUser.approvals.map((approval) => __awaiter(this, void 0, void 0, function* () {
|
|
125
|
-
const partialAssemblyKey = yield this.encryptionService.decrypt(prk, approval.receiverCipherPartialAssemblyKey);
|
|
126
|
-
if (assemblyKeyParams) {
|
|
127
|
-
if (JSON.stringify(assemblyKeyParams) !==
|
|
128
|
-
JSON.stringify(partialAssemblyKey.assemblyKeyParams)) {
|
|
129
|
-
throw new LrBadStateException('The assembly key parameters are different between the approvals.');
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
assemblyKeyParams = partialAssemblyKey.assemblyKeyParams;
|
|
134
|
-
}
|
|
135
|
-
return partialAssemblyKey.slip39.share.mnemonics;
|
|
136
|
-
})));
|
|
137
|
-
console.log('recoverAssemblyKey()', shares);
|
|
138
|
-
const rawAssemblyKey = yield this.slip39Service.recoverSecret(shares, TpPasswordResetService.SLIP39_PASSPHRASE);
|
|
139
|
-
return JWK.asKey(Object.assign(Object.assign({}, assemblyKeyParams), { k: rawAssemblyKey }));
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
completeRequest(newPassword) {
|
|
143
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
144
|
-
const resetUser = yield this.getResetUser(true);
|
|
145
|
-
if (resetUser.state !== TpClaimState.APPROVED) {
|
|
146
|
-
throw new LrBadStateException('Password reset request has not been approved.');
|
|
147
|
-
}
|
|
148
|
-
// --------------------------------------------------------------
|
|
149
|
-
// Prepare all materials to ensure there are no errors.
|
|
150
|
-
// --------------------------------------------------------------
|
|
151
|
-
const assemblyKey = yield this.recoverAssemblyKey(resetUser);
|
|
152
|
-
const { rootKey } = yield this.encryptionService.decrypt(assemblyKey, resetUser.assemblyCipherData);
|
|
153
|
-
console.log(rootKey);
|
|
154
|
-
// Making sure it's a valid key.
|
|
155
|
-
const rootKeyJwk = yield JWK.asKey(rootKey);
|
|
156
|
-
const masterKey = yield this.keyGraphService.getKey(resetUser.masterKey.id);
|
|
157
|
-
const masterKeyWrappedRootKey = yield this.encryptionService.encryptToString(masterKey.jwk, rootKeyJwk.toJSON(true));
|
|
158
|
-
// The new password
|
|
159
|
-
const newPassIdpResult = yield this.keyFactory.derivePassIdp(Object.assign({ password: newPassword }, resetUser.passKey.passIdpParams));
|
|
160
|
-
const newIdpPassword = this.passwordService.getPassIdpString(newPassIdpResult.jwk);
|
|
161
|
-
// --------------------------------------------------------------
|
|
162
|
-
// Get assembly key challenge
|
|
163
|
-
// --------------------------------------------------------------
|
|
164
|
-
const challenge = (yield this.mutate(new LrMutation({
|
|
165
|
-
mutation: CreateTpAssemblyKeyChallengeMutation,
|
|
166
|
-
variables: {
|
|
167
|
-
input: {},
|
|
168
|
-
},
|
|
169
|
-
}), {
|
|
170
|
-
includeKeyGraph: false,
|
|
171
|
-
})).createTpAssemblyKeyChallenge.challenge;
|
|
172
|
-
console.log(challenge);
|
|
173
|
-
// Sign the challenge
|
|
174
|
-
// Generate a client side nonce that's no in the server's control.
|
|
175
|
-
challenge.clientNonce = this.keyFactory.randomString(this.CLIENT_NONCE_LENGTH);
|
|
176
|
-
console.log(challenge);
|
|
177
|
-
const assemblyKeyVerifierPrk = yield this.encryptionService.decrypt(assemblyKey, resetUser.wrappedAssemblyKeyVerifierPrk);
|
|
178
|
-
const signedChallenge = yield this.encryptionService.sign(assemblyKeyVerifierPrk, challenge);
|
|
179
|
-
// --------------------------------------------------------------
|
|
180
|
-
// Change password for the original user
|
|
181
|
-
// --------------------------------------------------------------
|
|
182
|
-
const tempIdpPassword = (yield this.mutate(new LrMutation({
|
|
183
|
-
mutation: PreCompleteTpPasswordResetRequestMutation,
|
|
184
|
-
variables: {
|
|
185
|
-
input: {
|
|
186
|
-
signedChallenge: JSON.stringify(signedChallenge),
|
|
187
|
-
},
|
|
188
|
-
},
|
|
189
|
-
}), {
|
|
190
|
-
includeKeyGraph: false,
|
|
191
|
-
})).preCompleteTpPasswordResetRequest.idpPassword;
|
|
192
|
-
// --------------------------------------------------------------
|
|
193
|
-
// Login as the original user using new temporary password
|
|
194
|
-
// --------------------------------------------------------------
|
|
195
|
-
// At this point, the original account's password has been changed
|
|
196
|
-
// to a temporary password. It is no longer possible for the user
|
|
197
|
-
// to use the original password to login. Any successful login
|
|
198
|
-
// can only be using the temporary password. So it's safe to assume
|
|
199
|
-
// that we want to "complete" the password reset.
|
|
200
|
-
// The maybe 2FA so we listen for the auth event from Amplify.
|
|
201
|
-
const retPromise = new Promise((resolve) => {
|
|
202
|
-
const listener = (data) => __awaiter(this, void 0, void 0, function* () {
|
|
203
|
-
if (data.payload.event !== 'signIn') {
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
Hub.remove('auth', listener);
|
|
207
|
-
console.log(data.payload);
|
|
208
|
-
yield this.auth.signIn(resetUser.username, newIdpPassword);
|
|
209
|
-
// Switch over to the new set of keys
|
|
210
|
-
yield this.mutate(new LrMutation({
|
|
211
|
-
mutation: CompleteTpPasswordResetRequestMutation,
|
|
212
|
-
variables: {
|
|
213
|
-
input: {
|
|
214
|
-
masterKeyWrappedRootKey,
|
|
215
|
-
masterKeyId: masterKey.id,
|
|
216
|
-
},
|
|
217
|
-
},
|
|
218
|
-
}));
|
|
219
|
-
resolve();
|
|
220
|
-
});
|
|
221
|
-
Hub.listen('auth', listener);
|
|
222
|
-
});
|
|
223
|
-
// Signin as the original user. Password has been reset to temporary one. It should return
|
|
224
|
-
// with NEW_PASSWORD_REQUIRED
|
|
225
|
-
let user = yield this.auth.signIn(resetUser.username, tempIdpPassword, {
|
|
226
|
-
noProxy: 'true',
|
|
227
|
-
});
|
|
228
|
-
if (user.challengeName !== 'NEW_PASSWORD_REQUIRED') {
|
|
229
|
-
throw new LrException({
|
|
230
|
-
message: 'Internal error. Expecting Cognito to have done a password reset after call to PreCompleteTpPasswordResetRequestMutation.',
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
// Set new password on Idp
|
|
234
|
-
// the awsFetch() function passes NEW_PASSWORD_REQUIRED directly to AWS without
|
|
235
|
-
// going through the proxy.
|
|
236
|
-
user = yield this.auth.completeNewPassword(user, newIdpPassword, {});
|
|
237
|
-
return retPromise;
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
};
|
|
241
|
-
TpPasswordResetUserService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TpPasswordResetUserService_Factory() { return new TpPasswordResetUserService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.LR_CONFIG), i0.ɵɵinject(i2.KeyFactoryService), i0.ɵɵinject(i3.EncryptionService), i0.ɵɵinject(i4.KeyGraphService), i0.ɵɵinject(i5.Slip39Service), i0.ɵɵinject(i6.PasswordService), i0.ɵɵinject(i7.HttpClient), i0.ɵɵinject(i8.AuthClass), i0.ɵɵinject(i9.LifeReadyAuthService)); }, token: TpPasswordResetUserService, providedIn: "root" });
|
|
242
|
-
TpPasswordResetUserService.decorators = [
|
|
243
|
-
{ type: Injectable, args: [{
|
|
244
|
-
providedIn: 'root',
|
|
245
|
-
},] }
|
|
246
|
-
];
|
|
247
|
-
TpPasswordResetUserService.ctorParameters = () => [
|
|
248
|
-
{ type: NgZone },
|
|
249
|
-
{ type: Injector },
|
|
250
|
-
{ type: undefined, decorators: [{ type: Inject, args: [LR_CONFIG,] }] },
|
|
251
|
-
{ type: KeyFactoryService },
|
|
252
|
-
{ type: EncryptionService },
|
|
253
|
-
{ type: KeyGraphService },
|
|
254
|
-
{ type: slip.Slip39Service },
|
|
255
|
-
{ type: PasswordService },
|
|
256
|
-
{ type: HttpClient },
|
|
257
|
-
{ type: AuthClass },
|
|
258
|
-
{ type: LifeReadyAuthService }
|
|
259
|
-
];
|
|
260
|
-
TpPasswordResetUserService = __decorate([
|
|
261
|
-
RunOutsideAngular({
|
|
262
|
-
ngZoneName: 'ngZone',
|
|
263
|
-
})
|
|
264
|
-
], TpPasswordResetUserService);
|
|
265
|
-
export { TpPasswordResetUserService };
|
|
266
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAtcGFzc3dvcmQtcmVzZXQtdXNlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9vcHQvYXRsYXNzaWFuL3BpcGVsaW5lcy9hZ2VudC9idWlsZC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi90cnVzdGVkLXBhcnRpZXMvdHAtcGFzc3dvcmQtcmVzZXQtdXNlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFtQixTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEtBQUssSUFBSSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsb0NBQW9DLEVBQ3BDLHlDQUF5QyxHQUMxQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sRUFFTCxzQkFBc0IsR0FDdkIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFP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ICdAYXdzLWFtcGxpZnkvY29yZSc7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBLZXlHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkva2V5LWdyYXBoLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGlmZVJlYWR5Q29uZmlnLCBMUl9DT05GSUcgfSBmcm9tICcuLi9saWZlLXJlYWR5LmNvbmZpZyc7XG5pbXBvcnQgKiBhcyBzbGlwIGZyb20gJy4uL2NyeXB0b2dyYXBoeS9zbGlwMzkuc2VydmljZSc7XG5pbXBvcnQgeyBKV0sgfSBmcm9tICdub2RlLWpvc2UnO1xuaW1wb3J0IHsgTHJCYWRTdGF0ZUV4Y2VwdGlvbiwgTHJFeGNlcHRpb24gfSBmcm9tICcuLi9fY29tbW9uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtcbiAgQ29tcGxldGVUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0TXV0YXRpb24sXG4gIENyZWF0ZVRwQXNzZW1ibHlLZXlDaGFsbGVuZ2VNdXRhdGlvbixcbiAgUHJlQ29tcGxldGVUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0TXV0YXRpb24sXG59IGZyb20gJy4vdHAtcGFzc3dvcmQtcmVzZXQuZ3FsJztcbmltcG9ydCB7IFBhc3N3b3JkU2VydmljZSB9IGZyb20gJy4uL2F1dGgvcGFzc3dvcmQuc2VydmljZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQXV0aENsYXNzIH0gZnJvbSAnQGF3cy1hbXBsaWZ5L2F1dGgvbGliLWVzbS9BdXRoJztcbmltcG9ydCB7XG4gIFJlcXVlc3RSZXNldFJlc3VsdCxcbiAgVHBQYXNzd29yZFJlc2V0U2VydmljZSxcbn0gZnJvbSAnLi90cC1wYXNzd29yZC1yZXNldC5zZXJ2aWNlJztcbmltcG9ydCB7IElTaWduVXBSZXN1bHQgfSBmcm9tICdhbWF6b24tY29nbml0by1pZGVudGl0eS1qcyc7XG5pbXBvcnQgeyBMaWZlUmVhZHlBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGgvbGlmZS1yZWFkeS1hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkva2V5LWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBUcENsYWltU3RhdGUsIFRwUGFzc3dvcmRSZXNldFVzZXJOb2RlIH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IExyTXV0YXRpb24sIExyU2VydmljZSB9IGZyb20gJy4uL2FwaS9sci1ncmFwaHFsJztcbmltcG9ydCB7IFJ1bk91dHNpZGVBbmd1bGFyIH0gZnJvbSAnLi4vX2NvbW1vbi9ydW4tb3V0c2lkZS1hbmd1bGFyJztcblxuQFJ1bk91dHNpZGVBbmd1bGFyKHtcbiAgbmdab25lTmFtZTogJ25nWm9uZScsXG59KVxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRwUGFzc3dvcmRSZXNldFVzZXJTZXJ2aWNlIGV4dGVuZHMgTHJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBDTElFTlRfTk9OQ0VfTEVOR1RIID0gMzI7XG4gIHByaXZhdGUgcmVzZXRVc2VyOiBUcFBhc3N3b3JkUmVzZXRVc2VyTm9kZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBJbmplY3QoTFJfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogTGlmZVJlYWR5Q29uZmlnLFxuICAgIHByaXZhdGUga2V5RmFjdG9yeTogS2V5RmFjdG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbmNyeXB0aW9uU2VydmljZTogRW5jcnlwdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBrZXlHcmFwaFNlcnZpY2U6IEtleUdyYXBoU2VydmljZSxcbiAgICBwcml2YXRlIHNsaXAzOVNlcnZpY2U6IHNsaXAuU2xpcDM5U2VydmljZSxcbiAgICBwcml2YXRlIHBhc3N3b3JkU2VydmljZTogUGFzc3dvcmRTZXJ2aWNlLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGF1dGg6IEF1dGhDbGFzcyxcbiAgICBwcml2YXRlIGxyQXV0aDogTGlmZVJlYWR5QXV0aFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5RW1haWxDb250YWN0KGVtYWlsKTogUHJvbWlzZTx7IGNsYWltSWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgZW1haWwsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxhbnk+KFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy5hdXRoVXJsfXRwL3Bhc3N3b3JkLXJlc2V0L3ZlcmlmeS1jb250YWN0L2AsXG4gICAgICAgIHBhcmFtc1xuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5Q29udGFjdFJlc3BvbmQoXG4gICAgY2xhaW1JZDogc3RyaW5nLFxuICAgIGNsYWltQ29kZTogc3RyaW5nXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyB0b2tlbiB9ID0gYXdhaXQgdGhpcy5odHRwXG4gICAgICAucG9zdDx7IHRva2VuIH0+KGAke3RoaXMuY29uZmlnLmF1dGhVcmx9Y292ZS9yZXNwb25kL2AsIHtcbiAgICAgICAgY2xhaW1faWQ6IGNsYWltSWQsXG4gICAgICAgIHZfY29kZTogY2xhaW1Db2RlLFxuICAgICAgfSlcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBhc3luYyByZXF1ZXN0UmVzZXQoXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBjbGFpbUlkOiBzdHJpbmcsXG4gICAgY2xhaW1Ub2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8e1xuICAgIHJlcXVlc3RSZXNldFJlc3VsdDogUmVxdWVzdFJlc2V0UmVzdWx0O1xuICAgIHNpZ25VcFJlc3VsdDogSVNpZ25VcFJlc3VsdDtcbiAgfT4ge1xuICAgIC8vIEdlbmVyYXRlIHRoZSBrZXkgbWF0ZXJpYWxzXG4gICAgY29uc3QgcGFzc0tleUJ1bmRsZSA9IGF3YWl0IHRoaXMucGFzc3dvcmRTZXJ2aWNlLmNyZWF0ZVBhc3NLZXlCdW5kbGUoXG4gICAgICBwYXNzd29yZFxuICAgICk7XG5cbiAgICBjb25zdCBtYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG4gICAgY29uc3Qgd3JhcHBlZE1hc3RlcktleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIHBhc3NLZXlCdW5kbGUucGFzc0tleSxcbiAgICAgIG1hc3RlcktleS50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgLy8gRXBoZW1lcmFsIFBLQyBrZXlcbiAgICBjb25zdCBwcmsgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlUGtjS2V5KCk7XG4gICAgY29uc3QgbWFzdGVyS2V5V3JhcHBlZFByayA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIG1hc3RlcktleSxcbiAgICAgIHByay50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgLy8gQVBJIGNhbGwgdG8gc2V0dXAgcmVzZXQgcmVxdWVzdFxuICAgIGNvbnN0IHJlcXVlc3RSZXNldFJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVxdWVzdFJlc2V0UmVzdWx0PihcbiAgICAgICAgYCR7dGhpcy5jb25maWcuYXV0aFVybH10cC9wYXNzd29yZC1yZXNldC9yZXF1ZXN0L2AsXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFpbUlkLFxuICAgICAgICAgIGNsYWltVG9rZW4sXG4gICAgICAgICAgcGFzc19rZXlfcGFyYW1zOiBwYXNzS2V5QnVuZGxlLnBhc3NLZXlQYXJhbXMsXG4gICAgICAgICAgcGFzc19pZHBfcGFyYW1zOiBwYXNzS2V5QnVuZGxlLnBhc3NJZHBQYXJhbXMsXG4gICAgICAgICAgcGFzc19pZHBfdmVyaWZpZXJfcGJrOiBwYXNzS2V5QnVuZGxlLnBhc3NJZHBWZXJpZmllci50b0pTT04oKSwgLy8gcHVibGljIGtleVxuICAgICAgICAgIHdyYXBwZWRfcGFzc19pZHBfdmVyaWZpZXJfcHJrOlxuICAgICAgICAgICAgcGFzc0tleUJ1bmRsZS53cmFwcGVkUGFzc0lkcFZlcmlmaWVyUHJrLFxuICAgICAgICAgIHdyYXBwZWRfbWFzdGVyX2tleTogd3JhcHBlZE1hc3RlcktleSxcbiAgICAgICAgICBwYms6IHByay50b0pTT04oKSwgLy8gZXBoZW1lcmFsIHB1YmxpYyBrZXlcbiAgICAgICAgICBtYXN0ZXJfa2V5X3dyYXBwZWRfcHJrOiBtYXN0ZXJLZXlXcmFwcGVkUHJrLFxuICAgICAgICB9XG4gICAgICApXG4gICAgICAudG9Qcm9taXNlKCk7XG5cbiAgICBjb25zb2xlLmxvZyhyZXF1ZXN0UmVzZXRSZXN1bHQpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ1VzaW5nIG5ldyBwYXNzd29yZDogJyxcbiAgICAgIHRoaXMucGFzc3dvcmRTZXJ2aWNlLmdldFBhc3NJZHBTdHJpbmcocGFzc0tleUJ1bmRsZS5wYXNzSWRwKVxuICAgICk7XG5cbiAgICAvLyBBUEkgY2FsbCB0byBjcmVhdGUgdXNlciBvbiBjb2duaXRvXG4gICAgY29uc3Qgc2lnblVwUmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnNpZ25VcCh7XG4gICAgICB1c2VybmFtZTogcmVxdWVzdFJlc2V0UmVzdWx0LnJlc2V0X3VzZXJuYW1lLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmRTZXJ2aWNlLmdldFBhc3NJZHBTdHJpbmcocGFzc0tleUJ1bmRsZS5wYXNzSWRwKSxcbiAgICAgIGNsaWVudE1ldGFkYXRhOiB7XG4gICAgICAgIHRwX3Bhc3N3b3JkX3Jlc2V0X3JlcXVlc3Q6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBpZDogcmVxdWVzdFJlc2V0UmVzdWx0LmlkLFxuICAgICAgICAgIGFzc29jaWF0ZV9yZXNldF91c2VyX3Rva2VuOlxuICAgICAgICAgICAgcmVxdWVzdFJlc2V0UmVzdWx0LmFzc29jaWF0ZV9yZXNldF91c2VyX3Rva2VuLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygncmVxdWVzdFJlc3QgZG9uZTogJywgc2lnblVwUmVzdWx0KTtcblxuICAgIHJldHVybiB7XG4gICAgICByZXF1ZXN0UmVzZXRSZXN1bHQsXG4gICAgICBzaWduVXBSZXN1bHQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlc2V0VXNlcihcbiAgICByZWxvYWQ6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPFRwUGFzc3dvcmRSZXNldFVzZXJOb2RlPiB7XG4gICAgaWYgKCFyZWxvYWQgJiYgdGhpcy5yZXNldFVzZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VXNlcjtcbiAgICB9XG4gICAgdGhpcy5yZXNldFVzZXIgPSBhd2FpdCB0aGlzLmxyQXV0aC5sb2FkUmVzZXRVc2VyKCk7XG4gICAgcmV0dXJuIHRoaXMucmVzZXRVc2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWNvdmVyQXNzZW1ibHlLZXkoXG4gICAgcmVzZXRVc2VyOiBUcFBhc3N3b3JkUmVzZXRVc2VyTm9kZVxuICApOiBQcm9taXNlPEpXSy5LZXk+IHtcbiAgICAvLyBSZWNvdmVyIHRoZSBhc3NlbWJseSBrZXkuXG4gICAgbGV0IGFzc2VtYmx5S2V5UGFyYW1zOiBvYmplY3Q7XG5cbiAgICBjb25zdCBwcmsgPSBhd2FpdCB0aGlzLmtleUdyYXBoU2VydmljZS5nZXRLZXkocmVzZXRVc2VyLnB4ay5pZCk7XG5cbiAgICBjb25zdCBzaGFyZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHJlc2V0VXNlci5hcHByb3ZhbHMubWFwKGFzeW5jIChhcHByb3ZhbCkgPT4ge1xuICAgICAgICBjb25zdCBwYXJ0aWFsQXNzZW1ibHlLZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXG4gICAgICAgICAgcHJrLFxuICAgICAgICAgIGFwcHJvdmFsLnJlY2VpdmVyQ2lwaGVyUGFydGlhbEFzc2VtYmx5S2V5XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFzc2VtYmx5S2V5UGFyYW1zKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYXNzZW1ibHlLZXlQYXJhbXMpICE9PVxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocGFydGlhbEFzc2VtYmx5S2V5LmFzc2VtYmx5S2V5UGFyYW1zKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IExyQmFkU3RhdGVFeGNlcHRpb24oXG4gICAgICAgICAgICAgICdUaGUgYXNzZW1ibHkga2V5IHBhcmFtZXRlcnMgYXJlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBhcHByb3ZhbHMuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXNzZW1ibHlLZXlQYXJhbXMgPSBwYXJ0aWFsQXNzZW1ibHlLZXkuYXNzZW1ibHlLZXlQYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRpYWxBc3NlbWJseUtleS5zbGlwMzkuc2hhcmUubW5lbW9uaWNzO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc29sZS5sb2coJ3JlY292ZXJBc3NlbWJseUtleSgpJywgc2hhcmVzKTtcblxuICAgIGNvbnN0IHJhd0Fzc2VtYmx5S2V5ID0gYXdhaXQgdGhpcy5zbGlwMzlTZXJ2aWNlLnJlY292ZXJTZWNyZXQoXG4gICAgICBzaGFyZXMsXG4gICAgICBUcFBhc3N3b3JkUmVzZXRTZXJ2aWNlLlNMSVAzOV9QQVNTUEhSQVNFXG4gICAgKTtcblxuICAgIHJldHVybiBKV0suYXNLZXkoe1xuICAgICAgLi4uYXNzZW1ibHlLZXlQYXJhbXMsXG4gICAgICBrOiByYXdBc3NlbWJseUtleSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbXBsZXRlUmVxdWVzdChuZXdQYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzZXRVc2VyID0gYXdhaXQgdGhpcy5nZXRSZXNldFVzZXIodHJ1ZSk7XG4gICAgaWYgKHJlc2V0VXNlci5zdGF0ZSAhPT0gVHBDbGFpbVN0YXRlLkFQUFJPVkVEKSB7XG4gICAgICB0aHJvdyBuZXcgTHJCYWRTdGF0ZUV4Y2VwdGlvbihcbiAgICAgICAgJ1Bhc3N3b3JkIHJlc2V0IHJlcXVlc3QgaGFzIG5vdCBiZWVuIGFwcHJvdmVkLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcmVwYXJlIGFsbCBtYXRlcmlhbHMgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBlcnJvcnMuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBhc3NlbWJseUtleSA9IGF3YWl0IHRoaXMucmVjb3ZlckFzc2VtYmx5S2V5KHJlc2V0VXNlcik7XG5cbiAgICBjb25zdCB7IHJvb3RLZXkgfSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcbiAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgcmVzZXRVc2VyLmFzc2VtYmx5Q2lwaGVyRGF0YVxuICAgICk7XG4gICAgY29uc29sZS5sb2cocm9vdEtleSk7XG5cbiAgICAvLyBNYWtpbmcgc3VyZSBpdCdzIGEgdmFsaWQga2V5LlxuICAgIGNvbnN0IHJvb3RLZXlKd2sgPSBhd2FpdCBKV0suYXNLZXkocm9vdEtleSk7XG5cbiAgICBjb25zdCBtYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoU2VydmljZS5nZXRLZXkocmVzZXRVc2VyLm1hc3RlcktleS5pZCk7XG5cbiAgICBjb25zdCBtYXN0ZXJLZXlXcmFwcGVkUm9vdEtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgbWFzdGVyS2V5Lmp3ayxcbiAgICAgIHJvb3RLZXlKd2sudG9KU09OKHRydWUpXG4gICAgKTtcblxuICAgIC8vIFRoZSBuZXcgcGFzc3dvcmRcbiAgICBjb25zdCBuZXdQYXNzSWRwUmVzdWx0ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmRlcml2ZVBhc3NJZHAoe1xuICAgICAgcGFzc3dvcmQ6IG5ld1Bhc3N3b3JkLFxuICAgICAgLi4ucmVzZXRVc2VyLnBhc3NLZXkucGFzc0lkcFBhcmFtcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG5ld0lkcFBhc3N3b3JkID0gdGhpcy5wYXNzd29yZFNlcnZpY2UuZ2V0UGFzc0lkcFN0cmluZyhcbiAgICAgIG5ld1Bhc3NJZHBSZXN1bHQuandrXG4gICAgKTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gR2V0IGFzc2VtYmx5IGtleSBjaGFsbGVuZ2VcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGNoYWxsZW5nZSA9IChcbiAgICAgIGF3YWl0IHRoaXMubXV0YXRlKFxuICAgICAgICBuZXcgTHJNdXRhdGlvbih7XG4gICAgICAgICAgbXV0YXRpb246IENyZWF0ZVRwQXNzZW1ibHlLZXlDaGFsbGVuZ2VNdXRhdGlvbixcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIGlucHV0OiB7fSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIGluY2x1ZGVLZXlHcmFwaDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgIClcbiAgICApLmNyZWF0ZVRwQXNzZW1ibHlLZXlDaGFsbGVuZ2UuY2hhbGxlbmdlO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGxlbmdlKTtcblxuICAgIC8vIFNpZ24gdGhlIGNoYWxsZW5nZVxuICAgIC8vIEdlbmVyYXRlIGEgY2xpZW50IHNpZGUgbm9uY2UgdGhhdCdzIG5vIGluIHRoZSBzZXJ2ZXIncyBjb250cm9sLlxuICAgIGNoYWxsZW5nZS5jbGllbnROb25jZSA9IHRoaXMua2V5RmFjdG9yeS5yYW5kb21TdHJpbmcoXG4gICAgICB0aGlzLkNMSUVOVF9OT05DRV9MRU5HVEhcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKGNoYWxsZW5nZSk7XG5cbiAgICBjb25zdCBhc3NlbWJseUtleVZlcmlmaWVyUHJrID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KFxuICAgICAgYXNzZW1ibHlLZXksXG4gICAgICByZXNldFVzZXIud3JhcHBlZEFzc2VtYmx5S2V5VmVyaWZpZXJQcmtcbiAgICApO1xuICAgIGNvbnN0IHNpZ25lZENoYWxsZW5nZSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihcbiAgICAgIGFzc2VtYmx5S2V5VmVyaWZpZXJQcmssXG4gICAgICBjaGFsbGVuZ2VcbiAgICApO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDaGFuZ2UgcGFzc3dvcmQgZm9yIHRoZSBvcmlnaW5hbCB1c2VyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCB0ZW1wSWRwUGFzc3dvcmQgPSAoXG4gICAgICBhd2FpdCB0aGlzLm11dGF0ZShcbiAgICAgICAgbmV3IExyTXV0YXRpb24oe1xuICAgICAgICAgIG11dGF0aW9uOiBQcmVDb21wbGV0ZVRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvbixcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgIHNpZ25lZENoYWxsZW5nZTogSlNPTi5zdHJpbmdpZnkoc2lnbmVkQ2hhbGxlbmdlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBpbmNsdWRlS2V5R3JhcGg6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICApXG4gICAgKS5wcmVDb21wbGV0ZVRwUGFzc3dvcmRSZXNldFJlcXVlc3QuaWRwUGFzc3dvcmQ7XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIExvZ2luIGFzIHRoZSBvcmlnaW5hbCB1c2VyIHVzaW5nIG5ldyB0ZW1wb3JhcnkgcGFzc3dvcmRcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBvcmlnaW5hbCBhY2NvdW50J3MgcGFzc3dvcmQgaGFzIGJlZW4gY2hhbmdlZFxuICAgIC8vIHRvIGEgdGVtcG9yYXJ5IHBhc3N3b3JkLiBJdCBpcyBubyBsb25nZXIgcG9zc2libGUgZm9yIHRoZSB1c2VyXG4gICAgLy8gdG8gdXNlIHRoZSBvcmlnaW5hbCBwYXNzd29yZCB0byBsb2dpbi4gQW55IHN1Y2Nlc3NmdWwgbG9naW5cbiAgICAvLyBjYW4gb25seSBiZSB1c2luZyB0aGUgdGVtcG9yYXJ5IHBhc3N3b3JkLiBTbyBpdCdzIHNhZmUgdG8gYXNzdW1lXG4gICAgLy8gdGhhdCB3ZSB3YW50IHRvIFwiY29tcGxldGVcIiB0aGUgcGFzc3dvcmQgcmVzZXQuXG5cbiAgICAvLyBUaGUgbWF5YmUgMkZBIHNvIHdlIGxpc3RlbiBmb3IgdGhlIGF1dGggZXZlbnQgZnJvbSBBbXBsaWZ5LlxuICAgIGNvbnN0IHJldFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBhc3luYyAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZGF0YS5wYXlsb2FkLmV2ZW50ICE9PSAnc2lnbkluJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIEh1Yi5yZW1vdmUoJ2F1dGgnLCBsaXN0ZW5lcik7XG5cbiAgICAgICAgY29uc29sZS5sb2coZGF0YS5wYXlsb2FkKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmF1dGguc2lnbkluKHJlc2V0VXNlci51c2VybmFtZSwgbmV3SWRwUGFzc3dvcmQpO1xuXG4gICAgICAgIC8vIFN3aXRjaCBvdmVyIHRvIHRoZSBuZXcgc2V0IG9mIGtleXNcbiAgICAgICAgYXdhaXQgdGhpcy5tdXRhdGUoXG4gICAgICAgICAgbmV3IExyTXV0YXRpb24oe1xuICAgICAgICAgICAgbXV0YXRpb246IENvbXBsZXRlVHBQYXNzd29yZFJlc2V0UmVxdWVzdE11dGF0aW9uLFxuICAgICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgICAgbWFzdGVyS2V5V3JhcHBlZFJvb3RLZXksXG4gICAgICAgICAgICAgICAgbWFzdGVyS2V5SWQ6IG1hc3RlcktleS5pZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBIdWIubGlzdGVuKCdhdXRoJywgbGlzdGVuZXIpO1xuICAgIH0pO1xuXG4gICAgLy8gU2lnbmluIGFzIHRoZSBvcmlnaW5hbCB1c2VyLiBQYXNzd29yZCBoYXMgYmVlbiByZXNldCB0byB0ZW1wb3Jhcnkgb25lLiBJdCBzaG91bGQgcmV0dXJuXG4gICAgLy8gd2l0aCBORVdfUEFTU1dPUkRfUkVRVUlSRURcbiAgICBsZXQgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC5zaWduSW4ocmVzZXRVc2VyLnVzZXJuYW1lLCB0ZW1wSWRwUGFzc3dvcmQsIHtcbiAgICAgIG5vUHJveHk6ICd0cnVlJyxcbiAgICB9KTtcblxuICAgIGlmICh1c2VyLmNoYWxsZW5nZU5hbWUgIT09ICdORVdfUEFTU1dPUkRfUkVRVUlSRUQnKSB7XG4gICAgICB0aHJvdyBuZXcgTHJFeGNlcHRpb24oe1xuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICdJbnRlcm5hbCBlcnJvci4gRXhwZWN0aW5nIENvZ25pdG8gdG8gaGF2ZSBkb25lIGEgcGFzc3dvcmQgcmVzZXQgYWZ0ZXIgY2FsbCB0byBQcmVDb21wbGV0ZVRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvbi4nLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IG5ldyBwYXNzd29yZCBvbiBJZHBcbiAgICAvLyB0aGUgYXdzRmV0Y2goKSBmdW5jdGlvbiBwYXNzZXMgTkVXX1BBU1NXT1JEX1JFUVVJUkVEIGRpcmVjdGx5IHRvIEFXUyB3aXRob3V0XG4gICAgLy8gZ29pbmcgdGhyb3VnaCB0aGUgcHJveHkuXG4gICAgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC5jb21wbGV0ZU5ld1Bhc3N3b3JkKHVzZXIsIG5ld0lkcFBhc3N3b3JkLCB7fSk7XG5cbiAgICByZXR1cm4gcmV0UHJvbWlzZTtcbiAgfVxufVxuIl19
|
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
import { gqlTyped } from '../_common/ast';
|
|
2
|
-
const SharedTpPasswordResetFragment = gqlTyped `
|
|
3
|
-
fragment SharedTpPasswordResetFragment on SharedTpPasswordResetNode {
|
|
4
|
-
id
|
|
5
|
-
tp {
|
|
6
|
-
id
|
|
7
|
-
other {
|
|
8
|
-
username
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
assembly {
|
|
12
|
-
asApprovers {
|
|
13
|
-
edges {
|
|
14
|
-
node {
|
|
15
|
-
id
|
|
16
|
-
sharedKey {
|
|
17
|
-
id
|
|
18
|
-
}
|
|
19
|
-
sharedCipherData
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
sharedRequest {
|
|
25
|
-
id
|
|
26
|
-
pxk {
|
|
27
|
-
id
|
|
28
|
-
pbk
|
|
29
|
-
}
|
|
30
|
-
claim {
|
|
31
|
-
id
|
|
32
|
-
state
|
|
33
|
-
asClaimApprovers {
|
|
34
|
-
edges {
|
|
35
|
-
node {
|
|
36
|
-
id
|
|
37
|
-
state
|
|
38
|
-
sharedKey {
|
|
39
|
-
id
|
|
40
|
-
}
|
|
41
|
-
sharedCipherApprovalData
|
|
42
|
-
sharedCipherPartialAssemblyKey
|
|
43
|
-
receiverApprovals {
|
|
44
|
-
edges {
|
|
45
|
-
node {
|
|
46
|
-
id
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}`;
|
|
56
|
-
export const SharedTpPasswordResetsQuery = gqlTyped `
|
|
57
|
-
query SharedTpPasswordResetsQuery {
|
|
58
|
-
sharedTpPasswordResets {
|
|
59
|
-
edges {
|
|
60
|
-
node {
|
|
61
|
-
...SharedTpPasswordResetFragment
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
${SharedTpPasswordResetFragment}
|
|
67
|
-
`;
|
|
68
|
-
export const SharedTpPasswordResetQuery = gqlTyped `
|
|
69
|
-
query SharedTpPasswordResetQuery($id: LrRelayIdInput!) {
|
|
70
|
-
sharedTpPasswordReset(id: $id) {
|
|
71
|
-
...SharedTpPasswordResetFragment
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
${SharedTpPasswordResetFragment}
|
|
75
|
-
`;
|
|
76
|
-
export const CancelTpPasswordResetRequestMutation = gqlTyped `
|
|
77
|
-
mutation CancelTpPasswordResetRequestMutation {
|
|
78
|
-
cancelTpPasswordResetRequest(input: {}) {
|
|
79
|
-
id
|
|
80
|
-
}
|
|
81
|
-
}`;
|
|
82
|
-
export const CreateTpAssemblyKeyChallengeMutation = gqlTyped `
|
|
83
|
-
mutation CreateTpAssemblyKeyChallengeMutation(
|
|
84
|
-
$input: CreateTpAssemblyKeyChallengeInput!
|
|
85
|
-
) {
|
|
86
|
-
createTpAssemblyKeyChallenge(input: $input) {
|
|
87
|
-
challenge
|
|
88
|
-
}
|
|
89
|
-
}`;
|
|
90
|
-
export const PreCompleteTpPasswordResetRequestMutation = gqlTyped `
|
|
91
|
-
mutation PreCompleteTpPasswordResetRequestMutation(
|
|
92
|
-
$input: PreCompleteTpPasswordResetRequestInput!
|
|
93
|
-
) {
|
|
94
|
-
preCompleteTpPasswordResetRequest(input: $input) {
|
|
95
|
-
idpPassword
|
|
96
|
-
}
|
|
97
|
-
}`;
|
|
98
|
-
export const CompleteTpPasswordResetRequestMutation = gqlTyped `
|
|
99
|
-
mutation CompleteTpPasswordResetRequestMutation(
|
|
100
|
-
$input: CompleteTpPasswordResetRequestInput!
|
|
101
|
-
) {
|
|
102
|
-
completeTpPasswordResetRequest(input: $input) {
|
|
103
|
-
id
|
|
104
|
-
}
|
|
105
|
-
}`;
|
|
106
|
-
export const ApproveTpPasswordResetRequestMutation = gqlTyped `
|
|
107
|
-
mutation ApproveTpPasswordResetRequestMutation(
|
|
108
|
-
$input: ApproveTpPasswordResetRequestInput!
|
|
109
|
-
) {
|
|
110
|
-
approveTpPasswordResetRequest(input: $input) {
|
|
111
|
-
claimApprover {
|
|
112
|
-
id
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}`;
|
|
116
|
-
export const RejectTpPasswordResetRequestMutation = gqlTyped `
|
|
117
|
-
mutation RejectTpPasswordResetRequestMutation(
|
|
118
|
-
$input: RejectTpPasswordResetRequestInput!
|
|
119
|
-
) {
|
|
120
|
-
rejectTpPasswordResetRequest(input: $input) {
|
|
121
|
-
claimApprover {
|
|
122
|
-
id
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}`;
|
|
126
|
-
export const TpPasswordResetUserQuery = gqlTyped `
|
|
127
|
-
query TpPasswordResetUserQuery {
|
|
128
|
-
tpPasswordResetUser {
|
|
129
|
-
username
|
|
130
|
-
resetUsername
|
|
131
|
-
state
|
|
132
|
-
passKey {
|
|
133
|
-
id
|
|
134
|
-
passKeyParams
|
|
135
|
-
passIdpParams
|
|
136
|
-
}
|
|
137
|
-
masterKey {
|
|
138
|
-
id
|
|
139
|
-
}
|
|
140
|
-
pxk {
|
|
141
|
-
id
|
|
142
|
-
}
|
|
143
|
-
sessionEncryptionKey
|
|
144
|
-
assembly {
|
|
145
|
-
singleReject
|
|
146
|
-
quorum
|
|
147
|
-
subAssemblies {
|
|
148
|
-
singleReject
|
|
149
|
-
quorum
|
|
150
|
-
approvers {
|
|
151
|
-
name
|
|
152
|
-
email
|
|
153
|
-
state
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
approvals {
|
|
158
|
-
id
|
|
159
|
-
modified
|
|
160
|
-
approverEmail
|
|
161
|
-
receiverCipher
|
|
162
|
-
receiverCipherPartialAssemblyKey
|
|
163
|
-
}
|
|
164
|
-
assemblyCipherData
|
|
165
|
-
wrappedAssemblyKeyVerifierPrk
|
|
166
|
-
}
|
|
167
|
-
}`;
|
|
168
|
-
export const TpPasswordResetQuery = gqlTyped `
|
|
169
|
-
query TpPasswordResetQuery {
|
|
170
|
-
tpPasswordReset {
|
|
171
|
-
id
|
|
172
|
-
applied
|
|
173
|
-
assembly {
|
|
174
|
-
singleReject
|
|
175
|
-
quorum
|
|
176
|
-
subjectKey {
|
|
177
|
-
id
|
|
178
|
-
}
|
|
179
|
-
assemblyKey {
|
|
180
|
-
id
|
|
181
|
-
}
|
|
182
|
-
assemblyCipherData
|
|
183
|
-
subAssemblies {
|
|
184
|
-
edges {
|
|
185
|
-
node {
|
|
186
|
-
id
|
|
187
|
-
singleReject
|
|
188
|
-
quorum
|
|
189
|
-
subjectCipherData
|
|
190
|
-
approvers {
|
|
191
|
-
edges {
|
|
192
|
-
node {
|
|
193
|
-
id
|
|
194
|
-
tp {
|
|
195
|
-
id
|
|
196
|
-
}
|
|
197
|
-
sharedKey {
|
|
198
|
-
id
|
|
199
|
-
}
|
|
200
|
-
sharedCipherData
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}`;
|
|
210
|
-
export const CreateTpPasswordResetMutation = gqlTyped `
|
|
211
|
-
mutation CreateTpPasswordResetMutation($input: CreateTpPasswordResetInput!) {
|
|
212
|
-
createTpPasswordReset(input: $input) {
|
|
213
|
-
tpPasswordReset {
|
|
214
|
-
id
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}`;
|
|
218
|
-
export const DeleteTpPasswordResetMutation = gqlTyped `
|
|
219
|
-
mutation DeleteTpPasswordResetMutation {
|
|
220
|
-
deleteTpPasswordReset(input: {}) {
|
|
221
|
-
id
|
|
222
|
-
}
|
|
223
|
-
}`;
|
|
224
|
-
export const UpdateTpPasswordResetMutation = gqlTyped `
|
|
225
|
-
mutation UpdateTpPasswordResetMutation($input: UpdateTpPasswordResetInput!) {
|
|
226
|
-
updateTpPasswordReset(input: $input) {
|
|
227
|
-
tpPasswordReset {
|
|
228
|
-
id
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}`;
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAtcGFzc3dvcmQtcmVzZXQuZ3FsLmpzIiwic291cmNlUm9vdCI6Ii9vcHQvYXRsYXNzaWFuL3BpcGVsaW5lcy9hZ2VudC9idWlsZC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi90cnVzdGVkLXBhcnRpZXMvdHAtcGFzc3dvcmQtcmVzZXQuZ3FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQStEMUMsTUFBTSw2QkFBNkIsR0FBRyxRQUFRLENBQXFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXFEakYsQ0FBQztBQVNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLFFBQVEsQ0FBbUM7Ozs7Ozs7Ozs7RUFVcEYsNkJBQTZCO0NBQzlCLENBQUM7QUFLRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxRQUFRLENBQWtDOzs7Ozs7RUFNbEYsNkJBQTZCO0NBQzlCLENBQUM7QUFPRixNQUFNLENBQUMsTUFBTSxvQ0FBb0MsR0FBRyxRQUFRLENBQTRDOzs7OztFQUt0RyxDQUFDO0FBT0gsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQUcsUUFBUSxDQUE0Qzs7Ozs7OztFQU90RyxDQUFDO0FBT0gsTUFBTSxDQUFDLE1BQU0seUNBQXlDLEdBQUcsUUFBUSxDQUFpRDs7Ozs7OztFQU9oSCxDQUFDO0FBT0gsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsUUFBUSxDQUE4Qzs7Ozs7OztFQU8xRyxDQUFDO0FBU0gsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUcsUUFBUSxDQUE2Qzs7Ozs7Ozs7O0VBU3hHLENBQUM7QUFTSCxNQUFNLENBQUMsTUFBTSxvQ0FBb0MsR0FBRyxRQUFRLENBQTRDOzs7Ozs7Ozs7RUFTdEcsQ0FBQztBQTJDSCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxRQUFRLENBQWdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlDOUUsQ0FBQztBQTRDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxRQUFRLENBQTRCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlDdEUsQ0FBQztBQVNILE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLFFBQVEsQ0FBcUM7Ozs7Ozs7RUFPeEYsQ0FBQztBQU9ILE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLFFBQVEsQ0FBcUM7Ozs7O0VBS3hGLENBQUM7QUFTSCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxRQUFRLENBQXFDOzs7Ozs7O0VBT3hGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHZW5lcmljU2NhbGFyLCBJRCB9IGZyb20gJy4uL2FwaS90eXBlcyc7XG5pbXBvcnQgeyBncWxUeXBlZCB9IGZyb20gJy4uL19jb21tb24vYXN0JztcbmltcG9ydCB7XG4gIFRwQ2xhaW1TdGF0ZSxcbiAgVHBDbGFpbUFwcHJvdmVyU3RhdGUsXG59IGZyb20gJy4uL2FwaS90eXBlcy9sci1ncmFwaHFsLnR5cGVzJztcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnLi4vYXBpL3R5cGVzL2dyYXBocWwudHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZFRwUGFzc3dvcmRSZXNldEZyYWdtZW50UmVzdWx0IHtcbiAgaWQ6IElEO1xuICB0cDoge1xuICAgIGlkOiBJRDtcbiAgICBvdGhlcjoge1xuICAgICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICB9O1xuICB9O1xuICBhc3NlbWJseToge1xuICAgIGFzQXBwcm92ZXJzOiB7XG4gICAgICBlZGdlczoge1xuICAgICAgICBub2RlOiB7XG4gICAgICAgICAgaWQ6IElEO1xuICAgICAgICAgIHNoYXJlZEtleToge1xuICAgICAgICAgICAgaWQ6IElEO1xuICAgICAgICAgIH07XG4gICAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YTogc3RyaW5nO1xuICAgICAgICAgIHNoYXJlZENpcGhlckRhdGFDbGVhckpzb246IGFueTtcbiAgICAgICAgfTtcbiAgICAgIH1bXTtcbiAgICB9O1xuICB9O1xuICBzaGFyZWRSZXF1ZXN0OiB7XG4gICAgaWQ6IElEO1xuICAgIHB4azoge1xuICAgICAgaWQ6IElEO1xuICAgICAgcGJrOiBzdHJpbmc7XG4gICAgfTtcbiAgICBjbGFpbToge1xuICAgICAgaWQ6IElEO1xuICAgICAgc3RhdGU6IFRwQ2xhaW1TdGF0ZTtcbiAgICAgIGFzQ2xhaW1BcHByb3ZlcnM6IHtcbiAgICAgICAgZWRnZXM6IHtcbiAgICAgICAgICBub2RlOiB7XG4gICAgICAgICAgICBpZDogSUQ7XG4gICAgICAgICAgICBzdGF0ZTogVHBDbGFpbUFwcHJvdmVyU3RhdGU7XG4gICAgICAgICAgICBzaGFyZWRLZXk6IHtcbiAgICAgICAgICAgICAgaWQ6IElEO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNoYXJlZENpcGhlckFwcHJvdmFsRGF0YTogc3RyaW5nO1xuICAgICAgICAgICAgc2hhcmVkQ2lwaGVyQXBwcm92YWxEYXRhQ2xlYXJKc29uOiBhbnk7XG4gICAgICAgICAgICBzaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXk6IHN0cmluZztcbiAgICAgICAgICAgIHNoYXJlZENpcGhlclBhcnRpYWxBc3NlbWJseUtleUNsZWFySnNvbjogYW55O1xuICAgICAgICAgICAgcmVjZWl2ZXJBcHByb3ZhbHM6IHtcbiAgICAgICAgICAgICAgZWRnZXM6IHtcbiAgICAgICAgICAgICAgICBub2RlOiB7XG4gICAgICAgICAgICAgICAgICBpZDogSUQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVtdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuICAgICAgICB9W107XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG5jb25zdCBTaGFyZWRUcFBhc3N3b3JkUmVzZXRGcmFnbWVudCA9IGdxbFR5cGVkPFNoYXJlZFRwUGFzc3dvcmRSZXNldEZyYWdtZW50UmVzdWx0PmBcbmZyYWdtZW50IFNoYXJlZFRwUGFzc3dvcmRSZXNldEZyYWdtZW50IG9uIFNoYXJlZFRwUGFzc3dvcmRSZXNldE5vZGUge1xuICBpZFxuICB0cCB7XG4gICAgaWRcbiAgICBvdGhlciB7XG4gICAgICB1c2VybmFtZVxuICAgIH1cbiAgfVxuICBhc3NlbWJseSB7XG4gICAgYXNBcHByb3ZlcnMge1xuICAgICAgZWRnZXMge1xuICAgICAgICBub2RlIHtcbiAgICAgICAgICBpZFxuICAgICAgICAgIHNoYXJlZEtleSB7XG4gICAgICAgICAgICBpZFxuICAgICAgICAgIH1cbiAgICAgICAgICBzaGFyZWRDaXBoZXJEYXRhXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2hhcmVkUmVxdWVzdCB7XG4gICAgaWRcbiAgICBweGsge1xuICAgICAgaWRcbiAgICAgIHBia1xuICAgIH1cbiAgICBjbGFpbSB7XG4gICAgICBpZFxuICAgICAgc3RhdGVcbiAgICAgIGFzQ2xhaW1BcHByb3ZlcnMge1xuICAgICAgICBlZGdlcyB7XG4gICAgICAgICAgbm9kZSB7XG4gICAgICAgICAgICBpZFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgIHNoYXJlZEtleSB7XG4gICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGFyZWRDaXBoZXJBcHByb3ZhbERhdGFcbiAgICAgICAgICAgIHNoYXJlZENpcGhlclBhcnRpYWxBc3NlbWJseUtleVxuICAgICAgICAgICAgcmVjZWl2ZXJBcHByb3ZhbHMge1xuICAgICAgICAgICAgICBlZGdlcyB7XG4gICAgICAgICAgICAgICAgbm9kZSB7XG4gICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmVkVHBQYXNzd29yZFJlc2V0c1F1ZXJ5UmVzdWx0IHtcbiAgc2hhcmVkVHBQYXNzd29yZFJlc2V0czoge1xuICAgIGVkZ2VzOiB7XG4gICAgICBub2RlOiBTaGFyZWRUcFBhc3N3b3JkUmVzZXRGcmFnbWVudFJlc3VsdDtcbiAgICB9W107XG4gIH07XG59XG5leHBvcnQgY29uc3QgU2hhcmVkVHBQYXNzd29yZFJlc2V0c1F1ZXJ5ID0gZ3FsVHlwZWQ8U2hhcmVkVHBQYXNzd29yZFJlc2V0c1F1ZXJ5UmVzdWx0PmBcbnF1ZXJ5IFNoYXJlZFRwUGFzc3dvcmRSZXNldHNRdWVyeSB7XG4gIHNoYXJlZFRwUGFzc3dvcmRSZXNldHMge1xuICAgIGVkZ2VzIHtcbiAgICAgIG5vZGUge1xuICAgICAgICAuLi5TaGFyZWRUcFBhc3N3b3JkUmVzZXRGcmFnbWVudFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuJHtTaGFyZWRUcFBhc3N3b3JkUmVzZXRGcmFnbWVudH1cbmA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmVkVHBQYXNzd29yZFJlc2V0UXVlcnlSZXN1bHQge1xuICBzaGFyZWRUcFBhc3N3b3JkUmVzZXQ6IFNoYXJlZFRwUGFzc3dvcmRSZXNldEZyYWdtZW50UmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IFNoYXJlZFRwUGFzc3dvcmRSZXNldFF1ZXJ5ID0gZ3FsVHlwZWQ8U2hhcmVkVHBQYXNzd29yZFJlc2V0UXVlcnlSZXN1bHQ+YFxucXVlcnkgU2hhcmVkVHBQYXNzd29yZFJlc2V0UXVlcnkoJGlkOiBMclJlbGF5SWRJbnB1dCEpIHtcbiAgc2hhcmVkVHBQYXNzd29yZFJlc2V0KGlkOiAkaWQpIHtcbiAgICAuLi5TaGFyZWRUcFBhc3N3b3JkUmVzZXRGcmFnbWVudFxuICB9XG59XG4ke1NoYXJlZFRwUGFzc3dvcmRSZXNldEZyYWdtZW50fVxuYDtcblxuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0TXV0YXRpb25SZXN1bHQge1xuICBjYW5jZWxUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0OiB7XG4gICAgaWQ6IElEO1xuICB9O1xufVxuZXhwb3J0IGNvbnN0IENhbmNlbFRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvbiA9IGdxbFR5cGVkPENhbmNlbFRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvblJlc3VsdD5gXG5tdXRhdGlvbiBDYW5jZWxUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0TXV0YXRpb24ge1xuICBjYW5jZWxUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0KGlucHV0OiB7fSkge1xuICAgIGlkXG4gIH1cbn1gO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVRwQXNzZW1ibHlLZXlDaGFsbGVuZ2VNdXRhdGlvblJlc3VsdCB7XG4gIGNyZWF0ZVRwQXNzZW1ibHlLZXlDaGFsbGVuZ2U6IHtcbiAgICBjaGFsbGVuZ2U6IGFueTtcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBDcmVhdGVUcEFzc2VtYmx5S2V5Q2hhbGxlbmdlTXV0YXRpb24gPSBncWxUeXBlZDxDcmVhdGVUcEFzc2VtYmx5S2V5Q2hhbGxlbmdlTXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gQ3JlYXRlVHBBc3NlbWJseUtleUNoYWxsZW5nZU11dGF0aW9uKFxuICAkaW5wdXQ6IENyZWF0ZVRwQXNzZW1ibHlLZXlDaGFsbGVuZ2VJbnB1dCFcbikge1xuICBjcmVhdGVUcEFzc2VtYmx5S2V5Q2hhbGxlbmdlKGlucHV0OiAkaW5wdXQpIHtcbiAgICBjaGFsbGVuZ2VcbiAgfVxufWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlQ29tcGxldGVUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0TXV0YXRpb25SZXN1bHQge1xuICBwcmVDb21wbGV0ZVRwUGFzc3dvcmRSZXNldFJlcXVlc3Q6IHtcbiAgICBpZHBQYXNzd29yZDogc3RyaW5nO1xuICB9O1xufVxuZXhwb3J0IGNvbnN0IFByZUNvbXBsZXRlVHBQYXNzd29yZFJlc2V0UmVxdWVzdE11dGF0aW9uID0gZ3FsVHlwZWQ8UHJlQ29tcGxldGVUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0TXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gUHJlQ29tcGxldGVUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0TXV0YXRpb24oXG4gICRpbnB1dDogUHJlQ29tcGxldGVUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0SW5wdXQhXG4pIHtcbiAgcHJlQ29tcGxldGVUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0KGlucHV0OiAkaW5wdXQpIHtcbiAgICBpZHBQYXNzd29yZFxuICB9XG59YDtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0ZVRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvblJlc3VsdCB7XG4gIGNvbXBsZXRlVHBQYXNzd29yZFJlc2V0UmVxdWVzdDoge1xuICAgIGlkOiBJRDtcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBDb21wbGV0ZVRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvbiA9IGdxbFR5cGVkPENvbXBsZXRlVHBQYXNzd29yZFJlc2V0UmVxdWVzdE11dGF0aW9uUmVzdWx0PmBcbm11dGF0aW9uIENvbXBsZXRlVHBQYXNzd29yZFJlc2V0UmVxdWVzdE11dGF0aW9uKFxuICAkaW5wdXQ6IENvbXBsZXRlVHBQYXNzd29yZFJlc2V0UmVxdWVzdElucHV0IVxuKSB7XG4gIGNvbXBsZXRlVHBQYXNzd29yZFJlc2V0UmVxdWVzdChpbnB1dDogJGlucHV0KSB7XG4gICAgaWRcbiAgfVxufWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwcm92ZVRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvblJlc3VsdCB7XG4gIGFwcHJvdmVUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0OiB7XG4gICAgY2xhaW1BcHByb3Zlcjoge1xuICAgICAgaWQ6IElEO1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgY29uc3QgQXBwcm92ZVRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvbiA9IGdxbFR5cGVkPEFwcHJvdmVUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0TXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gQXBwcm92ZVRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvbihcbiAgJGlucHV0OiBBcHByb3ZlVHBQYXNzd29yZFJlc2V0UmVxdWVzdElucHV0IVxuKSB7XG4gIGFwcHJvdmVUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0KGlucHV0OiAkaW5wdXQpIHtcbiAgICBjbGFpbUFwcHJvdmVyIHtcbiAgICAgIGlkXG4gICAgfVxuICB9XG59YDtcblxuZXhwb3J0IGludGVyZmFjZSBSZWplY3RUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0TXV0YXRpb25SZXN1bHQge1xuICByZWplY3RUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0OiB7XG4gICAgY2xhaW1BcHByb3Zlcjoge1xuICAgICAgaWQ6IElEO1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgY29uc3QgUmVqZWN0VHBQYXNzd29yZFJlc2V0UmVxdWVzdE11dGF0aW9uID0gZ3FsVHlwZWQ8UmVqZWN0VHBQYXNzd29yZFJlc2V0UmVxdWVzdE11dGF0aW9uUmVzdWx0PmBcbm11dGF0aW9uIFJlamVjdFRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvbihcbiAgJGlucHV0OiBSZWplY3RUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0SW5wdXQhXG4pIHtcbiAgcmVqZWN0VHBQYXNzd29yZFJlc2V0UmVxdWVzdChpbnB1dDogJGlucHV0KSB7XG4gICAgY2xhaW1BcHByb3ZlciB7XG4gICAgICBpZFxuICAgIH1cbiAgfVxufWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHBQYXNzd29yZFJlc2V0VXNlclF1ZXJ5UmVzdWx0IHtcbiAgdHBQYXNzd29yZFJlc2V0VXNlcjoge1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgcmVzZXRVc2VybmFtZTogc3RyaW5nO1xuICAgIHN0YXRlOiBUcENsYWltU3RhdGU7XG4gICAgcGFzc0tleToge1xuICAgICAgaWQ6IElEO1xuICAgICAgcGFzc0tleVBhcmFtczogR2VuZXJpY1NjYWxhcjtcbiAgICAgIHBhc3NJZHBQYXJhbXM6IEdlbmVyaWNTY2FsYXI7XG4gICAgfTtcbiAgICBtYXN0ZXJLZXk6IHtcbiAgICAgIGlkOiBJRDtcbiAgICB9O1xuICAgIHB4azoge1xuICAgICAgaWQ6IElEO1xuICAgIH07XG4gICAgc2Vzc2lvbkVuY3J5cHRpb25LZXk6IHN0cmluZztcbiAgICBhc3NlbWJseToge1xuICAgICAgc2luZ2xlUmVqZWN0OiBib29sZWFuO1xuICAgICAgcXVvcnVtOiBudW1iZXI7XG4gICAgICBzdWJBc3NlbWJsaWVzOiB7XG4gICAgICAgIHNpbmdsZVJlamVjdDogYm9vbGVhbjtcbiAgICAgICAgcXVvcnVtOiBudW1iZXI7XG4gICAgICAgIGFwcHJvdmVyczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICBlbWFpbDogc3RyaW5nO1xuICAgICAgICAgIHN0YXRlOiBUcENsYWltQXBwcm92ZXJTdGF0ZTtcbiAgICAgICAgfVtdO1xuICAgICAgfVtdO1xuICAgIH07XG4gICAgYXBwcm92YWxzOiB7XG4gICAgICBpZDogSUQ7XG4gICAgICBtb2RpZmllZDogRGF0ZVRpbWU7XG4gICAgICBhcHByb3ZlckVtYWlsOiBzdHJpbmc7XG4gICAgICByZWNlaXZlckNpcGhlcjogc3RyaW5nO1xuICAgICAgcmVjZWl2ZXJDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXk6IHN0cmluZztcbiAgICB9W107XG4gICAgYXNzZW1ibHlDaXBoZXJEYXRhOiBzdHJpbmc7XG4gICAgd3JhcHBlZEFzc2VtYmx5S2V5VmVyaWZpZXJQcms6IHN0cmluZztcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBUcFBhc3N3b3JkUmVzZXRVc2VyUXVlcnkgPSBncWxUeXBlZDxUcFBhc3N3b3JkUmVzZXRVc2VyUXVlcnlSZXN1bHQ+YFxucXVlcnkgVHBQYXNzd29yZFJlc2V0VXNlclF1ZXJ5IHtcbiAgdHBQYXNzd29yZFJlc2V0VXNlciB7XG4gICAgdXNlcm5hbWVcbiAgICByZXNldFVzZXJuYW1lXG4gICAgc3RhdGVcbiAgICBwYXNzS2V5IHtcbiAgICAgIGlkXG4gICAgICBwYXNzS2V5UGFyYW1zXG4gICAgICBwYXNzSWRwUGFyYW1zXG4gICAgfVxuICAgIG1hc3RlcktleSB7XG4gICAgICBpZFxuICAgIH1cbiAgICBweGsge1xuICAgICAgaWRcbiAgICB9XG4gICAgc2Vzc2lvbkVuY3J5cHRpb25LZXlcbiAgICBhc3NlbWJseSB7XG4gICAgICBzaW5nbGVSZWplY3RcbiAgICAgIHF1b3J1bVxuICAgICAgc3ViQXNzZW1ibGllcyB7XG4gICAgICAgIHNpbmdsZVJlamVjdFxuICAgICAgICBxdW9ydW1cbiAgICAgICAgYXBwcm92ZXJzIHtcbiAgICAgICAgICBuYW1lXG4gICAgICAgICAgZW1haWxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGFwcHJvdmFscyB7XG4gICAgICBpZFxuICAgICAgbW9kaWZpZWRcbiAgICAgIGFwcHJvdmVyRW1haWxcbiAgICAgIHJlY2VpdmVyQ2lwaGVyXG4gICAgICByZWNlaXZlckNpcGhlclBhcnRpYWxBc3NlbWJseUtleVxuICAgIH1cbiAgICBhc3NlbWJseUNpcGhlckRhdGFcbiAgICB3cmFwcGVkQXNzZW1ibHlLZXlWZXJpZmllclBya1xuICB9XG59YDtcblxuZXhwb3J0IGludGVyZmFjZSBUcFBhc3N3b3JkUmVzZXRRdWVyeVJlc3VsdCB7XG4gIHRwUGFzc3dvcmRSZXNldDoge1xuICAgIGlkOiBJRDtcbiAgICBhcHBsaWVkOiBib29sZWFuO1xuICAgIGFzc2VtYmx5OiB7XG4gICAgICBzaW5nbGVSZWplY3Q6IGJvb2xlYW47XG4gICAgICBxdW9ydW06IG51bWJlcjtcbiAgICAgIHN1YmplY3RLZXk6IHtcbiAgICAgICAgaWQ6IElEO1xuICAgICAgfTtcbiAgICAgIGFzc2VtYmx5S2V5OiB7XG4gICAgICAgIGlkOiBJRDtcbiAgICAgIH07XG4gICAgICBhc3NlbWJseUNpcGhlckRhdGE6IHN0cmluZztcbiAgICAgIHN1YkFzc2VtYmxpZXM6IHtcbiAgICAgICAgZWRnZXM6IHtcbiAgICAgICAgICBub2RlOiB7XG4gICAgICAgICAgICBpZDogSUQ7XG4gICAgICAgICAgICBzaW5nbGVSZWplY3Q6IGJvb2xlYW47XG4gICAgICAgICAgICBxdW9ydW06IG51bWJlcjtcbiAgICAgICAgICAgIHN1YmplY3RDaXBoZXJEYXRhOiBzdHJpbmc7XG4gICAgICAgICAgICBzdWJqZWN0Q2lwaGVyRGF0YUNsZWFySnNvbjogYW55O1xuICAgICAgICAgICAgYXBwcm92ZXJzOiB7XG4gICAgICAgICAgICAgIGVkZ2VzOiB7XG4gICAgICAgICAgICAgICAgbm9kZToge1xuICAgICAgICAgICAgICAgICAgaWQ6IElEO1xuICAgICAgICAgICAgICAgICAgdHA6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IElEO1xuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIHNoYXJlZEtleToge1xuICAgICAgICAgICAgICAgICAgICBpZDogSUQ7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YTogc3RyaW5nO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1bXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcbiAgICAgICAgfVtdO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xufVxuZXhwb3J0IGNvbnN0IFRwUGFzc3dvcmRSZXNldFF1ZXJ5ID0gZ3FsVHlwZWQ8VHBQYXNzd29yZFJlc2V0UXVlcnlSZXN1bHQ+YFxucXVlcnkgVHBQYXNzd29yZFJlc2V0UXVlcnkge1xuICB0cFBhc3N3b3JkUmVzZXQge1xuICAgIGlkXG4gICAgYXBwbGllZFxuICAgIGFzc2VtYmx5IHtcbiAgICAgIHNpbmdsZVJlamVjdFxuICAgICAgcXVvcnVtXG4gICAgICBzdWJqZWN0S2V5IHtcbiAgICAgICAgaWRcbiAgICAgIH1cbiAgICAgIGFzc2VtYmx5S2V5IHtcbiAgICAgICAgaWRcbiAgICAgIH1cbiAgICAgIGFzc2VtYmx5Q2lwaGVyRGF0YVxuICAgICAgc3ViQXNzZW1ibGllcyB7XG4gICAgICAgIGVkZ2VzIHtcbiAgICAgICAgICBub2RlIHtcbiAgICAgICAgICAgIGlkXG4gICAgICAgICAgICBzaW5nbGVSZWplY3RcbiAgICAgICAgICAgIHF1b3J1bVxuICAgICAgICAgICAgc3ViamVjdENpcGhlckRhdGFcbiAgICAgICAgICAgIGFwcHJvdmVycyB7XG4gICAgICAgICAgICAgIGVkZ2VzIHtcbiAgICAgICAgICAgICAgICBub2RlIHtcbiAgICAgICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICAgICAgICB0cCB7XG4gICAgICAgICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzaGFyZWRLZXkge1xuICAgICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVHBQYXNzd29yZFJlc2V0TXV0YXRpb25SZXN1bHQge1xuICBjcmVhdGVUcFBhc3N3b3JkUmVzZXQ6IHtcbiAgICB0cFBhc3N3b3JkUmVzZXQ6IHtcbiAgICAgIGlkOiBJRDtcbiAgICB9O1xuICB9O1xufVxuZXhwb3J0IGNvbnN0IENyZWF0ZVRwUGFzc3dvcmRSZXNldE11dGF0aW9uID0gZ3FsVHlwZWQ8Q3JlYXRlVHBQYXNzd29yZFJlc2V0TXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gQ3JlYXRlVHBQYXNzd29yZFJlc2V0TXV0YXRpb24oJGlucHV0OiBDcmVhdGVUcFBhc3N3b3JkUmVzZXRJbnB1dCEpIHtcbiAgY3JlYXRlVHBQYXNzd29yZFJlc2V0KGlucHV0OiAkaW5wdXQpIHtcbiAgICB0cFBhc3N3b3JkUmVzZXQge1xuICAgICAgaWRcbiAgICB9XG4gIH1cbn1gO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZVRwUGFzc3dvcmRSZXNldE11dGF0aW9uUmVzdWx0IHtcbiAgZGVsZXRlVHBQYXNzd29yZFJlc2V0OiB7XG4gICAgaWQ6IElEO1xuICB9O1xufVxuZXhwb3J0IGNvbnN0IERlbGV0ZVRwUGFzc3dvcmRSZXNldE11dGF0aW9uID0gZ3FsVHlwZWQ8RGVsZXRlVHBQYXNzd29yZFJlc2V0TXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gRGVsZXRlVHBQYXNzd29yZFJlc2V0TXV0YXRpb24ge1xuICBkZWxldGVUcFBhc3N3b3JkUmVzZXQoaW5wdXQ6IHt9KSB7XG4gICAgaWRcbiAgfVxufWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlVHBQYXNzd29yZFJlc2V0TXV0YXRpb25SZXN1bHQge1xuICB1cGRhdGVUcFBhc3N3b3JkUmVzZXQ6IHtcbiAgICB0cFBhc3N3b3JkUmVzZXQ6IHtcbiAgICAgIGlkOiBJRDtcbiAgICB9O1xuICB9O1xufVxuZXhwb3J0IGNvbnN0IFVwZGF0ZVRwUGFzc3dvcmRSZXNldE11dGF0aW9uID0gZ3FsVHlwZWQ8VXBkYXRlVHBQYXNzd29yZFJlc2V0TXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gVXBkYXRlVHBQYXNzd29yZFJlc2V0TXV0YXRpb24oJGlucHV0OiBVcGRhdGVUcFBhc3N3b3JkUmVzZXRJbnB1dCEpIHtcbiAgdXBkYXRlVHBQYXNzd29yZFJlc2V0KGlucHV0OiAkaW5wdXQpIHtcbiAgICB0cFBhc3N3b3JkUmVzZXQge1xuICAgICAgaWRcbiAgICB9XG4gIH1cbn1gO1xuIl19
|