@kaspernj/api-maker 1.0.2055 → 1.0.2057
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/build/api.js +22 -16
- package/build/attribute-not-loaded-error.js +5 -2
- package/build/base-component.js +6 -3
- package/build/base-error.js +15 -9
- package/build/base-model/attribute.js +10 -4
- package/build/base-model/column.js +5 -2
- package/build/base-model/reflection.js +49 -10
- package/build/base-model/scope.js +41 -5
- package/build/base-model.js +115 -76
- package/build/bootstrap/attribute-row.js +71 -33
- package/build/bootstrap/attribute-rows.js +20 -15
- package/build/bootstrap/card.js +72 -34
- package/build/bootstrap/checkbox.js +35 -30
- package/build/bootstrap/checkboxes.js +69 -31
- package/build/bootstrap/index.d.ts +1 -0
- package/build/bootstrap/index.js +3 -1
- package/build/bootstrap/input.js +48 -43
- package/build/bootstrap/invalid-feedback.js +17 -11
- package/build/bootstrap/paginate.js +73 -35
- package/build/bootstrap/radio-buttons.js +33 -28
- package/build/bootstrap/select.js +34 -29
- package/build/bootstrap/sort-link.js +68 -30
- package/build/cable-connection-pool.js +18 -12
- package/build/cable-subscription-pool.js +58 -19
- package/build/cable-subscription.d.ts +2 -2
- package/build/cable-subscription.d.ts.map +1 -1
- package/build/cable-subscription.js +12 -6
- package/build/cache-key-generator.js +11 -5
- package/build/can-can.d.ts +2 -2
- package/build/can-can.d.ts.map +1 -1
- package/build/can-can.js +56 -17
- package/build/channels-consumer.js +10 -5
- package/build/collection-loader.js +36 -31
- package/build/collection.d.ts.map +1 -1
- package/build/collection.js +58 -20
- package/build/command-submit-data.d.ts +1 -1
- package/build/command-submit-data.d.ts.map +1 -1
- package/build/command-submit-data.js +10 -4
- package/build/commands-pool.js +39 -33
- package/build/compose.js +5 -2
- package/build/config.d.ts +3 -3
- package/build/config.d.ts.map +1 -1
- package/build/config.js +40 -6
- package/build/custom-error.js +9 -4
- package/build/data-set-to-attributes.js +39 -3
- package/build/deserializer.js +57 -18
- package/build/destroy-error.js +9 -4
- package/build/devise.d.ts +1 -1
- package/build/devise.d.ts.map +1 -1
- package/build/devise.js +55 -16
- package/build/draggable-sort/controller.js +14 -11
- package/build/draggable-sort/index.js +69 -31
- package/build/draggable-sort/item.js +70 -32
- package/build/error-logger.js +14 -8
- package/build/error-messages.js +8 -5
- package/build/event-connection.js +18 -12
- package/build/event-emitter-listener.js +9 -4
- package/build/event-model-class.js +17 -11
- package/build/events.d.ts +2 -2
- package/build/events.d.ts.map +1 -1
- package/build/events.js +6 -5
- package/build/form.js +69 -27
- package/build/history-expo.js +11 -6
- package/build/history-react-native.js +14 -9
- package/build/history.js +5 -3
- package/build/index.js +5 -2
- package/build/inputs/attachment.js +29 -24
- package/build/inputs/auto-submit.js +42 -6
- package/build/inputs/checkbox.js +73 -35
- package/build/inputs/checkboxes.js +68 -30
- package/build/inputs/id-for-component.js +39 -3
- package/build/inputs/input-wrapper.js +12 -7
- package/build/inputs/input.js +101 -62
- package/build/inputs/money.js +85 -47
- package/build/inputs/name-for-component.js +39 -3
- package/build/inputs/select.js +32 -26
- package/build/instance-of-class-name.js +7 -5
- package/build/is-expo.js +8 -6
- package/build/key-value-store.js +10 -4
- package/build/link.js +21 -16
- package/build/logger.js +5 -2
- package/build/merge-styles.js +7 -4
- package/build/modal.js +15 -10
- package/build/model-class-require.js +39 -4
- package/build/model-events.js +20 -14
- package/build/model-name.js +44 -5
- package/build/model-prop-type.js +15 -9
- package/build/model-recipes-loader.js +14 -8
- package/build/model-recipes-model-loader.d.ts +1 -1
- package/build/model-recipes-model-loader.js +57 -18
- package/build/models-response-reader.js +46 -7
- package/build/models.js +10 -5
- package/build/money-formatter.d.ts +2 -2
- package/build/money-formatter.d.ts.map +1 -1
- package/build/money-formatter.js +19 -13
- package/build/not-loaded-error.js +5 -2
- package/build/params.js +19 -13
- package/build/preloaded.js +44 -5
- package/build/resize-observer.js +11 -6
- package/build/rest-props-validator.js +4 -2
- package/build/result.js +5 -2
- package/build/router/route.js +82 -40
- package/build/router/switch.js +56 -17
- package/build/router.js +59 -21
- package/build/routes-native.js +54 -15
- package/build/routes.js +49 -13
- package/build/run-last.js +5 -2
- package/build/serializer.js +8 -5
- package/build/services.js +10 -4
- package/build/session-status-updater.js +53 -14
- package/build/source-maps-loader.js +50 -11
- package/build/super-admin/config-reader.d.ts +2 -2
- package/build/super-admin/config-reader.js +45 -9
- package/build/super-admin/edit-page/edit-attribute-checkbox.js +61 -23
- package/build/super-admin/edit-page/edit-attribute-content.js +21 -16
- package/build/super-admin/edit-page/edit-attribute-input.js +59 -21
- package/build/super-admin/edit-page/edit-attribute.js +65 -27
- package/build/super-admin/edit-page.js +72 -34
- package/build/super-admin/has-edit-config.js +9 -4
- package/build/super-admin/index-page.js +17 -12
- package/build/super-admin/index.js +84 -46
- package/build/super-admin/layout/header/index.js +63 -25
- package/build/super-admin/layout/index.js +78 -40
- package/build/super-admin/layout/menu/index.js +47 -42
- package/build/super-admin/layout/menu/menu-content.js +60 -22
- package/build/super-admin/layout/menu/menu-item.js +23 -18
- package/build/super-admin/layout/no-access.js +20 -15
- package/build/super-admin/model-class-table.js +64 -26
- package/build/super-admin/models.js +38 -3
- package/build/super-admin/show-nav.js +61 -23
- package/build/super-admin/show-page/belongs-to-attribute-row.js +52 -14
- package/build/super-admin/show-page/index.js +63 -25
- package/build/super-admin/show-reflection-actions.js +62 -24
- package/build/super-admin/show-reflection-link.js +19 -14
- package/build/super-admin/show-reflection-page.js +63 -25
- package/build/table/column-content.js +54 -15
- package/build/table/column-identifier.js +5 -2
- package/build/table/column-visible.js +5 -2
- package/build/table/components/column.js +14 -9
- package/build/table/components/flat-list.js +14 -9
- package/build/table/components/header.js +16 -11
- package/build/table/components/row.js +16 -11
- package/build/table/filters/attribute-element.js +26 -21
- package/build/table/filters/filter-form.js +109 -71
- package/build/table/filters/filter.js +29 -24
- package/build/table/filters/index.js +43 -38
- package/build/table/filters/load-search-modal.js +64 -26
- package/build/table/filters/reflection-element.js +22 -17
- package/build/table/filters/save-search-modal.js +27 -22
- package/build/table/filters/scope-element.js +19 -14
- package/build/table/header-column-content.js +27 -22
- package/build/table/header-column.js +71 -33
- package/build/table/header-select.js +29 -24
- package/build/table/model-callback-args.js +39 -3
- package/build/table/model-column.js +75 -37
- package/build/table/model-row.js +79 -41
- package/build/table/select-calculator.js +52 -13
- package/build/table/settings/column-row.js +57 -19
- package/build/table/settings/download-action.js +31 -26
- package/build/table/settings/index.js +61 -23
- package/build/table/table-settings.js +70 -31
- package/build/table/table.js +196 -158
- package/build/table/use-sorting.js +12 -6
- package/build/table/widths.js +12 -9
- package/build/table/worker-plugins-check-all-checkbox.js +64 -26
- package/build/table/worker-plugins-checkbox.js +61 -23
- package/build/translated-attributes.js +5 -2
- package/build/translated-collections.js +14 -8
- package/build/updated-attribute.js +21 -15
- package/build/url-encode.js +10 -4
- package/build/use-breakpoint.js +58 -20
- package/build/use-can-can.js +21 -15
- package/build/use-collection.js +70 -32
- package/build/use-created-event.js +27 -22
- package/build/use-current-user-context.js +74 -36
- package/build/use-current-user.d.ts +2 -2
- package/build/use-current-user.d.ts.map +1 -1
- package/build/use-current-user.js +17 -11
- package/build/use-destroyed-event.js +18 -13
- package/build/use-event-emitter.d.ts +1 -2
- package/build/use-event-emitter.d.ts.map +1 -1
- package/build/use-event-emitter.js +14 -9
- package/build/use-event-listener.js +12 -7
- package/build/use-input.js +33 -28
- package/build/use-model-event.js +18 -13
- package/build/use-model.js +65 -27
- package/build/use-resize-observer.js +13 -8
- package/build/use-router.js +62 -24
- package/build/use-screen-layout.js +7 -5
- package/build/use-styles.js +52 -13
- package/build/use-updated-event.js +18 -13
- package/build/use-validation-errors.js +14 -9
- package/build/utils/button.js +33 -28
- package/build/utils/card.js +61 -23
- package/build/utils/checkbox.js +60 -22
- package/build/utils/checkboxes.js +78 -40
- package/build/utils/default-style.js +56 -15
- package/build/utils/header.js +12 -7
- package/build/utils/icon.js +61 -23
- package/build/utils/invalid-feedback.js +17 -12
- package/build/utils/modal.js +55 -17
- package/build/utils/text.js +14 -9
- package/build/validation-error.js +45 -6
- package/build/validation-errors.js +59 -19
- package/build/with-api-maker.js +52 -12
- package/build/with-collection.js +50 -12
- package/build/with-current-user.js +12 -7
- package/build/with-model.js +14 -9
- package/build/with-router.js +12 -7
- package/package.json +5 -3
- package/build/api.js.map +0 -1
- package/build/attribute-not-loaded-error.js.map +0 -1
- package/build/base-component.js.map +0 -1
- package/build/base-error.js.map +0 -1
- package/build/base-model/attribute.js.map +0 -1
- package/build/base-model/column.js.map +0 -1
- package/build/base-model/reflection.js.map +0 -1
- package/build/base-model/scope.js.map +0 -1
- package/build/base-model.js.map +0 -1
- package/build/bootstrap/attribute-row.js.map +0 -1
- package/build/bootstrap/attribute-rows.js.map +0 -1
- package/build/bootstrap/card.js.map +0 -1
- package/build/bootstrap/checkbox.js.map +0 -1
- package/build/bootstrap/checkboxes.js.map +0 -1
- package/build/bootstrap/index.js.map +0 -1
- package/build/bootstrap/input.js.map +0 -1
- package/build/bootstrap/invalid-feedback.js.map +0 -1
- package/build/bootstrap/paginate.js.map +0 -1
- package/build/bootstrap/radio-buttons.js.map +0 -1
- package/build/bootstrap/select.js.map +0 -1
- package/build/bootstrap/sort-link.js.map +0 -1
- package/build/cable-connection-pool.js.map +0 -1
- package/build/cable-subscription-pool.js.map +0 -1
- package/build/cable-subscription.js.map +0 -1
- package/build/cache-key-generator.js.map +0 -1
- package/build/can-can.js.map +0 -1
- package/build/channels-consumer.js.map +0 -1
- package/build/collection-loader.js.map +0 -1
- package/build/collection.js.map +0 -1
- package/build/command-submit-data.js.map +0 -1
- package/build/commands-pool.js.map +0 -1
- package/build/compose.js.map +0 -1
- package/build/config.js.map +0 -1
- package/build/custom-error.js.map +0 -1
- package/build/data-set-to-attributes.js.map +0 -1
- package/build/deserializer.js.map +0 -1
- package/build/destroy-error.js.map +0 -1
- package/build/devise.js.map +0 -1
- package/build/draggable-sort/controller.js.map +0 -1
- package/build/draggable-sort/index.js.map +0 -1
- package/build/draggable-sort/item.js.map +0 -1
- package/build/error-logger.js.map +0 -1
- package/build/error-messages.js.map +0 -1
- package/build/event-connection.js.map +0 -1
- package/build/event-emitter-listener.js.map +0 -1
- package/build/event-model-class.js.map +0 -1
- package/build/events.js.map +0 -1
- package/build/form.js.map +0 -1
- package/build/history-expo.js.map +0 -1
- package/build/history-react-native.js.map +0 -1
- package/build/history.js.map +0 -1
- package/build/index.js.map +0 -1
- package/build/inputs/attachment.js.map +0 -1
- package/build/inputs/auto-submit.js.map +0 -1
- package/build/inputs/checkbox.js.map +0 -1
- package/build/inputs/checkboxes.js.map +0 -1
- package/build/inputs/id-for-component.js.map +0 -1
- package/build/inputs/input-wrapper.js.map +0 -1
- package/build/inputs/input.js.map +0 -1
- package/build/inputs/money.js.map +0 -1
- package/build/inputs/name-for-component.js.map +0 -1
- package/build/inputs/select.js.map +0 -1
- package/build/instance-of-class-name.js.map +0 -1
- package/build/is-expo.js.map +0 -1
- package/build/key-value-store.js.map +0 -1
- package/build/link.js.map +0 -1
- package/build/logger.js.map +0 -1
- package/build/merge-styles.js.map +0 -1
- package/build/modal.js.map +0 -1
- package/build/model-class-require.js.map +0 -1
- package/build/model-events.js.map +0 -1
- package/build/model-name.js.map +0 -1
- package/build/model-prop-type.js.map +0 -1
- package/build/model-recipes-loader.js.map +0 -1
- package/build/model-recipes-model-loader.js.map +0 -1
- package/build/models-response-reader.js.map +0 -1
- package/build/models.js.map +0 -1
- package/build/money-formatter.js.map +0 -1
- package/build/not-loaded-error.js.map +0 -1
- package/build/params.js.map +0 -1
- package/build/preloaded.js.map +0 -1
- package/build/resize-observer.js.map +0 -1
- package/build/rest-props-validator.js.map +0 -1
- package/build/result.js.map +0 -1
- package/build/router/route.js.map +0 -1
- package/build/router/switch.js.map +0 -1
- package/build/router.js.map +0 -1
- package/build/routes-native.js.map +0 -1
- package/build/routes.js.map +0 -1
- package/build/run-last.js.map +0 -1
- package/build/serializer.js.map +0 -1
- package/build/services.js.map +0 -1
- package/build/session-status-updater.js.map +0 -1
- package/build/source-maps-loader.d.ts +0 -37
- package/build/source-maps-loader.d.ts.map +0 -1
- package/build/source-maps-loader.js.map +0 -1
- package/build/super-admin/config-reader.js.map +0 -1
- package/build/super-admin/edit-page/edit-attribute-checkbox.js.map +0 -1
- package/build/super-admin/edit-page/edit-attribute-content.js.map +0 -1
- package/build/super-admin/edit-page/edit-attribute-input.js.map +0 -1
- package/build/super-admin/edit-page/edit-attribute.js.map +0 -1
- package/build/super-admin/edit-page.js.map +0 -1
- package/build/super-admin/has-edit-config.js.map +0 -1
- package/build/super-admin/index-page.js.map +0 -1
- package/build/super-admin/index.js.map +0 -1
- package/build/super-admin/layout/header/index.js.map +0 -1
- package/build/super-admin/layout/index.js.map +0 -1
- package/build/super-admin/layout/menu/index.js.map +0 -1
- package/build/super-admin/layout/menu/menu-content.js.map +0 -1
- package/build/super-admin/layout/menu/menu-item.js.map +0 -1
- package/build/super-admin/layout/no-access.js.map +0 -1
- package/build/super-admin/model-class-table.js.map +0 -1
- package/build/super-admin/models.js.map +0 -1
- package/build/super-admin/show-nav.js.map +0 -1
- package/build/super-admin/show-page/belongs-to-attribute-row.js.map +0 -1
- package/build/super-admin/show-page/index.js.map +0 -1
- package/build/super-admin/show-reflection-actions.js.map +0 -1
- package/build/super-admin/show-reflection-link.js.map +0 -1
- package/build/super-admin/show-reflection-page.js.map +0 -1
- package/build/table/column-content.js.map +0 -1
- package/build/table/column-identifier.js.map +0 -1
- package/build/table/column-visible.js.map +0 -1
- package/build/table/components/column.js.map +0 -1
- package/build/table/components/flat-list.js.map +0 -1
- package/build/table/components/header.js.map +0 -1
- package/build/table/components/row.js.map +0 -1
- package/build/table/filters/attribute-element.js.map +0 -1
- package/build/table/filters/filter-form.js.map +0 -1
- package/build/table/filters/filter.js.map +0 -1
- package/build/table/filters/index.js.map +0 -1
- package/build/table/filters/load-search-modal.js.map +0 -1
- package/build/table/filters/reflection-element.js.map +0 -1
- package/build/table/filters/save-search-modal.js.map +0 -1
- package/build/table/filters/scope-element.js.map +0 -1
- package/build/table/header-column-content.js.map +0 -1
- package/build/table/header-column.js.map +0 -1
- package/build/table/header-select.js.map +0 -1
- package/build/table/model-callback-args.js.map +0 -1
- package/build/table/model-column.js.map +0 -1
- package/build/table/model-row.js.map +0 -1
- package/build/table/select-calculator.js.map +0 -1
- package/build/table/settings/column-row.js.map +0 -1
- package/build/table/settings/download-action.js.map +0 -1
- package/build/table/settings/index.js.map +0 -1
- package/build/table/table-settings.js.map +0 -1
- package/build/table/table.js.map +0 -1
- package/build/table/use-sorting.js.map +0 -1
- package/build/table/widths.js.map +0 -1
- package/build/table/worker-plugins-check-all-checkbox.js.map +0 -1
- package/build/table/worker-plugins-checkbox.js.map +0 -1
- package/build/translated-attributes.js.map +0 -1
- package/build/translated-collections.js.map +0 -1
- package/build/updated-attribute.js.map +0 -1
- package/build/url-encode.js.map +0 -1
- package/build/use-breakpoint.js.map +0 -1
- package/build/use-can-can.js.map +0 -1
- package/build/use-collection.js.map +0 -1
- package/build/use-created-event.js.map +0 -1
- package/build/use-current-user-context.js.map +0 -1
- package/build/use-current-user.js.map +0 -1
- package/build/use-destroyed-event.js.map +0 -1
- package/build/use-event-emitter.js.map +0 -1
- package/build/use-event-listener.js.map +0 -1
- package/build/use-input.js.map +0 -1
- package/build/use-model-event.js.map +0 -1
- package/build/use-model.js.map +0 -1
- package/build/use-resize-observer.js.map +0 -1
- package/build/use-router.js.map +0 -1
- package/build/use-screen-layout.js.map +0 -1
- package/build/use-styles.js.map +0 -1
- package/build/use-updated-event.js.map +0 -1
- package/build/use-validation-errors.js.map +0 -1
- package/build/utils/button.js.map +0 -1
- package/build/utils/card.js.map +0 -1
- package/build/utils/checkbox.js.map +0 -1
- package/build/utils/checkboxes.js.map +0 -1
- package/build/utils/default-style.js.map +0 -1
- package/build/utils/header.js.map +0 -1
- package/build/utils/icon.js.map +0 -1
- package/build/utils/invalid-feedback.js.map +0 -1
- package/build/utils/modal.js.map +0 -1
- package/build/utils/text.js.map +0 -1
- package/build/validation-error.js.map +0 -1
- package/build/validation-errors.js.map +0 -1
- package/build/with-api-maker.js.map +0 -1
- package/build/with-collection.js.map +0 -1
- package/build/with-current-user.js.map +0 -1
- package/build/with-model.js.map +0 -1
- package/build/with-router.js.map +0 -1
package/build/base-model.js
CHANGED
|
@@ -1,21 +1,59 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const attribute_1 = __importDefault(require("./base-model/attribute"));
|
|
40
|
+
const attribute_not_loaded_error_1 = __importDefault(require("./attribute-not-loaded-error"));
|
|
41
|
+
const cache_key_generator_1 = __importDefault(require("./cache-key-generator"));
|
|
42
|
+
const collection_js_1 = __importDefault(require("./collection.js"));
|
|
43
|
+
const commands_pool_js_1 = __importDefault(require("./commands-pool.js"));
|
|
44
|
+
const config_js_1 = __importDefault(require("./config.js"));
|
|
45
|
+
const custom_error_js_1 = __importDefault(require("./custom-error.js"));
|
|
46
|
+
const diggerize_1 = require("diggerize");
|
|
47
|
+
const form_data_objectizer_1 = __importDefault(require("form-data-objectizer"));
|
|
48
|
+
const inflection = __importStar(require("inflection"));
|
|
49
|
+
const model_name_1 = __importDefault(require("./model-name"));
|
|
50
|
+
const not_loaded_error_1 = __importDefault(require("./not-loaded-error"));
|
|
51
|
+
const object_to_formdata_1 = __importDefault(require("object-to-formdata"));
|
|
52
|
+
const reflection_1 = __importDefault(require("./base-model/reflection"));
|
|
53
|
+
const scope_1 = __importDefault(require("./base-model/scope"));
|
|
54
|
+
const services_js_1 = __importDefault(require("./services.js"));
|
|
55
|
+
const validation_error_js_1 = __importDefault(require("./validation-error.js"));
|
|
56
|
+
const validation_errors_js_1 = require("./validation-errors.js");
|
|
19
57
|
/**
|
|
20
58
|
* @typedef {object} ModelClassDataType
|
|
21
59
|
* @property {import("./base-model/attribute.js").AttributeArgType[]} attributes
|
|
@@ -38,7 +76,7 @@ function objectToUnderscore(object) {
|
|
|
38
76
|
}
|
|
39
77
|
return newObject;
|
|
40
78
|
}
|
|
41
|
-
|
|
79
|
+
class BaseModel {
|
|
42
80
|
static apiMakerType = "BaseModel";
|
|
43
81
|
/** @returns {Attribute[]} */
|
|
44
82
|
static attributes() {
|
|
@@ -46,14 +84,14 @@ export default class BaseModel {
|
|
|
46
84
|
const result = [];
|
|
47
85
|
for (const attributeKey in attributes) {
|
|
48
86
|
const attributeData = attributes[attributeKey];
|
|
49
|
-
const attribute = new
|
|
87
|
+
const attribute = new attribute_1.default(attributeData);
|
|
50
88
|
result.push(attribute);
|
|
51
89
|
}
|
|
52
90
|
return result;
|
|
53
91
|
}
|
|
54
92
|
/** @returns {boolean} */
|
|
55
93
|
static hasAttribute(attributeName) {
|
|
56
|
-
const attributes = digg(this.modelClassData(), "attributes");
|
|
94
|
+
const attributes = (0, diggerize_1.digg)(this.modelClassData(), "attributes");
|
|
57
95
|
const lowerCaseAttributeName = inflection.underscore(attributeName);
|
|
58
96
|
if (lowerCaseAttributeName in attributes)
|
|
59
97
|
return true;
|
|
@@ -100,7 +138,7 @@ export default class BaseModel {
|
|
|
100
138
|
return model;
|
|
101
139
|
}
|
|
102
140
|
else {
|
|
103
|
-
throw new
|
|
141
|
+
throw new custom_error_js_1.default("Record not found");
|
|
104
142
|
}
|
|
105
143
|
}
|
|
106
144
|
/**
|
|
@@ -110,21 +148,21 @@ export default class BaseModel {
|
|
|
110
148
|
* @returns {Promise<InstanceType<T>>}
|
|
111
149
|
*/
|
|
112
150
|
static async findOrCreateBy(findOrCreateByArgs, args = {}) {
|
|
113
|
-
const result = await
|
|
151
|
+
const result = await services_js_1.default.current().sendRequest("Models::FindOrCreateBy", {
|
|
114
152
|
additional_data: args.additionalData,
|
|
115
153
|
find_or_create_by_args: findOrCreateByArgs,
|
|
116
|
-
resource_name: digg(this.modelClassData(), "name")
|
|
154
|
+
resource_name: (0, diggerize_1.digg)(this.modelClassData(), "name")
|
|
117
155
|
});
|
|
118
|
-
const model = /** @type {InstanceType<T>} */ (digg(result, "model"));
|
|
156
|
+
const model = /** @type {InstanceType<T>} */ ((0, diggerize_1.digg)(result, "model"));
|
|
119
157
|
return model;
|
|
120
158
|
}
|
|
121
159
|
/** @returns {ModelName} */
|
|
122
160
|
static modelName() {
|
|
123
|
-
return new
|
|
161
|
+
return new model_name_1.default({ modelClassData: this.modelClassData() });
|
|
124
162
|
}
|
|
125
163
|
/** @returns {string} */
|
|
126
164
|
static primaryKey() {
|
|
127
|
-
return digg(this.modelClassData(), "primaryKey");
|
|
165
|
+
return (0, diggerize_1.digg)(this.modelClassData(), "primaryKey");
|
|
128
166
|
}
|
|
129
167
|
/**
|
|
130
168
|
* @template {typeof BaseModel} MC
|
|
@@ -134,7 +172,7 @@ export default class BaseModel {
|
|
|
134
172
|
*/
|
|
135
173
|
static ransack(query = {}) {
|
|
136
174
|
const ModelClass = /** @type {MC} */ (this);
|
|
137
|
-
return new
|
|
175
|
+
return new collection_js_1.default({ modelClass: ModelClass }, { ransack: query });
|
|
138
176
|
}
|
|
139
177
|
/**
|
|
140
178
|
* @template {typeof BaseModel} MC
|
|
@@ -147,10 +185,10 @@ export default class BaseModel {
|
|
|
147
185
|
}
|
|
148
186
|
/** @returns {Reflection[]} */
|
|
149
187
|
static ransackableAssociations() {
|
|
150
|
-
const relationships = digg(this.modelClassData(), "ransackable_associations");
|
|
188
|
+
const relationships = (0, diggerize_1.digg)(this.modelClassData(), "ransackable_associations");
|
|
151
189
|
const reflections = [];
|
|
152
190
|
for (const relationshipData of relationships) {
|
|
153
|
-
reflections.push(new
|
|
191
|
+
reflections.push(new reflection_1.default(relationshipData));
|
|
154
192
|
}
|
|
155
193
|
return reflections;
|
|
156
194
|
}
|
|
@@ -159,26 +197,26 @@ export default class BaseModel {
|
|
|
159
197
|
const attributes = this.modelClassData().ransackable_attributes;
|
|
160
198
|
const result = [];
|
|
161
199
|
for (const attributeData of attributes) {
|
|
162
|
-
result.push(new
|
|
200
|
+
result.push(new attribute_1.default(attributeData));
|
|
163
201
|
}
|
|
164
202
|
return result;
|
|
165
203
|
}
|
|
166
204
|
/** @returns {Scope[]} */
|
|
167
205
|
static ransackableScopes() {
|
|
168
|
-
const ransackableScopes = digg(this.modelClassData(), "ransackable_scopes");
|
|
206
|
+
const ransackableScopes = (0, diggerize_1.digg)(this.modelClassData(), "ransackable_scopes");
|
|
169
207
|
const result = [];
|
|
170
208
|
for (const scopeData of ransackableScopes) {
|
|
171
|
-
const scope = new
|
|
209
|
+
const scope = new scope_1.default(scopeData);
|
|
172
210
|
result.push(scope);
|
|
173
211
|
}
|
|
174
212
|
return result;
|
|
175
213
|
}
|
|
176
214
|
/** @returns {Reflection[]} */
|
|
177
215
|
static reflections() {
|
|
178
|
-
const relationships = digg(this.modelClassData(), "relationships");
|
|
216
|
+
const relationships = (0, diggerize_1.digg)(this.modelClassData(), "relationships");
|
|
179
217
|
const reflections = [];
|
|
180
218
|
for (const relationshipData of relationships) {
|
|
181
|
-
const reflection = new
|
|
219
|
+
const reflection = new reflection_1.default(relationshipData);
|
|
182
220
|
reflections.push(reflection);
|
|
183
221
|
}
|
|
184
222
|
return reflections;
|
|
@@ -268,7 +306,7 @@ export default class BaseModel {
|
|
|
268
306
|
can(givenAbilityName) {
|
|
269
307
|
const abilityName = inflection.underscore(givenAbilityName);
|
|
270
308
|
if (!(abilityName in this.abilities)) {
|
|
271
|
-
throw new Error(`Ability ${abilityName} hasn't been loaded for ${digg(this.modelClassData(), "name")}`);
|
|
309
|
+
throw new Error(`Ability ${abilityName} hasn't been loaded for ${(0, diggerize_1.digg)(this.modelClassData(), "name")}`);
|
|
272
310
|
}
|
|
273
311
|
return this.abilities[abilityName];
|
|
274
312
|
}
|
|
@@ -313,12 +351,12 @@ export default class BaseModel {
|
|
|
313
351
|
}
|
|
314
352
|
/** @returns {string} */
|
|
315
353
|
localCacheKey() {
|
|
316
|
-
const cacheKeyGenerator = new
|
|
354
|
+
const cacheKeyGenerator = new cache_key_generator_1.default(this);
|
|
317
355
|
return cacheKeyGenerator.local();
|
|
318
356
|
}
|
|
319
357
|
/** @returns {string} */
|
|
320
358
|
fullCacheKey() {
|
|
321
|
-
const cacheKeyGenerator = new
|
|
359
|
+
const cacheKeyGenerator = new cache_key_generator_1.default(this);
|
|
322
360
|
return cacheKeyGenerator.cacheKey();
|
|
323
361
|
}
|
|
324
362
|
/**
|
|
@@ -346,7 +384,7 @@ export default class BaseModel {
|
|
|
346
384
|
dataToUse[paramKey] = modelData;
|
|
347
385
|
let response;
|
|
348
386
|
try {
|
|
349
|
-
response = await
|
|
387
|
+
response = await commands_pool_js_1.default.addCommand({
|
|
350
388
|
args: {
|
|
351
389
|
save: dataToUse
|
|
352
390
|
},
|
|
@@ -374,7 +412,7 @@ export default class BaseModel {
|
|
|
374
412
|
const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
|
|
375
413
|
let response;
|
|
376
414
|
try {
|
|
377
|
-
response = await
|
|
415
|
+
response = await commands_pool_js_1.default.addCommand({
|
|
378
416
|
args: {
|
|
379
417
|
save: objectData
|
|
380
418
|
},
|
|
@@ -396,7 +434,7 @@ export default class BaseModel {
|
|
|
396
434
|
}
|
|
397
435
|
/** @returns {Promise<{model: BaseModel, response: object}>} */
|
|
398
436
|
async destroy() {
|
|
399
|
-
const response = await
|
|
437
|
+
const response = await commands_pool_js_1.default.addCommand({
|
|
400
438
|
args: { query_params: this.collection && this.collection.params() },
|
|
401
439
|
command: `${this.modelClassData().collectionName}-destroy`,
|
|
402
440
|
collectionName: this.modelClassData().collectionName,
|
|
@@ -428,7 +466,7 @@ export default class BaseModel {
|
|
|
428
466
|
const ransackParams = {};
|
|
429
467
|
ransackParams[`${primaryKeyName}_eq`] = this.primaryKey();
|
|
430
468
|
const abilitiesParams = {};
|
|
431
|
-
abilitiesParams[digg(this.modelClassData(), "name")] = abilitiesToLoad;
|
|
469
|
+
abilitiesParams[(0, diggerize_1.digg)(this.modelClassData(), "name")] = abilitiesToLoad;
|
|
432
470
|
const anotherModel = await this.modelClass()
|
|
433
471
|
.ransack(ransackParams)
|
|
434
472
|
.abilities(abilitiesParams)
|
|
@@ -450,7 +488,7 @@ export default class BaseModel {
|
|
|
450
488
|
handleResponseError(response) {
|
|
451
489
|
// @ts-expect-error
|
|
452
490
|
BaseModel.parseValidationErrors({ model: this, response });
|
|
453
|
-
throw new
|
|
491
|
+
throw new custom_error_js_1.default("Response wasn't successful", { model: this, response });
|
|
454
492
|
}
|
|
455
493
|
/**
|
|
456
494
|
* @returns {number | string}
|
|
@@ -489,13 +527,13 @@ export default class BaseModel {
|
|
|
489
527
|
* @param {ParseValidationErrorsOptions} args.options
|
|
490
528
|
*/
|
|
491
529
|
static parseValidationErrors({ error, model, options }) {
|
|
492
|
-
if (!(error instanceof
|
|
530
|
+
if (!(error instanceof validation_error_js_1.default))
|
|
493
531
|
return;
|
|
494
532
|
if (!error.args.response.validation_errors)
|
|
495
533
|
return;
|
|
496
|
-
const validationErrors = new ValidationErrors({
|
|
534
|
+
const validationErrors = new validation_errors_js_1.ValidationErrors({
|
|
497
535
|
model,
|
|
498
|
-
validationErrors: digg(error, "args", "response", "validation_errors")
|
|
536
|
+
validationErrors: (0, diggerize_1.digg)(error, "args", "response", "validation_errors")
|
|
499
537
|
});
|
|
500
538
|
BaseModel.sendValidationErrorsEvent(validationErrors, options);
|
|
501
539
|
if (!options || options.throwValidationError != false) {
|
|
@@ -503,9 +541,9 @@ export default class BaseModel {
|
|
|
503
541
|
}
|
|
504
542
|
}
|
|
505
543
|
static humanAttributeName(attributeName) {
|
|
506
|
-
const keyName = digg(this.modelClassData(), "i18nKey");
|
|
544
|
+
const keyName = (0, diggerize_1.digg)(this.modelClassData(), "i18nKey");
|
|
507
545
|
// @ts-expect-error
|
|
508
|
-
const i18n =
|
|
546
|
+
const i18n = config_js_1.default.getI18n();
|
|
509
547
|
if (i18n)
|
|
510
548
|
return i18n.t(`activerecord.attributes.${keyName}.${BaseModel.snakeCase(attributeName)}`, { defaultValue: attributeName });
|
|
511
549
|
return inflection.humanize(attributeName);
|
|
@@ -516,9 +554,9 @@ export default class BaseModel {
|
|
|
516
554
|
*/
|
|
517
555
|
isAttributeChanged(attributeName) {
|
|
518
556
|
const attributeNameUnderscore = inflection.underscore(attributeName);
|
|
519
|
-
const attributeData = this.modelClassData().attributes.find((attribute) => digg(attribute, "name") == attributeNameUnderscore);
|
|
557
|
+
const attributeData = this.modelClassData().attributes.find((attribute) => (0, diggerize_1.digg)(attribute, "name") == attributeNameUnderscore);
|
|
520
558
|
if (!attributeData) {
|
|
521
|
-
const attributeNames = this.modelClassData().attributes.map((attribute) => digg(attribute, "name"));
|
|
559
|
+
const attributeNames = this.modelClassData().attributes.map((attribute) => (0, diggerize_1.digg)(attribute, "name"));
|
|
522
560
|
throw new Error(`Couldn't find an attribute by that name: "${attributeName}" in: ${attributeNames.join(", ")}`);
|
|
523
561
|
}
|
|
524
562
|
if (!(attributeNameUnderscore in this.changes))
|
|
@@ -604,7 +642,7 @@ export default class BaseModel {
|
|
|
604
642
|
setNewModelData(model) {
|
|
605
643
|
if (!("modelData" in model))
|
|
606
644
|
throw new Error(`No modelData in model: ${JSON.stringify(model)}`);
|
|
607
|
-
this.previousModelData = Object.assign({}, digg(this, "modelData"));
|
|
645
|
+
this.previousModelData = Object.assign({}, (0, diggerize_1.digg)(this, "modelData"));
|
|
608
646
|
for (const attributeName in model.modelData) {
|
|
609
647
|
this.modelData[attributeName] = model.modelData[attributeName];
|
|
610
648
|
}
|
|
@@ -691,7 +729,7 @@ export default class BaseModel {
|
|
|
691
729
|
dataToUse[paramKey] = modelData;
|
|
692
730
|
let response;
|
|
693
731
|
try {
|
|
694
|
-
response = await
|
|
732
|
+
response = await commands_pool_js_1.default.addCommand({
|
|
695
733
|
args: {
|
|
696
734
|
query_params: this.collection && this.collection.params(),
|
|
697
735
|
save: dataToUse
|
|
@@ -718,13 +756,13 @@ export default class BaseModel {
|
|
|
718
756
|
}
|
|
719
757
|
}
|
|
720
758
|
_refreshModelFromResponse(response) {
|
|
721
|
-
let newModel = digg(response, "model");
|
|
759
|
+
let newModel = (0, diggerize_1.digg)(response, "model");
|
|
722
760
|
if (Array.isArray(newModel))
|
|
723
761
|
newModel = newModel[0];
|
|
724
762
|
this.setNewModel(newModel);
|
|
725
763
|
}
|
|
726
764
|
_refreshModelDataFromResponse(response) {
|
|
727
|
-
let newModel = digg(response, "model");
|
|
765
|
+
let newModel = (0, diggerize_1.digg)(response, "model");
|
|
728
766
|
if (Array.isArray(newModel))
|
|
729
767
|
newModel = newModel[0];
|
|
730
768
|
this.setNewModelData(newModel);
|
|
@@ -736,8 +774,8 @@ export default class BaseModel {
|
|
|
736
774
|
*/
|
|
737
775
|
static _objectDataFromGivenRawData(rawData, options) {
|
|
738
776
|
if (rawData instanceof FormData || rawData.nodeName == "FORM") {
|
|
739
|
-
const formData =
|
|
740
|
-
return
|
|
777
|
+
const formData = form_data_objectizer_1.default.formDataFromObject(rawData, options);
|
|
778
|
+
return form_data_objectizer_1.default.toObject(formData);
|
|
741
779
|
}
|
|
742
780
|
return rawData;
|
|
743
781
|
}
|
|
@@ -745,7 +783,7 @@ export default class BaseModel {
|
|
|
745
783
|
const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
|
|
746
784
|
let response;
|
|
747
785
|
try {
|
|
748
|
-
response = await
|
|
786
|
+
response = await commands_pool_js_1.default.addCommand({
|
|
749
787
|
args: {
|
|
750
788
|
query_params: this.collection && this.collection.params(),
|
|
751
789
|
save: objectData,
|
|
@@ -775,7 +813,7 @@ export default class BaseModel {
|
|
|
775
813
|
const paramKey = this.modelClassData().paramKey;
|
|
776
814
|
const dataToUse = {};
|
|
777
815
|
dataToUse[paramKey] = modelData;
|
|
778
|
-
const response = await
|
|
816
|
+
const response = await commands_pool_js_1.default.addCommand({
|
|
779
817
|
args: {
|
|
780
818
|
save: dataToUse
|
|
781
819
|
},
|
|
@@ -823,7 +861,7 @@ export default class BaseModel {
|
|
|
823
861
|
static async _callCollectionCommand(args, commandArgs) {
|
|
824
862
|
const formOrDataObject = args.args;
|
|
825
863
|
try {
|
|
826
|
-
return await
|
|
864
|
+
return await commands_pool_js_1.default.addCommand(args, commandArgs);
|
|
827
865
|
}
|
|
828
866
|
catch (error) {
|
|
829
867
|
let form;
|
|
@@ -838,7 +876,7 @@ export default class BaseModel {
|
|
|
838
876
|
throw error;
|
|
839
877
|
}
|
|
840
878
|
}
|
|
841
|
-
_callMemberCommand = (args, commandArgs) =>
|
|
879
|
+
_callMemberCommand = (args, commandArgs) => commands_pool_js_1.default.addCommand(args, commandArgs);
|
|
842
880
|
static _postDataFromArgs(args) {
|
|
843
881
|
let postData;
|
|
844
882
|
if (args) {
|
|
@@ -846,7 +884,7 @@ export default class BaseModel {
|
|
|
846
884
|
postData = args;
|
|
847
885
|
}
|
|
848
886
|
else {
|
|
849
|
-
postData =
|
|
887
|
+
postData = object_to_formdata_1.default.serialize(args, {}, null, "args");
|
|
850
888
|
}
|
|
851
889
|
}
|
|
852
890
|
else {
|
|
@@ -875,12 +913,12 @@ export default class BaseModel {
|
|
|
875
913
|
}
|
|
876
914
|
else if (this.isNewRecord()) {
|
|
877
915
|
// Return null if this is a new record and the attribute name is a recognized attribute
|
|
878
|
-
const attributes = digg(this.modelClassData(), "attributes");
|
|
916
|
+
const attributes = (0, diggerize_1.digg)(this.modelClassData(), "attributes");
|
|
879
917
|
if (attributeName in attributes)
|
|
880
918
|
return null;
|
|
881
919
|
}
|
|
882
920
|
if (this.isPersisted()) {
|
|
883
|
-
throw new
|
|
921
|
+
throw new attribute_not_loaded_error_1.default(`No such attribute: ${(0, diggerize_1.digg)(this.modelClassData(), "name")}#${attributeName}: ${JSON.stringify(this.modelData)}`);
|
|
884
922
|
}
|
|
885
923
|
}
|
|
886
924
|
/**
|
|
@@ -911,7 +949,7 @@ export default class BaseModel {
|
|
|
911
949
|
return this.relationshipsCache[args.reflectionName];
|
|
912
950
|
}
|
|
913
951
|
else {
|
|
914
|
-
const collection = new
|
|
952
|
+
const collection = new collection_js_1.default(args, queryArgs);
|
|
915
953
|
const model = await collection.first();
|
|
916
954
|
this.relationshipsCache[args.reflectionName] = model;
|
|
917
955
|
return model;
|
|
@@ -927,8 +965,8 @@ export default class BaseModel {
|
|
|
927
965
|
if (this.isNewRecord())
|
|
928
966
|
return null;
|
|
929
967
|
const loadedRelationships = Object.keys(this.relationshipsCache);
|
|
930
|
-
const modelClassName = digg(this.modelClassData(), "name");
|
|
931
|
-
throw new
|
|
968
|
+
const modelClassName = (0, diggerize_1.digg)(this.modelClassData(), "name");
|
|
969
|
+
throw new not_loaded_error_1.default(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
|
|
932
970
|
}
|
|
933
971
|
/**
|
|
934
972
|
* @template {typeof import("./base-model.js").default} AssocMC
|
|
@@ -943,7 +981,7 @@ export default class BaseModel {
|
|
|
943
981
|
else if (args.reflectionName in this.relationshipsCache) {
|
|
944
982
|
return this.relationshipsCache[args.reflectionName];
|
|
945
983
|
}
|
|
946
|
-
const collection = new
|
|
984
|
+
const collection = new collection_js_1.default(args, queryArgs);
|
|
947
985
|
const models = await collection.toArray();
|
|
948
986
|
this.relationshipsCache[args.reflectionName] = models;
|
|
949
987
|
return models;
|
|
@@ -962,7 +1000,7 @@ export default class BaseModel {
|
|
|
962
1000
|
return this.relationshipsCache[args.reflectionName];
|
|
963
1001
|
}
|
|
964
1002
|
else {
|
|
965
|
-
const collection = new
|
|
1003
|
+
const collection = new collection_js_1.default(args, queryArgs);
|
|
966
1004
|
const model = await collection.first();
|
|
967
1005
|
this.relationshipsCache[args.reflectionName] = model;
|
|
968
1006
|
return model;
|
|
@@ -979,8 +1017,8 @@ export default class BaseModel {
|
|
|
979
1017
|
return null;
|
|
980
1018
|
}
|
|
981
1019
|
const loadedRelationships = Object.keys(this.relationshipsCache);
|
|
982
|
-
const modelClassName = digg(this.modelClassData(), "name");
|
|
983
|
-
throw new
|
|
1020
|
+
const modelClassName = (0, diggerize_1.digg)(this.modelClassData(), "name");
|
|
1021
|
+
throw new not_loaded_error_1.default(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
|
|
984
1022
|
}
|
|
985
1023
|
_readModelDataFromArgs(args) {
|
|
986
1024
|
this.abilities = args.data.b || {};
|
|
@@ -992,21 +1030,21 @@ export default class BaseModel {
|
|
|
992
1030
|
if (!this.preloadedRelationships) {
|
|
993
1031
|
return;
|
|
994
1032
|
}
|
|
995
|
-
const relationships = digg(this.modelClassData(), "relationships");
|
|
1033
|
+
const relationships = (0, diggerize_1.digg)(this.modelClassData(), "relationships");
|
|
996
1034
|
for (const relationshipName in this.preloadedRelationships) {
|
|
997
1035
|
const relationshipData = this.preloadedRelationships[relationshipName];
|
|
998
|
-
const relationshipClassData = relationships.find((relationship) => digg(relationship, "name") == relationshipName);
|
|
1036
|
+
const relationshipClassData = relationships.find((relationship) => (0, diggerize_1.digg)(relationship, "name") == relationshipName);
|
|
999
1037
|
if (!relationshipClassData) {
|
|
1000
|
-
const modelName = digg(this.modelClassData(), "name");
|
|
1038
|
+
const modelName = (0, diggerize_1.digg)(this.modelClassData(), "name");
|
|
1001
1039
|
const relationshipsList = relationships.map((relationship) => relationship.name).join(", ");
|
|
1002
1040
|
throw new Error(`Could not find the relation ${relationshipName} on the ${modelName} model: ${relationshipsList}`);
|
|
1003
1041
|
}
|
|
1004
|
-
const relationshipType = digg(relationshipClassData, "collectionName");
|
|
1042
|
+
const relationshipType = (0, diggerize_1.digg)(relationshipClassData, "collectionName");
|
|
1005
1043
|
if (relationshipName in this.relationshipsCache) {
|
|
1006
1044
|
throw new Error(`${relationshipName} has already been loaded`);
|
|
1007
1045
|
}
|
|
1008
1046
|
if (!relationshipClassData) {
|
|
1009
|
-
throw new Error(`No relationship on ${digg(this.modelClassData(), "name")} by that name: ${relationshipName}`);
|
|
1047
|
+
throw new Error(`No relationship on ${(0, diggerize_1.digg)(this.modelClassData(), "name")} by that name: ${relationshipName}`);
|
|
1010
1048
|
}
|
|
1011
1049
|
if (!relationshipData) {
|
|
1012
1050
|
this.relationshipsCache[relationshipName] = null;
|
|
@@ -1033,4 +1071,5 @@ export default class BaseModel {
|
|
|
1033
1071
|
*/
|
|
1034
1072
|
primaryKey() { return this.readAttributeUnderscore(this.modelClass().primaryKey()); }
|
|
1035
1073
|
}
|
|
1036
|
-
|
|
1074
|
+
exports.default = BaseModel;
|
|
1075
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiYmFzZS1tb2RlbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVFQUE4QztBQUM5Qyw4RkFBa0U7QUFDbEUsZ0ZBQXFEO0FBQ3JELG9FQUF3QztBQUN4QywwRUFBNkM7QUFDN0MsNERBQWdDO0FBQ2hDLHdFQUEyQztBQUMzQyx5Q0FBOEI7QUFDOUIsZ0ZBQXFEO0FBQ3JELHVEQUF3QztBQUN4Qyw4REFBb0M7QUFDcEMsMEVBQStDO0FBQy9DLDRFQUFpRDtBQUNqRCx5RUFBZ0Q7QUFDaEQsK0RBQXNDO0FBQ3RDLGdFQUFvQztBQUNwQyxnRkFBbUQ7QUFDbkQsaUVBQXVEO0FBRXZEOzs7Ozs7OztHQVFHO0FBRUg7Ozs7R0FJRztBQUVILFNBQVMsa0JBQWtCLENBQUMsTUFBTTtJQUNoQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7SUFFcEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN6QixNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRWhELFNBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxNQUFxQixTQUFTO0lBQzVCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFBO0lBRWpDLDZCQUE2QjtJQUM3QixNQUFNLENBQUMsVUFBVTtRQUNmLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUE7UUFDbkQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO1FBRWpCLEtBQUssTUFBTSxZQUFZLElBQUksVUFBVSxFQUFFLENBQUM7WUFDdEMsTUFBTSxhQUFhLEdBQUcsVUFB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SyxNQUFNLGNBQWMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO29CQUM5QyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFBO29CQUVsRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ2xELENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO2dCQUVwRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUE7Z0JBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUE7WUFDOUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLEtBQUssT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDOztBQXRwQ3RGLDRCQXVwQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXR0cmlidXRlIGZyb20gXCIuL2Jhc2UtbW9kZWwvYXR0cmlidXRlXCJcbmltcG9ydCBBdHRyaWJ1dGVOb3RMb2FkZWRFcnJvciBmcm9tIFwiLi9hdHRyaWJ1dGUtbm90LWxvYWRlZC1lcnJvclwiXG5pbXBvcnQgQ2FjaGVLZXlHZW5lcmF0b3IgZnJvbSBcIi4vY2FjaGUta2V5LWdlbmVyYXRvclwiXG5pbXBvcnQgQ29sbGVjdGlvbiBmcm9tIFwiLi9jb2xsZWN0aW9uLmpzXCJcbmltcG9ydCBDb21tYW5kc1Bvb2wgZnJvbSBcIi4vY29tbWFuZHMtcG9vbC5qc1wiXG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuL2NvbmZpZy5qc1wiXG5pbXBvcnQgQ3VzdG9tRXJyb3IgZnJvbSBcIi4vY3VzdG9tLWVycm9yLmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgRm9ybURhdGFPYmplY3RpemVyIGZyb20gXCJmb3JtLWRhdGEtb2JqZWN0aXplclwiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBNb2RlbE5hbWUgZnJvbSBcIi4vbW9kZWwtbmFtZVwiXG5pbXBvcnQgTm90TG9hZGVkRXJyb3IgZnJvbSBcIi4vbm90LWxvYWRlZC1lcnJvclwiXG5pbXBvcnQgb2JqZWN0VG9Gb3JtRGF0YSBmcm9tIFwib2JqZWN0LXRvLWZvcm1kYXRhXCJcbmltcG9ydCBSZWZsZWN0aW9uIGZyb20gXCIuL2Jhc2UtbW9kZWwvcmVmbGVjdGlvblwiXG5pbXBvcnQgU2NvcGUgZnJvbSBcIi4vYmFzZS1tb2RlbC9zY29wZVwiXG5pbXBvcnQgU2VydmljZXMgZnJvbSBcIi4vc2VydmljZXMuanNcIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tIFwiLi92YWxpZGF0aW9uLWVycm9yLmpzXCJcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yc30gZnJvbSBcIi4vdmFsaWRhdGlvbi1lcnJvcnMuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1vZGVsQ2xhc3NEYXRhVHlwZVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2Jhc2UtbW9kZWwvYXR0cmlidXRlLmpzXCIpLkF0dHJpYnV0ZUFyZ1R5cGVbXX0gYXR0cmlidXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbGxlY3Rpb25OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJpbWFyeUtleVxuICogQHByb3BlcnR5IHtvYmplY3R9IHJhbnNhY2thYmxlX2F0dHJpYnV0ZXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbZm9ybV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Rocm93VmFsaWRhdGlvbkVycm9yXVxuICovXG5cbmZ1bmN0aW9uIG9iamVjdFRvVW5kZXJzY29yZShvYmplY3QpIHtcbiAgY29uc3QgbmV3T2JqZWN0ID0ge31cblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICBjb25zdCB1bmRlcnNjb3JlS2V5ID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGtleSlcblxuICAgIG5ld09iamVjdFt1bmRlcnNjb3JlS2V5XSA9IG9iamVjdFtrZXldXG4gIH1cblxuICByZXR1cm4gbmV3T2JqZWN0XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VNb2RlbCB7XG4gIHN0YXRpYyBhcGlNYWtlclR5cGUgPSBcIkJhc2VNb2RlbFwiXG5cbiAgLyoqIEByZXR1cm5zIHtBdHRyaWJ1dGVbXX0gKi9cbiAgc3RhdGljIGF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlS2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZUtleV1cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlRGF0YSlcblxuICAgICAgcmVzdWx0LnB1c2goYXR0cmlidXRlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgc3RhdGljIGhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcImF0dHJpYnV0ZXNcIilcbiAgICBjb25zdCBsb3dlckNhc2VBdHRyaWJ1dGVOYW1lID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICBpZiAobG93ZXJDYXNlQXR0cmlidXRlTmFtZSBpbiBhdHRyaWJ1dGVzKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBAcmV0dXJucyB7TW9kZWxDbGFzc0RhdGFUeXBlfVxuICAgKi9cbiAgc3RhdGljIG1vZGVsQ2xhc3NEYXRhKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIm1vZGVsQ2xhc3NEYXRhIHNob3VsZCBiZSBvdmVycmlkZW4gYnkgY2hpbGRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25FcnJvcnN9IHZhbGlkYXRpb25FcnJvcnNcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgc3RhdGljIG5ld0N1c3RvbUV2ZW50ID0gKHZhbGlkYXRpb25FcnJvcnMpID0+IHtcbiAgICByZXR1cm4gbmV3IEN1c3RvbUV2ZW50KFwidmFsaWRhdGlvbi1lcnJvcnNcIiwge2RldGFpbDogdmFsaWRhdGlvbkVycm9yc30pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtWYWxpZGF0aW9uRXJyb3JzfSB2YWxpZGF0aW9uRXJyb3JzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLmZvcm1dXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudGhyb3dWYWxpZGF0aW9uRXJyb3JdXG4gICAqL1xuICBzdGF0aWMgc2VuZFZhbGlkYXRpb25FcnJvcnNFdmVudCh2YWxpZGF0aW9uRXJyb3JzLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5mb3JtKSB7XG4gICAgICBjb25zdCBldmVudCA9IEJhc2VNb2RlbC5uZXdDdXN0b21FdmVudCh2YWxpZGF0aW9uRXJyb3JzKVxuICAgICAgb3B0aW9ucy5mb3JtLmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEJhc2VNb2RlbH0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPj59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZChpZCkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBjb25zdCBxdWVyeSA9IHt9XG5cbiAgICBxdWVyeVtgJHt0aGlzLnByaW1hcnlLZXkoKX1fZXFgXSA9IGlkXG5cbiAgICBjb25zdCBtb2RlbCA9IC8qKiBAdHlwZSB7SW5zdGFuY2VUeXBlPFQ+fSAqLyAoYXdhaXQgdGhpcy5yYW5zYWNrKHF1ZXJ5KS5maXJzdCgpKVxuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICByZXR1cm4gbW9kZWxcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEN1c3RvbUVycm9yKFwiUmVjb3JkIG5vdCBmb3VuZFwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBCYXNlTW9kZWx9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZmluZE9yQ3JlYXRlQnlBcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPj59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZE9yQ3JlYXRlQnkoZmluZE9yQ3JlYXRlQnlBcmdzLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBTZXJ2aWNlcy5jdXJyZW50KCkuc2VuZFJlcXVlc3QoXCJNb2RlbHM6OkZpbmRPckNyZWF0ZUJ5XCIsIHtcbiAgICAgIGFkZGl0aW9uYWxfZGF0YTogYXJncy5hZGRpdGlvbmFsRGF0YSxcbiAgICAgIGZpbmRfb3JfY3JlYXRlX2J5X2FyZ3M6IGZpbmRPckNyZWF0ZUJ5QXJncyxcbiAgICAgIHJlc291cmNlX25hbWU6IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcbiAgICB9KVxuICAgIGNvbnN0IG1vZGVsID0gLyoqIEB0eXBlIHtJbnN0YW5jZVR5cGU8VD59ICovIChkaWdnKHJlc3VsdCwgXCJtb2RlbFwiKSlcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbE5hbWV9ICovXG4gIHN0YXRpYyBtb2RlbE5hbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbE5hbWUoe21vZGVsQ2xhc3NEYXRhOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCl9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHN0YXRpYyBwcmltYXJ5S2V5KCkge1xuICAgIHJldHVybiBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJwcmltYXJ5S2V5XCIpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgQmFzZU1vZGVsfSBNQ1xuICAgKiBAdGhpcyB7TUN9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3F1ZXJ5XVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHQ8TUM+fVxuICAgKi9cbiAgc3RhdGljIHJhbnNhY2socXVlcnkgPSB7fSkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge01DfSAqLyAodGhpcylcblxuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih7bW9kZWxDbGFzczogTW9kZWxDbGFzc30sIHtyYW5zYWNrOiBxdWVyeX0pXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgQmFzZU1vZGVsfSBNQ1xuICAgKiBAdGhpcyB7TUN9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3NlbGVjdF1cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0PE1DPn1cbiAgICovXG4gIHN0YXRpYyBzZWxlY3Qoc2VsZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMucmFuc2FjaygpLnNlbGVjdChzZWxlY3QpXG4gIH1cblxuICAvKiogQHJldHVybnMge1JlZmxlY3Rpb25bXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlQXNzb2NpYXRpb25zKCkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyYW5zYWNrYWJsZV9hc3NvY2lhdGlvbnNcIilcbiAgICBjb25zdCByZWZsZWN0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgcmVmbGVjdGlvbnMucHVzaChuZXcgUmVmbGVjdGlvbihyZWxhdGlvbnNoaXBEYXRhKSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmbGVjdGlvbnNcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7QXR0cmlidXRlW119ICovXG4gIHN0YXRpYyByYW5zYWNrYWJsZUF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5yYW5zYWNrYWJsZV9hdHRyaWJ1dGVzXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlRGF0YSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICByZXN1bHQucHVzaChuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZURhdGEpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7U2NvcGVbXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlU2NvcGVzKCkge1xuICAgIGNvbnN0IHJhbnNhY2thYmxlU2NvcGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmFuc2Fja2FibGVfc2NvcGVzXCIpXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3Qgc2NvcGVEYXRhIG9mIHJhbnNhY2thYmxlU2NvcGVzKSB7XG4gICAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZShzY29wZURhdGEpXG5cbiAgICAgIHJlc3VsdC5wdXNoKHNjb3BlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbltdfSAqL1xuICBzdGF0aWMgcmVmbGVjdGlvbnMoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJlbGF0aW9uc2hpcHNcIilcbiAgICBjb25zdCByZWZsZWN0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVmbGVjdGlvbiA9IG5ldyBSZWZsZWN0aW9uKHJlbGF0aW9uc2hpcERhdGEpXG5cbiAgICAgIHJlZmxlY3Rpb25zLnB1c2gocmVmbGVjdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmbGVjdGlvbnNcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbn0gKi9cbiAgc3RhdGljIHJlZmxlY3Rpb24obmFtZSkge1xuICAgIGNvbnN0IGZvdW5kUmVmbGVjdGlvbiA9IHRoaXMucmVmbGVjdGlvbnMoKS5maW5kKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSA9PSBuYW1lKVxuXG4gICAgaWYgKCFmb3VuZFJlZmxlY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCByZWZsZWN0aW9uOiAke25hbWV9IGluICR7dGhpcy5yZWZsZWN0aW9ucygpLm1hcCgocmVmbGVjdGlvbikgPT4gcmVmbGVjdGlvbi5uYW1lKCkpLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZFJlZmxlY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIF90b2tlbigpIHtcbiAgICBjb25zdCBjc3JmVG9rZW5FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nY3NyZi10b2tlbiddXCIpXG5cbiAgICBpZiAoY3NyZlRva2VuRWxlbWVudCkge1xuICAgICAgcmV0dXJuIGNzcmZUb2tlbkVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgdGhpcy5uZXdSZWNvcmQgPSBhcmdzLmlzTmV3UmVjb3JkXG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUgPSB7fVxuICAgIHRoaXMucmVsYXRpb25zaGlwcyA9IHt9XG5cbiAgICBpZiAoYXJncyAmJiBhcmdzLmRhdGEgJiYgYXJncy5kYXRhLmEpIHtcbiAgICAgIHRoaXMuX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzKVxuICAgIH0gZWxzZSBpZiAoYXJncy5hKSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IGFyZ3MuYiB8fCB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoYXJncy5hKVxuICAgIH0gZWxzZSBpZiAoYXJncykge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoYXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG5ld0F0dHJpYnV0ZXNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NpZ25BdHRyaWJ1dGVzKG5ld0F0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdBdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld0F0dHJpYnV0ZXNba2V5XVxuICAgICAgY29uc3QgYXR0cmlidXRlVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShrZXkpXG5cbiAgICAgIGxldCBhcHBseUNoYW5nZSA9IHRydWVcbiAgICAgIGxldCBkZWxldGVDaGFuZ2UgPSBmYWxzZVxuXG4gICAgICBpZiAodGhpcy5pc0F0dHJpYnV0ZUxvYWRlZChrZXkpKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5yZWFkQXR0cmlidXRlKGtleSlcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZVVuZGVyc2NvcmVdXG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlID09IG9sZFZhbHVlKSB7XG4gICAgICAgICAgYXBwbHlDaGFuZ2UgPSBmYWxzZVxuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID09IG9yaWdpbmFsVmFsdWUpIHtcbiAgICAgICAgICBhcHBseUNoYW5nZSA9IGZhbHNlXG4gICAgICAgICAgZGVsZXRlQ2hhbmdlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhcHBseUNoYW5nZSkge1xuICAgICAgICB0aGlzLmNoYW5nZXNbYXR0cmlidXRlVW5kZXJzY29yZV0gPSBuZXdWYWx1ZVxuICAgICAgfSBlbHNlIGlmIChkZWxldGVDaGFuZ2UpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVVbmRlcnNjb3JlXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5tb2RlbERhdGFba2V5XVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY2hhbmdlcykge1xuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmNoYW5nZXNba2V5XVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ2l2ZW5BYmlsaXR5TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGNhbihnaXZlbkFiaWxpdHlOYW1lKSB7XG4gICAgY29uc3QgYWJpbGl0eU5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoZ2l2ZW5BYmlsaXR5TmFtZSlcblxuICAgIGlmICghKGFiaWxpdHlOYW1lIGluIHRoaXMuYWJpbGl0aWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBYmlsaXR5ICR7YWJpbGl0eU5hbWV9IGhhc24ndCBiZWVuIGxvYWRlZCBmb3IgJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWJpbGl0aWVzW2FiaWxpdHlOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7QmFzZU1vZGVsfSBTZWxmXG4gICAqIEB0aGlzIHtTZWxmfVxuICAgKiBAcmV0dXJucyB7U2VsZn1cbiAgICovXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge25ldyAoLi4uYXJnczogYW55W10pID0+IFNlbGZ9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IGNsb25lID0gbmV3IE1vZGVsQ2xhc3MoKVxuXG4gICAgY2xvbmUuYWJpbGl0aWVzID0gey4uLnRoaXMuYWJpbGl0aWVzfVxuICAgIGNsb25lLm1vZGVsRGF0YSA9IHsuLi50aGlzLm1vZGVsRGF0YX1cbiAgICBjbG9uZS5yZWxhdGlvbnNoaXBzID0gey4uLnRoaXMucmVsYXRpb25zaGlwc31cbiAgICBjbG9uZS5yZWxhdGlvbnNoaXBzQ2FjaGUgPSB7Li4udGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGV9XG5cbiAgICByZXR1cm4gY2xvbmVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyIHwgc3RyaW5nfSAqL1xuICBjYWNoZUtleSgpIHtcbiAgICBpZiAodGhpcy5pc1BlcnNpc3RlZCgpKSB7XG4gICAgICBjb25zdCBrZXlQYXJ0cyA9IFtcbiAgICAgICAgdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5LFxuICAgICAgICB0aGlzLnByaW1hcnlLZXkoKVxuICAgICAgXVxuXG4gICAgICBpZiAoXCJ1cGRhdGVkX2F0XCIgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBjb25zdCB1cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdCgpXG5cbiAgICAgICAgaWYgKHR5cGVvZiB1cGRhdGVkQXQgIT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdXBkYXRlZEF0IHdhc24ndCBhbiBvYmplY3Q6ICR7dHlwZW9mIHVwZGF0ZWRBdH1gKVxuICAgICAgICB9IGVsc2UgaWYgKCEoXCJnZXRUaW1lXCIgaW4gdXBkYXRlZEF0KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdXBkYXRlZEF0IGRpZG4ndCBzdXBwb3J0IGdldFRpbWUgd2l0aCBjbGFzczogJHt1cGRhdGVkQXQuY29uc3RydWN0b3IgJiYgdXBkYXRlZEF0LmNvbnN0cnVjdG9yLm5hbWV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAga2V5UGFydHMucHVzaChgdXBkYXRlZEF0LSR7dGhpcy51cGRhdGVkQXQoKS5nZXRUaW1lKCl9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGtleVBhcnRzLmpvaW4oXCItXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnVuaXF1ZUtleSgpXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIGxvY2FsQ2FjaGVLZXkoKSB7XG4gICAgY29uc3QgY2FjaGVLZXlHZW5lcmF0b3IgPSBuZXcgQ2FjaGVLZXlHZW5lcmF0b3IodGhpcylcblxuICAgIHJldHVybiBjYWNoZUtleUdlbmVyYXRvci5sb2NhbCgpXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgZnVsbENhY2hlS2V5KCkge1xuICAgIGNvbnN0IGNhY2hlS2V5R2VuZXJhdG9yID0gbmV3IENhY2hlS2V5R2VuZXJhdG9yKHRoaXMpXG5cbiAgICByZXR1cm4gY2FjaGVLZXlHZW5lcmF0b3IuY2FjaGVLZXkoKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEJhc2VNb2RlbH0gTUNcbiAgICogQHRoaXMge01DfVxuICAgKiBAcmV0dXJucyB7Q29sbGVjdGlvbjxNQz59XG4gICAqL1xuICBzdGF0aWMgYWxsKCkge1xuICAgIHJldHVybiB0aGlzLnJhbnNhY2soKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge1Byb21pc2U8e1xuICAgKiAgIG1vZGVsOiBCYXNlTW9kZWwsXG4gICAqICAgcmVzcG9uc2U6IG9iamVjdFxuICAgKiB9Pn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShhdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgaWYgKGF0dHJpYnV0ZXMpIHRoaXMuYXNzaWduQXR0cmlidXRlcyhhdHRyaWJ1dGVzKVxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgbW9kZWxEYXRhID0gdGhpcy5nZXRBdHRyaWJ1dGVzKClcbiAgICBjb25zdCBkYXRhVG9Vc2UgPSB7fVxuICAgIGRhdGFUb1VzZVtwYXJhbUtleV0gPSBtb2RlbERhdGFcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LWNyZWF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcImNyZWF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhIHwgUmVjb3JkPHN0cmluZywgYW55Pn0gcmF3RGF0YVxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gICAqL1xuICBhc3luYyBjcmVhdGVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb2JqZWN0RGF0YSA9IEJhc2VNb2RlbC5fb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucylcblxuICAgIGxldCByZXNwb25zZVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICAgIHtcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBzYXZlOiBvYmplY3REYXRhXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LWNyZWF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcImNyZWF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIHttb2RlbDogdGhpcywgcmVzcG9uc2V9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8e21vZGVsOiBCYXNlTW9kZWwsIHJlc3BvbnNlOiBvYmplY3R9Pn0gKi9cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAge1xuICAgICAgICBhcmdzOiB7cXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpfSxcbiAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS1kZXN0cm95YCxcbiAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgIHR5cGU6IFwiZGVzdHJveVwiXG4gICAgICB9LFxuICAgICAge31cbiAgICApXG5cbiAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbERhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZW5zdXJlQWJpbGl0aWVzKGxpc3RPZkFiaWxpdGllcykge1xuICAgIC8vIFBvcHVsYXRlIGFuIGFycmF5IHdpdGggYSBsaXN0IG9mIGFiaWxpdGllcyBjdXJyZW50bHkgbm90IGxvYWRlZFxuICAgIGNvbnN0IGFiaWxpdGllc1RvTG9hZCA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGFiaWxpdHlJbkxpc3Qgb2YgbGlzdE9mQWJpbGl0aWVzKSB7XG4gICAgICBpZiAoIShhYmlsaXR5SW5MaXN0IGluIHRoaXMuYWJpbGl0aWVzKSkge1xuICAgICAgICBhYmlsaXRpZXNUb0xvYWQucHVzaChhYmlsaXR5SW5MaXN0KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgdGhlIG1pc3NpbmcgYWJpbGl0aWVzIGlmIGFueVxuICAgIGlmIChhYmlsaXRpZXNUb0xvYWQubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcHJpbWFyeUtleU5hbWUgPSB0aGlzLm1vZGVsQ2xhc3MoKS5wcmltYXJ5S2V5KClcbiAgICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSB7fVxuICAgICAgcmFuc2Fja1BhcmFtc1tgJHtwcmltYXJ5S2V5TmFtZX1fZXFgXSA9IHRoaXMucHJpbWFyeUtleSgpXG5cbiAgICAgIGNvbnN0IGFiaWxpdGllc1BhcmFtcyA9IHt9XG4gICAgICBhYmlsaXRpZXNQYXJhbXNbZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKV0gPSBhYmlsaXRpZXNUb0xvYWRcblxuICAgICAgY29uc3QgYW5vdGhlck1vZGVsID0gYXdhaXQgdGhpcy5tb2RlbENsYXNzKClcbiAgICAgICAgLnJhbnNhY2socmFuc2Fja1BhcmFtcylcbiAgICAgICAgLmFiaWxpdGllcyhhYmlsaXRpZXNQYXJhbXMpXG4gICAgICAgIC5maXJzdCgpXG5cbiAgICAgIGlmICghYW5vdGhlck1vZGVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvb2sgdXAgdGhlIHNhbWUgbW9kZWwgJHt0aGlzLnByaW1hcnlLZXkoKX0gd2l0aCBhYmlsaXRpZXM6ICR7YWJpbGl0aWVzVG9Mb2FkLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdBYmlsaXRpZXMgPSBhbm90aGVyTW9kZWwuYWJpbGl0aWVzXG4gICAgICBmb3IgKGNvbnN0IG5ld0FiaWxpdHkgaW4gbmV3QWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMuYWJpbGl0aWVzW25ld0FiaWxpdHldID0gbmV3QWJpbGl0aWVzW25ld0FiaWxpdHldXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICAgKi9cbiAgZ2V0QXR0cmlidXRlcygpIHsgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5tb2RlbERhdGEsIHRoaXMuY2hhbmdlcykgfVxuYXNkXG4gIGhhbmRsZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfSlcbiAgICB0aHJvdyBuZXcgQ3VzdG9tRXJyb3IoXCJSZXNwb25zZSB3YXNuJ3Qgc3VjY2Vzc2Z1bFwiLCB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgc3RyaW5nfVxuICAgKi9cbiAgaWRlbnRpZmllcktleSgpIHtcbiAgICBpZiAoIXRoaXMuX2lkZW50aWZpZXJLZXkpIHRoaXMuX2lkZW50aWZpZXJLZXkgPSB0aGlzLmlzUGVyc2lzdGVkKCkgPyB0aGlzLnByaW1hcnlLZXkoKSA6IHRoaXMudW5pcXVlS2V5KClcblxuICAgIHJldHVybiB0aGlzLl9pZGVudGlmaWVyS2V5XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0Fzc29jaWF0aW9uTG9hZGVkKGFzc29jaWF0aW9uTmFtZSkgeyByZXR1cm4gdGhpcy5pc0Fzc29jaWF0aW9uTG9hZGVkVW5kZXJzY29yZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXNzb2NpYXRpb25OYW1lKSkgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlIChhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlKSB7XG4gICAgaWYgKGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0Fzc29jaWF0aW9uUHJlc2VudChhc3NvY2lhdGlvbk5hbWUpIHtcbiAgICBpZiAodGhpcy5pc0Fzc29jaWF0aW9uTG9hZGVkKGFzc29jaWF0aW9uTmFtZSkpIHJldHVybiB0cnVlXG4gICAgaWYgKGFzc29jaWF0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHthbnl9IGFyZ3MuZXJyb3JcbiAgICogQHBhcmFtIHtCYXNlTW9kZWx9IFthcmdzLm1vZGVsXVxuICAgKiBAcGFyYW0ge1BhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnN9IGFyZ3Mub3B0aW9uc1xuICAgKi9cbiAgc3RhdGljIHBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsLCBvcHRpb25zfSkge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSkgcmV0dXJuXG4gICAgaWYgKCFlcnJvci5hcmdzLnJlc3BvbnNlLnZhbGlkYXRpb25fZXJyb3JzKSByZXR1cm5cblxuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSBuZXcgVmFsaWRhdGlvbkVycm9ycyh7XG4gICAgICBtb2RlbCxcbiAgICAgIHZhbGlkYXRpb25FcnJvcnM6IGRpZ2coZXJyb3IsIFwiYXJnc1wiLCBcInJlc3BvbnNlXCIsIFwidmFsaWRhdGlvbl9lcnJvcnNcIilcbiAgICB9KVxuXG4gICAgQmFzZU1vZGVsLnNlbmRWYWxpZGF0aW9uRXJyb3JzRXZlbnQodmFsaWRhdGlvbkVycm9ycywgb3B0aW9ucylcblxuICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnRocm93VmFsaWRhdGlvbkVycm9yICE9IGZhbHNlKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBodW1hbkF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGtleU5hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJpMThuS2V5XCIpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgY29uc3QgaTE4biA9IENvbmZpZy5nZXRJMThuKClcblxuICAgIGlmIChpMThuKSByZXR1cm4gaTE4bi50KGBhY3RpdmVyZWNvcmQuYXR0cmlidXRlcy4ke2tleU5hbWV9LiR7QmFzZU1vZGVsLnNuYWtlQ2FzZShhdHRyaWJ1dGVOYW1lKX1gLCB7ZGVmYXVsdFZhbHVlOiBhdHRyaWJ1dGVOYW1lfSlcblxuICAgIHJldHVybiBpbmZsZWN0aW9uLmh1bWFuaXplKGF0dHJpYnV0ZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0F0dHJpYnV0ZUNoYW5nZWQoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzLmZpbmQoKGF0dHJpYnV0ZSkgPT4gZGlnZyhhdHRyaWJ1dGUsIFwibmFtZVwiKSA9PSBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghYXR0cmlidXRlRGF0YSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gZGlnZyhhdHRyaWJ1dGUsIFwibmFtZVwiKSlcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGFuIGF0dHJpYnV0ZSBieSB0aGF0IG5hbWU6IFwiJHthdHRyaWJ1dGVOYW1lfVwiIGluOiAke2F0dHJpYnV0ZU5hbWVzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGlmICghKGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlIGluIHRoaXMuY2hhbmdlcykpXG4gICAgICByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmNoYW5nZXNbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgY2hhbmdlZE1ldGhvZCA9IHRoaXNbYF9pcyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGVEYXRhLnR5cGUsIHRydWUpfUNoYW5nZWRgXVxuXG4gICAgaWYgKCFjaGFuZ2VkTWV0aG9kKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdHlwZTogJHthdHRyaWJ1dGVEYXRhLnR5cGV9YClcblxuICAgIHJldHVybiBjaGFuZ2VkTWV0aG9kKG9sZFZhbHVlLCBuZXdWYWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQ2hhbmdlZCgpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5jaGFuZ2VzKVxuXG4gICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNOZXdSZWNvcmQoKSB7XG4gICAgaWYgKHRoaXMubmV3UmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5ld1JlY29yZFxuICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHRoaXMubW9kZWxEYXRhICYmIHRoaXMubW9kZWxEYXRhLmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc1BlcnNpc3RlZCgpIHsgcmV0dXJuICF0aGlzLmlzTmV3UmVjb3JkKCkgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc25ha2VDYXNlKHN0cmluZykgeyByZXR1cm4gaW5mbGVjdGlvbi51bmRlcnNjb3JlKHN0cmluZykgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNhdmVkQ2hhbmdlVG9BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmICghdGhpcy5wcmV2aW91c01vZGVsRGF0YSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSA9PSBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghYXR0cmlidXRlRGF0YSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5wcmV2aW91c01vZGVsRGF0YSkpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnByZXZpb3VzTW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlXVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgY2hhbmdlZE1ldGhvZE5hbWUgPSBgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSl9Q2hhbmdlZGBcbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tjaGFuZ2VkTWV0aG9kTmFtZV1cblxuICAgIGlmICghY2hhbmdlZE1ldGhvZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHR5cGU6ICR7YXR0cmlidXRlRGF0YS50eXBlfWApXG5cbiAgICByZXR1cm4gY2hhbmdlZE1ldGhvZChvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCYXNlTW9kZWx9IG1vZGVsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TmV3TW9kZWwobW9kZWwpIHtcbiAgICB0aGlzLnNldE5ld01vZGVsRGF0YShtb2RlbClcblxuICAgIGZvcihjb25zdCByZWxhdGlvbnNoaXBOYW1lIGluIG1vZGVsLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG1vZGVsLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cbiAgICB9XG5cbiAgICBmb3IoY29uc3QgcmVsYXRpb25zaGlwQ2FjaGVOYW1lIGluIG1vZGVsLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwQ2FjaGVOYW1lXSA9IG1vZGVsLnJlbGF0aW9uc2hpcHNDYWNoZVtuYW1lXVxuICAgIH1cbiAgfVxuXG4gIHNldE5ld01vZGVsRGF0YShtb2RlbCkge1xuICAgIGlmICghKFwibW9kZWxEYXRhXCIgaW4gbW9kZWwpKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG1vZGVsRGF0YSBpbiBtb2RlbDogJHtKU09OLnN0cmluZ2lmeShtb2RlbCl9YClcblxuICAgIHRoaXMucHJldmlvdXNNb2RlbERhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkaWdnKHRoaXMsIFwibW9kZWxEYXRhXCIpKVxuXG4gICAgZm9yKGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gbW9kZWwubW9kZWxEYXRhKSB7XG4gICAgICB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXSA9IG1vZGVsLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIH1cbiAgfVxuXG4gIF9pc0RhdGVDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgIGlmIChEYXRlLnBhcnNlKG9sZFZhbHVlKSAhPSBEYXRlLnBhcnNlKG5ld1ZhbHVlKSlcbiAgICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBfaXNJbnRlZ2VyQ2hhbmdlZChvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICBpZiAocGFyc2VJbnQob2xkVmFsdWUsIDEwKSAhPSBwYXJzZUludChuZXdWYWx1ZSwgMTApKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIF9pc1N0cmluZ0NoYW5nZWQgKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgIGNvbnN0IG9sZENvbnZlcnRlZFZhbHVlID0gYCR7b2xkVmFsdWV9YFxuICAgIGNvbnN0IG5ld0NvbnZlcnRlZFZhbHVlID0gYCR7bmV3VmFsdWV9YFxuXG4gICAgaWYgKG9sZENvbnZlcnRlZFZhbHVlICE9IG5ld0NvbnZlcnRlZFZhbHVlKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7TW9kZWxDbGFzc0RhdGFUeXBlfSAqL1xuICBtb2RlbENsYXNzRGF0YSgpIHsgcmV0dXJuIHRoaXMubW9kZWxDbGFzcygpLm1vZGVsQ2xhc3NEYXRhKCkgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlbG9hZCgpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpXG4gICAgY29uc3QgcmFuc2Fja1BhcmFtcyA9IHt9XG4gICAgcmFuc2Fja1BhcmFtc1tgJHt0aGlzLm1vZGVsQ2xhc3MoKS5wcmltYXJ5S2V5KCl9X2VxYF0gPSB0aGlzLnByaW1hcnlLZXkoKVxuXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5tb2RlbENsYXNzKCkucmFuc2FjayhyYW5zYWNrUGFyYW1zKVxuXG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgaWYgKHBhcmFtcy5wcmVsb2FkKSB7XG4gICAgICAgIHF1ZXJ5LnF1ZXJ5QXJncy5wcmVsb2FkID0gcGFyYW1zLnByZWxvYWRcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5zZWxlY3QpIHtcbiAgICAgICAgcXVlcnkucXVlcnlBcmdzLnNlbGVjdCA9IHBhcmFtcy5zZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5zZWxlY3RfY29sdW1ucykge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3Muc2VsZWN0Q29sdW1ucyA9IHBhcmFtcy5zZWxlY3RfY29sdW1uc1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgcXVlcnkuZmlyc3QoKVxuICAgIHRoaXMuc2V0TmV3TW9kZWwobW9kZWwpXG4gICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U/OiBvYmplY3R9Pn1cbiAgICovXG4gIHNhdmUoKSB7XG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8e21vZGVsOiBCYXNlTW9kZWwsIHJlc3BvbnNlOiBvYmplY3R9Pn1cbiAgICovXG4gIHNhdmVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJhdyhyYXdEYXRhLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtuZXdBdHRyaWJ1dGVzXVxuICAgKiBAcGFyYW0ge1BhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnN9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7XG4gICAqICAgbW9kZWw6IEJhc2VNb2RlbCxcbiAgICogICByZXNwb25zZT86IG9iamVjdFxuICAgKiB9Pn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShuZXdBdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgaWYgKG5ld0F0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuYXNzaWduQXR0cmlidXRlcyhuZXdBdHRyaWJ1dGVzKVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4ge21vZGVsOiB0aGlzfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgbW9kZWxEYXRhID0gdGhpcy5jaGFuZ2VzXG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHF1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKSxcbiAgICAgICAgICAgIHNhdmU6IGRhdGFUb1VzZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS11cGRhdGVgLFxuICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIlxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWw6IHRoaXMsIG9wdGlvbnN9KVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbEZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtyZXNwb25zZSwgbW9kZWw6IHRoaXN9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICBfcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgbGV0IG5ld01vZGVsID0gZGlnZyhyZXNwb25zZSwgXCJtb2RlbFwiKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3TW9kZWwpKSBuZXdNb2RlbCA9IG5ld01vZGVsWzBdXG5cbiAgICB0aGlzLnNldE5ld01vZGVsKG5ld01vZGVsKVxuICB9XG5cbiAgX3JlZnJlc2hNb2RlbERhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBsZXQgbmV3TW9kZWwgPSBkaWdnKHJlc3BvbnNlLCBcIm1vZGVsXCIpXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdNb2RlbCkpIG5ld01vZGVsID0gbmV3TW9kZWxbMF1cblxuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG5ld01vZGVsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGEgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSByYXdEYXRhXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICAgKi9cbiAgc3RhdGljIF9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YShyYXdEYXRhLCBvcHRpb25zKSB7XG4gICAgaWYgKHJhd0RhdGEgaW5zdGFuY2VvZiBGb3JtRGF0YSB8fCByYXdEYXRhLm5vZGVOYW1lID09IFwiRk9STVwiKSB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IEZvcm1EYXRhT2JqZWN0aXplci5mb3JtRGF0YUZyb21PYmplY3QocmF3RGF0YSwgb3B0aW9ucylcblxuICAgICAgcmV0dXJuIEZvcm1EYXRhT2JqZWN0aXplci50b09iamVjdChmb3JtRGF0YSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmF3RGF0YVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IG9iamVjdERhdGEgPSBCYXNlTW9kZWwuX29iamVjdERhdGFGcm9tR2l2ZW5SYXdEYXRhKHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHF1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKSxcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGEsXG4gICAgICAgICAgICBzaW1wbGVfbW9kZWxfZXJyb3JzOiBvcHRpb25zPy5zaW1wbGVNb2RlbEVycm9yc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS11cGRhdGVgLFxuICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIlxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWw6IHRoaXMsIG9wdGlvbnN9KVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbEZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtyZXNwb25zZSwgbW9kZWw6IHRoaXN9XG4gIH1cblxuICBpc1ZhbGlkKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZCB5ZXRcIilcbiAgfVxuXG4gIGFzeW5jIGlzVmFsaWRPblNlcnZlcigpIHtcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmdldEF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAge1xuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgIH0sXG4gICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tdmFsaWRgLFxuICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgdHlwZTogXCJ2YWxpZFwiXG4gICAgICB9LFxuICAgICAge31cbiAgICApXG5cbiAgICByZXR1cm4ge3ZhbGlkOiByZXNwb25zZS52YWxpZCwgZXJyb3JzOiByZXNwb25zZS5lcnJvcnN9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtCYXNlTW9kZWx9IFNlbGZcbiAgICogQHRoaXMge1NlbGZ9XG4gICAqIEByZXR1cm5zIHt0eXBlb2YgQmFzZU1vZGVsICYgKG5ldyAoLi4uYXJnczogYW55W10pID0+IFNlbGYpfVxuICAgKi9cbiAgbW9kZWxDbGFzcygpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICB9XG5cbiAgcHJlbG9hZFJlbGF0aW9uc2hpcChyZWxhdGlvbnNoaXBOYW1lLCBtb2RlbCkge1xuICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW0Jhc2VNb2RlbC5zbmFrZUNhc2UocmVsYXRpb25zaGlwTmFtZSldID0gbW9kZWxcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNbQmFzZU1vZGVsLnNuYWtlQ2FzZShyZWxhdGlvbnNoaXBOYW1lKV0gPSBtb2RlbFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgbWFya0ZvckRlc3RydWN0aW9uKCkge1xuICAgIHRoaXMuX21hcmtlZEZvckRlc3RydWN0aW9uID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgbWFya2VkRm9yRGVzdHJ1Y3Rpb24oKSB7IHJldHVybiB0aGlzLl9tYXJrZWRGb3JEZXN0cnVjdGlvbiB8fCBmYWxzZSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICB1bmlxdWVLZXkoKSB7XG4gICAgaWYgKCF0aGlzLnVuaXF1ZUtleVZhbHVlKSB7XG4gICAgICBjb25zdCBtaW4gPSA1MDAwMDAwMDAwMDAwMDAwXG4gICAgICBjb25zdCBtYXggPSA5MDA3MTk5MjU0NzQwOTkxXG4gICAgICBjb25zdCByYW5kb21CZXR3ZWVuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKVxuICAgICAgdGhpcy51bmlxdWVLZXlWYWx1ZSA9IHJhbmRvbUJldHdlZW5cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51bmlxdWVLZXlWYWx1ZVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIF9jYWxsQ29sbGVjdGlvbkNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBmb3JtT3JEYXRhT2JqZWN0ID0gYXJncy5hcmdzXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKGFyZ3MsIGNvbW1hbmRBcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsZXQgZm9ybVxuXG4gICAgICBpZiAoY29tbWFuZEFyZ3MuZm9ybSkge1xuICAgICAgICBmb3JtID0gY29tbWFuZEFyZ3MuZm9ybVxuICAgICAgfSBlbHNlIGlmIChmb3JtT3JEYXRhT2JqZWN0Py5ub2RlTmFtZSA9PSBcIkZPUk1cIikge1xuICAgICAgICBmb3JtID0gZm9ybU9yRGF0YU9iamVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybSkgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG9wdGlvbnM6IHtmb3JtfX0pXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgX2NhbGxNZW1iZXJDb21tYW5kID0gKGFyZ3MsIGNvbW1hbmRBcmdzKSA9PiBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChhcmdzLCBjb21tYW5kQXJncylcblxuICBzdGF0aWMgX3Bvc3REYXRhRnJvbUFyZ3MoYXJncykge1xuICAgIGxldCBwb3N0RGF0YVxuXG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIGlmIChhcmdzIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgcG9zdERhdGEgPSBhcmdzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3N0RGF0YSA9IG9iamVjdFRvRm9ybURhdGEuc2VyaWFsaXplKGFyZ3MsIHt9LCBudWxsLCBcImFyZ3NcIilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcG9zdERhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIH1cblxuICAgIHJldHVybiBwb3N0RGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICByZWFkQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgcmV0dXJuIHRoaXMucmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiB0aGlzLmNoYW5nZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZXNbYXR0cmlidXRlTmFtZV1cbiAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGlzIGlzIGEgbmV3IHJlY29yZCBhbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGEgcmVjb2duaXplZCBhdHRyaWJ1dGVcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJhdHRyaWJ1dGVzXCIpXG5cbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNQZXJzaXN0ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZU5vdExvYWRlZEVycm9yKGBObyBzdWNoIGF0dHJpYnV0ZTogJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSMke2F0dHJpYnV0ZU5hbWV9OiAke0pTT04uc3RyaW5naWZ5KHRoaXMubW9kZWxEYXRhKX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXR0cmlidXRlTG9hZGVkKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlIGluIHRoaXMuY2hhbmdlcykgcmV0dXJuIHRydWVcbiAgICBpZiAoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5tb2RlbERhdGEpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBfaXNQcmVzZW50KHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5tYXRjaCgvXlxccyokLykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBhc3luYyBfbG9hZEJlbG9uZ3NUb1JlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IENvbGxlY3Rpb24oYXJncywgcXVlcnlBcmdzKVxuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCBjb2xsZWN0aW9uLmZpcnN0KClcbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxcbiAgICAgIHJldHVybiBtb2RlbFxuICAgIH1cbiAgfVxuXG4gIF9yZWFkQmVsb25nc1RvUmVmbGVjdGlvbih7cmVmbGVjdGlvbk5hbWV9KSB7XG4gICAgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1tyZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVmbGVjdGlvbk5hbWVdXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcHMgPSBPYmplY3Qua2V5cyh0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSlcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcblxuICAgIHRocm93IG5ldyBOb3RMb2FkZWRFcnJvcihgJHttb2RlbENsYXNzTmFtZX0jJHtyZWZsZWN0aW9uTmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIHlldC4gT25seSB0aGVzZSB3ZXJlIGxvYWRlZDogJHtsb2FkZWRSZWxhdGlvbnNoaXBzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0fSBBc3NvY01DXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLkNvbGxlY3Rpb25BcmdzVHlwZTxBc3NvY01DPn0gYXJnc1xuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5RdWVyeUFyZ3NUeXBlfSBxdWVyeUFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8SW5zdGFuY2VUeXBlPEFzc29jTUM+Pj59XG4gICAqL1xuICBhc3luYyBfbG9hZEhhc01hbnlSZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IENvbGxlY3Rpb24oYXJncywgcXVlcnlBcmdzKVxuICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IGNvbGxlY3Rpb24udG9BcnJheSgpXG5cbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXSA9IG1vZGVsc1xuXG4gICAgcmV0dXJuIG1vZGVsc1xuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0fSBBc3NvY01DXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLkNvbGxlY3Rpb25BcmdzVHlwZTxBc3NvY01DPn0gYXJnc1xuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5RdWVyeUFyZ3NUeXBlfSBxdWVyeUFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPEFzc29jTUM+Pn1cbiAgICovXG4gIGFzeW5jIF9sb2FkSGFzT25lUmVmbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MgPSB7fSkge1xuICAgIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1thcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MpXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IGNvbGxlY3Rpb24uZmlyc3QoKVxuXG4gICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXSA9IG1vZGVsXG5cbiAgICAgIHJldHVybiBtb2RlbFxuICAgIH1cbiAgfVxuXG4gIF9yZWFkSGFzT25lUmVmbGVjdGlvbih7cmVmbGVjdGlvbk5hbWV9KSB7XG4gICAgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1tyZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVmbGVjdGlvbk5hbWVdXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZWRSZWxhdGlvbnNoaXBzID0gT2JqZWN0LmtleXModGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpXG4gICAgY29uc3QgbW9kZWxDbGFzc05hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG5cbiAgICB0aHJvdyBuZXcgTm90TG9hZGVkRXJyb3IoYCR7bW9kZWxDbGFzc05hbWV9IyR7cmVmbGVjdGlvbk5hbWV9IGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQuIE9ubHkgdGhlc2Ugd2VyZSBsb2FkZWQ6ICR7bG9hZGVkUmVsYXRpb25zaGlwcy5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIF9yZWFkTW9kZWxEYXRhRnJvbUFyZ3MoYXJncykge1xuICAgIHRoaXMuYWJpbGl0aWVzID0gYXJncy5kYXRhLmIgfHwge31cbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBhcmdzLmNvbGxlY3Rpb25cbiAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzLmRhdGEuYSlcbiAgICB0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMgPSBhcmdzLmRhdGEuclxuICB9XG5cbiAgX3JlYWRQcmVsb2FkZWRSZWxhdGlvbnNoaXBzKHByZWxvYWRlZCkge1xuICAgIGlmICghdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmVsYXRpb25zaGlwc1wiKVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIGluIHRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwRGF0YSA9IHRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwQ2xhc3NEYXRhID0gcmVsYXRpb25zaGlwcy5maW5kKChyZWxhdGlvbnNoaXApID0+IGRpZ2cocmVsYXRpb25zaGlwLCBcIm5hbWVcIikgPT0gcmVsYXRpb25zaGlwTmFtZSlcblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBDbGFzc0RhdGEpIHtcbiAgICAgICAgY29uc3QgbW9kZWxOYW1lID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKVxuICAgICAgICBjb25zdCByZWxhdGlvbnNoaXBzTGlzdCA9IHJlbGF0aW9uc2hpcHMubWFwKChyZWxhdGlvbnNoaXApID0+IHJlbGF0aW9uc2hpcC5uYW1lKS5qb2luKFwiLCBcIilcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHRoZSByZWxhdGlvbiAke3JlbGF0aW9uc2hpcE5hbWV9IG9uIHRoZSAke21vZGVsTmFtZX0gbW9kZWw6ICR7cmVsYXRpb25zaGlwc0xpc3R9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwVHlwZSA9IGRpZ2cocmVsYXRpb25zaGlwQ2xhc3NEYXRhLCBcImNvbGxlY3Rpb25OYW1lXCIpXG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXBOYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtyZWxhdGlvbnNoaXBOYW1lfSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZGApXG4gICAgICB9XG5cbiAgICAgIGlmICghcmVsYXRpb25zaGlwQ2xhc3NEYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcmVsYXRpb25zaGlwIG9uICR7ZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKX0gYnkgdGhhdCBuYW1lOiAke3JlbGF0aW9uc2hpcE5hbWV9YClcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBEYXRhKSB7XG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdID0gbnVsbFxuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV0gPSBudWxsXG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVsYXRpb25zaGlwRGF0YSkpIHtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0gPSBbXVxuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV0gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwSWQgb2YgcmVsYXRpb25zaGlwRGF0YSkge1xuICAgICAgICAgIGNvbnN0IG1vZGVsID0gcHJlbG9hZGVkLmdldE1vZGVsKHJlbGF0aW9uc2hpcFR5cGUsIHJlbGF0aW9uc2hpcElkKVxuXG4gICAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0ucHVzaChtb2RlbClcbiAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV0ucHVzaChtb2RlbClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwcmVsb2FkZWQuZ2V0TW9kZWwocmVsYXRpb25zaGlwVHlwZSwgcmVsYXRpb25zaGlwRGF0YSlcblxuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXSA9IG1vZGVsXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG1vZGVsXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8c3RyaW5nfVxuICAgKi9cbiAgcHJpbWFyeUtleSgpIHsgcmV0dXJuIHRoaXMucmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUodGhpcy5tb2RlbENsYXNzKCkucHJpbWFyeUtleSgpKSB9XG59XG4iXX0=
|