@colijnit/sharedcomponents 1.0.62 → 1.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/bundles/colijnit-sharedcomponents.umd.js +9888 -9855
- package/bundles/colijnit-sharedcomponents.umd.js.map +1 -1
- package/colijnit-sharedcomponents.d.ts +91 -91
- package/colijnit-sharedcomponents.metadata.json +1 -1
- package/esm2015/colijnit-sharedcomponents.js +91 -91
- package/esm2015/lib/assets/dictionary/text.properties.js +11 -11
- package/esm2015/lib/businessobject/build-images-and-documentation-result.js +2 -2
- package/esm2015/lib/businessobject/co-document-right.bo.js +3 -3
- package/esm2015/lib/businessobject/drag-drop-container-element.js +2 -2
- package/esm2015/lib/businessobject/drag-drop-container.js +7 -7
- package/esm2015/lib/components/activity-list/activity-list.component.js +130 -130
- package/esm2015/lib/components/activity-list/activity-list.module.js +24 -24
- package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.component.js +47 -47
- package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.module.js +20 -20
- package/esm2015/lib/components/date-planning/component/agenda/agenda-base-view.component.js +61 -61
- package/esm2015/lib/components/date-planning/component/agenda/agenda-day-view.component.js +36 -36
- package/esm2015/lib/components/date-planning/component/agenda/agenda-event.component.js +56 -56
- package/esm2015/lib/components/date-planning/component/agenda/agenda-events.component.js +47 -47
- package/esm2015/lib/components/date-planning/component/agenda/agenda-half-hour-cell.component.js +68 -68
- package/esm2015/lib/components/date-planning/component/agenda/agenda-header.component.js +243 -243
- package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-cell.component.js +36 -36
- package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-view-labels.component.js +50 -50
- package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-view.component.js +46 -46
- package/esm2015/lib/components/date-planning/component/agenda/agenda-month-view.component.js +61 -61
- package/esm2015/lib/components/date-planning/component/agenda/agenda-select-event.component.js +39 -39
- package/esm2015/lib/components/date-planning/component/agenda/agenda-view.component.js +35 -35
- package/esm2015/lib/components/date-planning/component/agenda/agenda-week-select-view.component.js +64 -64
- package/esm2015/lib/components/date-planning/component/agenda/agenda-week-view.component.js +48 -48
- package/esm2015/lib/components/date-planning/component/agenda/view-select.component.js +42 -42
- package/esm2015/lib/components/date-planning/component/calendar/calendar-all-months.component.js +34 -34
- package/esm2015/lib/components/date-planning/component/calendar/calendar-all-years.component.js +48 -48
- package/esm2015/lib/components/date-planning/component/calendar/calendar-header.component.js +107 -107
- package/esm2015/lib/components/date-planning/component/calendar/calendar-view.component.js +178 -178
- package/esm2015/lib/components/date-planning/component/calendar/calendar.component.js +34 -34
- package/esm2015/lib/components/date-planning/date-planning.component.js +113 -113
- package/esm2015/lib/components/date-planning/date-planning.module.js +63 -63
- package/esm2015/lib/components/docsign/component/signature/signature.component.js +75 -75
- package/esm2015/lib/components/docsign/component/signatures/signatures.component.js +44 -44
- package/esm2015/lib/components/docsign/docsign.component.js +242 -242
- package/esm2015/lib/components/docsign/docsign.module.js +23 -23
- package/esm2015/lib/components/file-upload/file-upload.component.js +189 -189
- package/esm2015/lib/components/file-upload/file-upload.module.js +25 -25
- package/esm2015/lib/components/file-upload-popup/file-upload-popup.component.js +397 -397
- package/esm2015/lib/components/file-upload-popup/file-upload-popup.module.js +30 -30
- package/esm2015/lib/components/files-upload/components/base-file-upload.component.js +469 -469
- package/esm2015/lib/components/files-upload/components/drag-drop-container.component.js +115 -115
- package/esm2015/lib/components/files-upload/files-upload.component.js +131 -131
- package/esm2015/lib/components/files-upload/files-upload.module.js +47 -47
- package/esm2015/lib/components/image-display/image-display.component.js +36 -36
- package/esm2015/lib/components/image-display/image-display.module.js +23 -23
- package/esm2015/lib/components/key-pad/key-pad.component.js +200 -200
- package/esm2015/lib/components/key-pad/key-pad.module.js +22 -22
- package/esm2015/lib/components/layout-switcher/layout-switcher.component.js +74 -74
- package/esm2015/lib/components/layout-switcher/layout-switcher.module.js +21 -21
- package/esm2015/lib/components/linear-gauge/co-linear-gauge.component.js +59 -59
- package/esm2015/lib/components/linear-gauge/co-linear-gauge.module.js +19 -19
- package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.component.js +89 -89
- package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.module.js +21 -21
- package/esm2015/lib/components/send-method-dialog/components/layout-selection/layout-selection.component.js +79 -79
- package/esm2015/lib/components/send-method-dialog/components/layout-selection/layout-selection.module.js +21 -21
- package/esm2015/lib/components/send-method-dialog/components/printer-selection/printer-selection.component.js +85 -85
- package/esm2015/lib/components/send-method-dialog/components/printer-selection/printer-selection.module.js +21 -21
- package/esm2015/lib/components/send-method-dialog/components/send-method-email/send-method-email.component.js +64 -64
- package/esm2015/lib/components/send-method-dialog/components/send-method-email/send-method-email.module.js +26 -26
- package/esm2015/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.component.js +40 -40
- package/esm2015/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.module.js +23 -23
- package/esm2015/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.component.js +61 -61
- package/esm2015/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.module.js +28 -28
- package/esm2015/lib/components/send-method-dialog/components/signature-button/signature-button.component.js +38 -38
- package/esm2015/lib/components/send-method-dialog/components/signature-button/signature-button.module.js +21 -21
- package/esm2015/lib/components/send-method-dialog/model/email-address-viewmodel.js +7 -7
- package/esm2015/lib/components/send-method-dialog/send-method-dialog.component.js +258 -258
- package/esm2015/lib/components/send-method-dialog/send-method-dialog.module.js +35 -35
- package/esm2015/lib/components/send-method-dialog/send-method-params.interface.js +2 -2
- package/esm2015/lib/components/send-method-dialog/service/send-method.service.js +59 -59
- package/esm2015/lib/components/simple-tags/simple-tags.component.js +229 -229
- package/esm2015/lib/components/simple-tags/simple-tags.module.js +26 -26
- package/esm2015/lib/components/statusbar/statusbar-popup.component.js +97 -97
- package/esm2015/lib/components/statusbar/statusbar.component.js +81 -81
- package/esm2015/lib/components/statusbar/statusbar.module.js +27 -27
- package/esm2015/lib/components/stock/components/allocation-stock-history/allocation-stock-history.component.js +47 -47
- package/esm2015/lib/components/stock/components/order-commission-stock-history/order-commission-stock-history.component.js +47 -47
- package/esm2015/lib/components/stock/components/order-stock-history/order-stock-history.component.js +47 -47
- package/esm2015/lib/components/stock/components/order-stock-tab/order-stock-tab.component.js +47 -47
- package/esm2015/lib/components/stock/components/order-supply-stock-history/order-supply-stock-history.component.js +47 -47
- package/esm2015/lib/components/stock/components/order-tab/order-tab.component.js +67 -67
- package/esm2015/lib/components/stock/components/stock-history/stock-history.component.js +53 -53
- package/esm2015/lib/components/stock/components/stock-location/stock-location.component.js +251 -240
- package/esm2015/lib/components/stock/components/stock-prognose/stock-prognose.component.js +52 -52
- package/esm2015/lib/components/stock/components/stock-tab/stock-tab.component.js +39 -39
- package/esm2015/lib/components/stock/localization/translation.js +72 -63
- package/esm2015/lib/components/stock/stock-history-tabs/stock-history-tabs.component.js +33 -33
- package/esm2015/lib/components/stock/stock-information/stock-information.component.js +48 -49
- package/esm2015/lib/components/stock/stock-information-grid/stock-information-grid.component.js +457 -457
- package/esm2015/lib/components/stock/stock-tabs/stock-tabs.component.js +243 -243
- package/esm2015/lib/components/stock/stock-transfer/co-drop-down-list-fields.interface.js +2 -2
- package/esm2015/lib/components/stock/stock-transfer/stock-change-amount.component.js +72 -72
- package/esm2015/lib/components/stock/stock-transfer/stock-transfer.component.js +160 -149
- package/esm2015/lib/components/stock/stock.component.js +237 -197
- package/esm2015/lib/components/stock/stock.module.js +80 -80
- package/esm2015/lib/components/stock-statusbar/stock-statusbar.component.js +23 -23
- package/esm2015/lib/components/stock-statusbar/stock-statusbar.module.js +19 -19
- package/esm2015/lib/components/tab-bar/tab-bar.component.js +90 -90
- package/esm2015/lib/components/tab-bar/tab-bar.module.js +21 -21
- package/esm2015/lib/components/tab-bar/tab.interface.js +2 -2
- package/esm2015/lib/components/tile-renderer/tile-render.component.js +80 -80
- package/esm2015/lib/components/tile-renderer/tile-render.module.js +26 -26
- package/esm2015/lib/decorator/input-boolean.decorator.js +34 -34
- package/esm2015/lib/enum/calendar-view.enum.js +9 -9
- package/esm2015/lib/enum/document-email-report.enum.js +18 -18
- package/esm2015/lib/enum/domain-multiple-name.enum.js +13 -13
- package/esm2015/lib/enum/file-type.js +14 -14
- package/esm2015/lib/enum/files-upload-config-objects.js +3 -3
- package/esm2015/lib/enum/gauge-color.enum.js +10 -10
- package/esm2015/lib/enum/icon.enum.js +48 -44
- package/esm2015/lib/enum/internal-param.enum.js +38 -38
- package/esm2015/lib/enum/keyboard-code.enum.js +32 -32
- package/esm2015/lib/enum/language-code.enum.js +8 -8
- package/esm2015/lib/enum/month.enum.js +17 -17
- package/esm2015/lib/enum/read-write-access-config-names.enum.js +2 -2
- package/esm2015/lib/enum/table-name.enum.js +86 -86
- package/esm2015/lib/enum/tag-category.enum.js +22 -22
- package/esm2015/lib/enum/tags-component-config-names.js +2 -2
- package/esm2015/lib/enum/thumb-three-way-state.js +19 -19
- package/esm2015/lib/enum/tile-size-type.js +7 -7
- package/esm2015/lib/enum/time-period.enum.js +11 -11
- package/esm2015/lib/event/co-drag-event.js +2 -2
- package/esm2015/lib/event/co-drop-event.js +2 -2
- package/esm2015/lib/interface/key-value-pair.js +2 -2
- package/esm2015/lib/interface/operation-callback-simple-function.js +4 -4
- package/esm2015/lib/localization/localization.module.js +19 -19
- package/esm2015/lib/localization/localize.pipe.js +26 -26
- package/esm2015/lib/localization/localize.service.js +30 -30
- package/esm2015/lib/localization/translation.js +3 -3
- package/esm2015/lib/model/agenda-event-per-day.model.js +6 -6
- package/esm2015/lib/model/agenda-event.model.js +8 -8
- package/esm2015/lib/model/agenda-null-objects.js +11 -11
- package/esm2015/lib/model/constant/all-months.js +17 -17
- package/esm2015/lib/model/date-range.js +5 -5
- package/esm2015/lib/model/day.model.js +7 -7
- package/esm2015/lib/model/icon-svg.js +47 -43
- package/esm2015/lib/model/month.model.js +11 -11
- package/esm2015/lib/model/send-method.js +8 -8
- package/esm2015/lib/model/settings.js +4 -4
- package/esm2015/lib/model/tag-tree-item.bo.js +16 -16
- package/esm2015/lib/model/time-window.bo.js +26 -26
- package/esm2015/lib/model/tree-object.js +15 -15
- package/esm2015/lib/model/week.model.js +6 -6
- package/esm2015/lib/model/weekday.model.js +10 -10
- package/esm2015/lib/pipe/array-number.pipe.js +15 -15
- package/esm2015/lib/pipe/file-type-image.pipe.js +51 -51
- package/esm2015/lib/pipe/master-pipes.js +9 -9
- package/esm2015/lib/pipe/ucfirst.pipe.js +16 -16
- package/esm2015/lib/service/dictionary.service.js +76 -76
- package/esm2015/lib/service/drag-drop.service.js +365 -365
- package/esm2015/lib/service/icon-cache.service.js +51 -51
- package/esm2015/lib/service/options.service.js +48 -48
- package/esm2015/lib/service/shared-connector.service.js +433 -433
- package/esm2015/lib/service/shared.service.js +60 -60
- package/esm2015/lib/service/stock.service.js +110 -110
- package/esm2015/lib/utils/array-utils.js +202 -202
- package/esm2015/lib/utils/calendar.utils.js +68 -68
- package/esm2015/lib/utils/check-precision-and-scale-result.js +2 -2
- package/esm2015/lib/utils/check-within-stepped-bounds-result.js +2 -2
- package/esm2015/lib/utils/co-document-shared-field-logic.js +50 -50
- package/esm2015/lib/utils/date-utils.js +264 -264
- package/esm2015/lib/utils/enum-utils.js +128 -128
- package/esm2015/lib/utils/function/not-nill.function.js +5 -5
- package/esm2015/lib/utils/is-nill.function.js +5 -5
- package/esm2015/lib/utils/map-utils.js +41 -41
- package/esm2015/lib/utils/number-utils.js +390 -390
- package/esm2015/lib/utils/object-utils.js +278 -278
- package/esm2015/lib/utils/ref-code-utils.js +49 -49
- package/esm2015/lib/utils/string-utils.js +93 -93
- package/esm2015/public-api.js +31 -31
- package/fesm2015/colijnit-sharedcomponents.js +10411 -10335
- package/fesm2015/colijnit-sharedcomponents.js.map +1 -1
- package/lib/assets/dictionary/text.properties.d.ts +3 -3
- package/lib/businessobject/build-images-and-documentation-result.d.ts +5 -5
- package/lib/businessobject/co-document-right.bo.d.ts +6 -6
- package/lib/businessobject/drag-drop-container-element.d.ts +6 -6
- package/lib/businessobject/drag-drop-container.d.ts +6 -6
- package/lib/components/access/read-write-access.scss +25 -25
- package/lib/components/access/style/_layout.scss +23 -23
- package/lib/components/access/style/_material-definition.scss +12 -12
- package/lib/components/access/style/_theme.scss +4 -4
- package/lib/components/access/style/material.scss +4 -4
- package/lib/components/activity-list/activity-list.component.d.ts +33 -33
- package/lib/components/activity-list/activity-list.module.d.ts +2 -2
- package/lib/components/activity-list/style/_layout.scss +68 -68
- package/lib/components/activity-list/style/_theme.scss +4 -4
- package/lib/components/activity-list/style/material.scss +4 -4
- package/lib/components/app-file-dropzone/app-file-dropzone.component.d.ts +14 -14
- package/lib/components/app-file-dropzone/app-file-dropzone.module.d.ts +2 -2
- package/lib/components/app-file-dropzone/style/_layout.scss +61 -61
- package/lib/components/app-file-dropzone/style/_theme.scss +4 -4
- package/lib/components/app-file-dropzone/style/material.scss +4 -4
- package/lib/components/date-planning/component/agenda/agenda-base-view.component.d.ts +21 -21
- package/lib/components/date-planning/component/agenda/agenda-day-view.component.d.ts +7 -7
- package/lib/components/date-planning/component/agenda/agenda-event.component.d.ts +18 -18
- package/lib/components/date-planning/component/agenda/agenda-events.component.d.ts +13 -13
- package/lib/components/date-planning/component/agenda/agenda-half-hour-cell.component.d.ts +18 -18
- package/lib/components/date-planning/component/agenda/agenda-header.component.d.ts +48 -48
- package/lib/components/date-planning/component/agenda/agenda-hour-cell.component.d.ts +9 -9
- package/lib/components/date-planning/component/agenda/agenda-hour-view-labels.component.d.ts +8 -8
- package/lib/components/date-planning/component/agenda/agenda-hour-view.component.d.ts +7 -7
- package/lib/components/date-planning/component/agenda/agenda-month-view.component.d.ts +10 -10
- package/lib/components/date-planning/component/agenda/agenda-select-event.component.d.ts +12 -12
- package/lib/components/date-planning/component/agenda/agenda-view.component.d.ts +12 -12
- package/lib/components/date-planning/component/agenda/agenda-week-select-view.component.d.ts +10 -10
- package/lib/components/date-planning/component/agenda/agenda-week-view.component.d.ts +9 -9
- package/lib/components/date-planning/component/agenda/style/_layout.scss +443 -443
- package/lib/components/date-planning/component/agenda/style/_material-definition.scss +12 -12
- package/lib/components/date-planning/component/agenda/style/_theme.scss +7 -7
- package/lib/components/date-planning/component/agenda/style/material.scss +5 -5
- package/lib/components/date-planning/component/agenda/view-select.component.d.ts +11 -11
- package/lib/components/date-planning/component/calendar/calendar-all-months.component.d.ts +9 -9
- package/lib/components/date-planning/component/calendar/calendar-all-years.component.d.ts +9 -9
- package/lib/components/date-planning/component/calendar/calendar-header.component.d.ts +23 -23
- package/lib/components/date-planning/component/calendar/calendar-view.component.d.ts +31 -31
- package/lib/components/date-planning/component/calendar/calendar.component.d.ts +10 -10
- package/lib/components/date-planning/component/calendar/style/_layout.scss +167 -167
- package/lib/components/date-planning/component/calendar/style/_material-definition.scss +7 -7
- package/lib/components/date-planning/component/calendar/style/_theme.scss +7 -7
- package/lib/components/date-planning/component/calendar/style/material.scss +5 -5
- package/lib/components/date-planning/date-planning.component.d.ts +28 -28
- package/lib/components/date-planning/date-planning.module.d.ts +2 -2
- package/lib/components/date-planning/style/_layout.scss +45 -45
- package/lib/components/date-planning/style/_theme.scss +5 -5
- package/lib/components/date-planning/style/material.scss +7 -7
- package/lib/components/docsign/component/signature/signature.component.d.ts +16 -16
- package/lib/components/docsign/component/signature/style/_layout.scss +40 -40
- package/lib/components/docsign/component/signature/style/_material-definition.scss +11 -11
- package/lib/components/docsign/component/signature/style/_theme.scss +13 -13
- package/lib/components/docsign/component/signature/style/material.scss +4 -4
- package/lib/components/docsign/component/signatures/signatures.component.d.ts +12 -12
- package/lib/components/docsign/component/signatures/style/_layout.scss +13 -13
- package/lib/components/docsign/component/signatures/style/_material-definition.scss +1 -1
- package/lib/components/docsign/component/signatures/style/_theme.scss +4 -4
- package/lib/components/docsign/component/signatures/style/material.scss +5 -5
- package/lib/components/docsign/docsign.component.d.ts +94 -94
- package/lib/components/docsign/docsign.module.d.ts +2 -2
- package/lib/components/docsign/style/_layout.scss +40 -40
- package/lib/components/docsign/style/_material-definition.scss +12 -12
- package/lib/components/docsign/style/_theme.scss +12 -12
- package/lib/components/docsign/style/material.scss +15 -15
- package/lib/components/file-upload/file-upload.component.d.ts +42 -42
- package/lib/components/file-upload/file-upload.module.d.ts +2 -2
- package/lib/components/file-upload/style/_layout.scss +59 -59
- package/lib/components/file-upload/style/_material-definition.scss +2 -2
- package/lib/components/file-upload/style/_theme.scss +4 -4
- package/lib/components/file-upload/style/material.scss +4 -4
- package/lib/components/file-upload-popup/file-upload-popup.component.d.ts +75 -75
- package/lib/components/file-upload-popup/file-upload-popup.module.d.ts +2 -2
- package/lib/components/file-upload-popup/style/_layout.scss +48 -48
- package/lib/components/file-upload-popup/style/_material-definition.scss +2 -2
- package/lib/components/file-upload-popup/style/_theme.scss +5 -5
- package/lib/components/file-upload-popup/style/material.scss +4 -4
- package/lib/components/files-upload/components/base-file-upload.component.d.ts +98 -98
- package/lib/components/files-upload/components/drag-drop-container.component.d.ts +34 -34
- package/lib/components/files-upload/files-upload.component.d.ts +32 -32
- package/lib/components/files-upload/files-upload.module.d.ts +2 -2
- package/lib/components/files-upload/style/_layout.scss +49 -49
- package/lib/components/files-upload/style/_theme.scss +5 -5
- package/lib/components/files-upload/style/material.scss +4 -4
- package/lib/components/image-display/image-display.component.d.ts +14 -14
- package/lib/components/image-display/image-display.module.d.ts +2 -2
- package/lib/components/image-display/style/_layout.scss +56 -56
- package/lib/components/image-display/style/_material-definition.scss +4 -4
- package/lib/components/image-display/style/_theme.scss +6 -6
- package/lib/components/image-display/style/material.scss +3 -3
- package/lib/components/key-pad/key-pad.component.d.ts +38 -38
- package/lib/components/key-pad/key-pad.module.d.ts +2 -2
- package/lib/components/key-pad/style/_layout.scss +160 -160
- package/lib/components/key-pad/style/_material-definition.scss +19 -19
- package/lib/components/key-pad/style/_theme.scss +35 -35
- package/lib/components/key-pad/style/material.scss +4 -4
- package/lib/components/layout-switcher/layout-switcher.component.d.ts +16 -16
- package/lib/components/layout-switcher/layout-switcher.module.d.ts +2 -2
- package/lib/components/layout-switcher/style/_layout.scss +94 -94
- package/lib/components/layout-switcher/style/_material-definition.scss +16 -16
- package/lib/components/layout-switcher/style/_theme.scss +4 -4
- package/lib/components/layout-switcher/style/material.scss +6 -6
- package/lib/components/linear-gauge/co-linear-gauge.component.d.ts +11 -11
- package/lib/components/linear-gauge/co-linear-gauge.module.d.ts +2 -2
- package/lib/components/linear-gauge/style/_layout.scss +20 -20
- package/lib/components/linear-gauge/style/_material-definition.scss +8 -8
- package/lib/components/linear-gauge/style/_theme.scss +4 -4
- package/lib/components/linear-gauge/style/material.scss +6 -6
- package/lib/components/login/style/_layout.scss +57 -57
- package/lib/components/login/style/_material-definition.scss +23 -23
- package/lib/components/login/style/_theme.scss +7 -7
- package/lib/components/login/style/material.scss +4 -4
- package/lib/components/multi-property-toggler/multiple-property-toggler.component.d.ts +27 -27
- package/lib/components/multi-property-toggler/multiple-property-toggler.module.d.ts +2 -2
- package/lib/components/multi-property-toggler/style/_layout.scss +24 -24
- package/lib/components/multi-property-toggler/style/_theme.scss +4 -4
- package/lib/components/multi-property-toggler/style/material.scss +4 -4
- package/lib/components/screen-config-generator/style/_layout.scss +95 -95
- package/lib/components/screen-config-generator/style/_theme.scss +4 -4
- package/lib/components/screen-config-generator/style/material.scss +4 -4
- package/lib/components/send-method-dialog/components/layout-selection/layout-selection.component.d.ts +19 -19
- package/lib/components/send-method-dialog/components/layout-selection/layout-selection.module.d.ts +2 -2
- package/lib/components/send-method-dialog/components/layout-selection/style/_layout.scss +44 -44
- package/lib/components/send-method-dialog/components/layout-selection/style/_material-definition.scss +19 -19
- package/lib/components/send-method-dialog/components/layout-selection/style/_theme.scss +17 -17
- package/lib/components/send-method-dialog/components/layout-selection/style/material.scss +4 -4
- package/lib/components/send-method-dialog/components/printer-selection/printer-selection.component.d.ts +19 -19
- package/lib/components/send-method-dialog/components/printer-selection/printer-selection.module.d.ts +2 -2
- package/lib/components/send-method-dialog/components/printer-selection/style/_layout.scss +69 -69
- package/lib/components/send-method-dialog/components/printer-selection/style/_material-definition.scss +37 -37
- package/lib/components/send-method-dialog/components/printer-selection/style/_theme.scss +23 -23
- package/lib/components/send-method-dialog/components/printer-selection/style/material.scss +4 -4
- package/lib/components/send-method-dialog/components/send-method-email/send-method-email.component.d.ts +14 -14
- package/lib/components/send-method-dialog/components/send-method-email/send-method-email.module.d.ts +2 -2
- package/lib/components/send-method-dialog/components/send-method-email/style/_layout.scss +29 -29
- package/lib/components/send-method-dialog/components/send-method-email/style/_material-definition.scss +8 -8
- package/lib/components/send-method-dialog/components/send-method-email/style/_theme.scss +5 -5
- package/lib/components/send-method-dialog/components/send-method-email/style/material.scss +4 -4
- package/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.component.d.ts +8 -8
- package/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.module.d.ts +2 -2
- package/lib/components/send-method-dialog/components/send-method-pdf/style/_layout.scss +25 -25
- package/lib/components/send-method-dialog/components/send-method-pdf/style/_material-definition.scss +5 -5
- package/lib/components/send-method-dialog/components/send-method-pdf/style/_theme.scss +5 -5
- package/lib/components/send-method-dialog/components/send-method-pdf/style/material.scss +4 -4
- package/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.component.d.ts +13 -13
- package/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.module.d.ts +2 -2
- package/lib/components/send-method-dialog/components/send-method-printer/style/_layout.scss +30 -30
- package/lib/components/send-method-dialog/components/send-method-printer/style/_material-definition.scss +5 -5
- package/lib/components/send-method-dialog/components/send-method-printer/style/_theme.scss +5 -5
- package/lib/components/send-method-dialog/components/send-method-printer/style/material.scss +4 -4
- package/lib/components/send-method-dialog/components/signature-button/signature-button.component.d.ts +12 -12
- package/lib/components/send-method-dialog/components/signature-button/signature-button.module.d.ts +2 -2
- package/lib/components/send-method-dialog/components/signature-button/style/_layout.scss +28 -28
- package/lib/components/send-method-dialog/components/signature-button/style/_material-definition.scss +8 -8
- package/lib/components/send-method-dialog/components/signature-button/style/_theme.scss +4 -4
- package/lib/components/send-method-dialog/components/signature-button/style/material.scss +4 -4
- package/lib/components/send-method-dialog/model/email-address-viewmodel.d.ts +5 -5
- package/lib/components/send-method-dialog/send-method-dialog.component.d.ts +71 -71
- package/lib/components/send-method-dialog/send-method-dialog.module.d.ts +2 -2
- package/lib/components/send-method-dialog/send-method-params.interface.d.ts +13 -13
- package/lib/components/send-method-dialog/service/send-method.service.d.ts +23 -23
- package/lib/components/send-method-dialog/style/_layout.scss +165 -165
- package/lib/components/send-method-dialog/style/_material-definition.scss +48 -48
- package/lib/components/send-method-dialog/style/_theme.scss +33 -33
- package/lib/components/send-method-dialog/style/material.scss +10 -10
- package/lib/components/simple-tags/simple-tags.component.d.ts +31 -31
- package/lib/components/simple-tags/simple-tags.module.d.ts +2 -2
- package/lib/components/simple-tags/style/_layout.scss +272 -272
- package/lib/components/simple-tags/style/_material-definition.scss +39 -39
- package/lib/components/simple-tags/style/_theme.scss +4 -4
- package/lib/components/simple-tags/style/material.scss +4 -4
- package/lib/components/statusbar/statusbar-popup.component.d.ts +21 -21
- package/lib/components/statusbar/statusbar.component.d.ts +26 -26
- package/lib/components/statusbar/statusbar.module.d.ts +2 -2
- package/lib/components/statusbar/style/_layout.scss +70 -70
- package/lib/components/statusbar/style/_material-definition.scss +23 -23
- package/lib/components/statusbar/style/_theme.scss +13 -13
- package/lib/components/statusbar/style/material.scss +5 -5
- package/lib/components/stock/components/allocation-stock-history/allocation-stock-history.component.d.ts +9 -9
- package/lib/components/stock/components/order-commission-stock-history/order-commission-stock-history.component.d.ts +9 -9
- package/lib/components/stock/components/order-stock-history/order-stock-history.component.d.ts +9 -9
- package/lib/components/stock/components/order-stock-tab/order-stock-tab.component.d.ts +11 -11
- package/lib/components/stock/components/order-supply-stock-history/order-supply-stock-history.component.d.ts +9 -9
- package/lib/components/stock/components/order-tab/order-tab.component.d.ts +20 -20
- package/lib/components/stock/components/stock-history/stock-history.component.d.ts +13 -13
- package/lib/components/stock/components/stock-location/stock-location.component.d.ts +52 -50
- package/lib/components/stock/components/stock-prognose/stock-prognose.component.d.ts +11 -11
- package/lib/components/stock/components/stock-tab/stock-tab.component.d.ts +7 -7
- package/lib/components/stock/localization/translation.d.ts +69 -60
- package/lib/components/stock/stock-history-tabs/stock-history-tabs.component.d.ts +7 -7
- package/lib/components/stock/stock-information/stock-information.component.d.ts +9 -9
- package/lib/components/stock/stock-information-grid/stock-information-grid.component.d.ts +75 -75
- package/lib/components/stock/stock-tabs/stock-tabs.component.d.ts +56 -56
- package/lib/components/stock/stock-transfer/co-drop-down-list-fields.interface.d.ts +4 -4
- package/lib/components/stock/stock-transfer/stock-change-amount.component.d.ts +18 -18
- package/lib/components/stock/stock-transfer/stock-transfer.component.d.ts +38 -42
- package/lib/components/stock/stock.component.d.ts +64 -58
- package/lib/components/stock/stock.module.d.ts +2 -2
- package/lib/components/stock/style/_layout.scss +473 -286
- package/lib/components/stock/style/_material-definition.scss +28 -25
- package/lib/components/stock/style/_theme.scss +5 -5
- package/lib/components/stock/style/material.scss +4 -4
- package/lib/components/stock-statusbar/stock-statusbar.component.d.ts +4 -4
- package/lib/components/stock-statusbar/stock-statusbar.module.d.ts +2 -2
- package/lib/components/stock-statusbar/style/_layout.scss +24 -24
- package/lib/components/stock-statusbar/style/material.scss +4 -4
- package/lib/components/tab-bar/style/_layout.scss +83 -78
- package/lib/components/tab-bar/style/_material-definition.scss +6 -6
- package/lib/components/tab-bar/style/material.scss +4 -4
- package/lib/components/tab-bar/tab-bar.component.d.ts +21 -21
- package/lib/components/tab-bar/tab-bar.module.d.ts +2 -2
- package/lib/components/tab-bar/tab.interface.d.ts +5 -5
- package/lib/components/tags/component/style/_layout.scss +67 -67
- package/lib/components/tags/component/style/_material-definition.scss +1 -1
- package/lib/components/tags/component/style/_theme.scss +8 -8
- package/lib/components/tags/component/style/material.scss +3 -3
- package/lib/components/tags/component/tag-join-label/style/_layout.scss +97 -97
- package/lib/components/tags/component/tag-join-label/style/_material-definition.scss +4 -4
- package/lib/components/tags/component/tag-join-label/style/_theme.scss +8 -8
- package/lib/components/tags/component/tag-join-label/style/material.scss +3 -3
- package/lib/components/tile-renderer/style/_layout.scss +90 -90
- package/lib/components/tile-renderer/style/_theme.scss +4 -4
- package/lib/components/tile-renderer/style/material.scss +4 -4
- package/lib/components/tile-renderer/tile-render.component.d.ts +31 -31
- package/lib/components/tile-renderer/tile-render.module.d.ts +2 -2
- package/lib/decorator/input-boolean.decorator.d.ts +8 -8
- package/lib/enum/calendar-view.enum.d.ts +7 -7
- package/lib/enum/document-email-report.enum.d.ts +15 -15
- package/lib/enum/domain-multiple-name.enum.d.ts +10 -10
- package/lib/enum/file-type.d.ts +7 -7
- package/lib/enum/files-upload-config-objects.d.ts +22 -22
- package/lib/enum/gauge-color.enum.d.ts +8 -8
- package/lib/enum/icon.enum.d.ts +46 -42
- package/lib/enum/internal-param.enum.d.ts +34 -34
- package/lib/enum/keyboard-code.enum.d.ts +30 -30
- package/lib/enum/language-code.enum.d.ts +6 -6
- package/lib/enum/month.enum.d.ts +14 -14
- package/lib/enum/read-write-access-config-names.enum.d.ts +4 -4
- package/lib/enum/table-name.enum.d.ts +84 -84
- package/lib/enum/tag-category.enum.d.ts +19 -19
- package/lib/enum/tags-component-config-names.d.ts +4 -4
- package/lib/enum/thumb-three-way-state.d.ts +6 -6
- package/lib/enum/tile-size-type.d.ts +4 -4
- package/lib/enum/time-period.enum.d.ts +8 -8
- package/lib/event/co-drag-event.d.ts +5 -5
- package/lib/event/co-drop-event.d.ts +8 -8
- package/lib/interface/key-value-pair.d.ts +4 -4
- package/lib/interface/operation-callback-simple-function.d.ts +4 -4
- package/lib/localization/localization.module.d.ts +2 -2
- package/lib/localization/localize.pipe.d.ts +7 -7
- package/lib/localization/localize.service.d.ts +7 -7
- package/lib/localization/translation.d.ts +2 -2
- package/lib/model/agenda-event-per-day.model.d.ts +5 -5
- package/lib/model/agenda-event.model.d.ts +17 -17
- package/lib/model/agenda-null-objects.d.ts +10 -10
- package/lib/model/constant/all-months.d.ts +2 -2
- package/lib/model/date-range.d.ts +7 -7
- package/lib/model/day.model.d.ts +8 -8
- package/lib/model/icon-svg.d.ts +4 -4
- package/lib/model/month.model.d.ts +5 -5
- package/lib/model/send-method.d.ts +7 -7
- package/lib/model/settings.d.ts +3 -3
- package/lib/model/tag-tree-item.bo.d.ts +18 -18
- package/lib/model/time-window.bo.d.ts +13 -13
- package/lib/model/tree-object.d.ts +8 -8
- package/lib/model/week.model.d.ts +4 -4
- package/lib/model/weekday.model.d.ts +16 -16
- package/lib/pipe/array-number.pipe.d.ts +4 -4
- package/lib/pipe/file-type-image.pipe.d.ts +12 -12
- package/lib/pipe/master-pipes.d.ts +1 -1
- package/lib/pipe/ucfirst.pipe.d.ts +4 -4
- package/lib/service/dictionary.service.d.ts +21 -21
- package/lib/service/drag-drop.service.d.ts +86 -86
- package/lib/service/icon-cache.service.d.ts +18 -18
- package/lib/service/options.service.d.ts +13 -13
- package/lib/service/shared-connector.service.d.ts +55 -55
- package/lib/service/shared.service.d.ts +18 -18
- package/lib/service/stock.service.d.ts +41 -41
- package/lib/style/_mixin.scss +14 -14
- package/lib/style/_variables.scss +21 -21
- package/lib/style/sharedcomponents-globals.scss +10 -10
- package/lib/utils/array-utils.d.ts +63 -63
- package/lib/utils/calendar.utils.d.ts +10 -10
- package/lib/utils/check-precision-and-scale-result.d.ts +4 -4
- package/lib/utils/check-within-stepped-bounds-result.d.ts +8 -8
- package/lib/utils/co-document-shared-field-logic.d.ts +7 -7
- package/lib/utils/date-utils.d.ts +44 -44
- package/lib/utils/enum-utils.d.ts +31 -31
- package/lib/utils/function/not-nill.function.d.ts +1 -1
- package/lib/utils/is-nill.function.d.ts +1 -1
- package/lib/utils/map-utils.d.ts +16 -16
- package/lib/utils/number-utils.d.ts +125 -125
- package/lib/utils/object-utils.d.ts +40 -40
- package/lib/utils/ref-code-utils.d.ts +10 -10
- package/lib/utils/string-utils.d.ts +38 -38
- package/package.json +6 -6
- package/public-api.d.ts +27 -27
|
@@ -1,365 +1,365 @@
|
|
|
1
|
-
import { Injectable } from "@angular/core";
|
|
2
|
-
import { Subject } from "rxjs";
|
|
3
|
-
import { ArrayUtils } from "../utils/array-utils";
|
|
4
|
-
import { CoOrientation } from "@colijnit/corecomponents_v12";
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
/**
|
|
7
|
-
* Handles drag and drop elements
|
|
8
|
-
*/
|
|
9
|
-
export class DragDropService {
|
|
10
|
-
constructor() {
|
|
11
|
-
this.drag = new Subject();
|
|
12
|
-
this.drop = new Subject();
|
|
13
|
-
// Container(s) holding the elements to be dragged.
|
|
14
|
-
this._containers = [];
|
|
15
|
-
this._disabledContainers = [];
|
|
16
|
-
// Drag handle(s) that contains the classes of the handles.
|
|
17
|
-
this._dragHandles = [];
|
|
18
|
-
this._isdragging = false;
|
|
19
|
-
this._clickCounter = 0;
|
|
20
|
-
this._ghostLeft = 0;
|
|
21
|
-
this._ghostTop = 0;
|
|
22
|
-
this._mouseDown = false;
|
|
23
|
-
this._currentMousePosition = { x: 0, y: 0 };
|
|
24
|
-
this._currentMouseOffset = { x: 0, y: 0 };
|
|
25
|
-
// Handles the mouse down event. Saves the current mouse position.
|
|
26
|
-
this._handleMouseDown = (event) => {
|
|
27
|
-
this._currentMousePosition.x = event.screenX;
|
|
28
|
-
this._currentMousePosition.y = event.screenY;
|
|
29
|
-
if (event.buttons !== 1 || event.metaKey || event.ctrlKey) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const element = event.target ? event.target : event.srcElement;
|
|
33
|
-
const dragElement = this._getValidDragDropElement(element, true);
|
|
34
|
-
if (!dragElement) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
if (this._disabledContainers.indexOf(dragElement.container) !== -1) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
this._dragElement = dragElement;
|
|
41
|
-
this._dragInContainer = dragElement.container.element;
|
|
42
|
-
const offset = this._getOffset();
|
|
43
|
-
this._currentMouseOffset.x = event.clientX - offset.left;
|
|
44
|
-
this._currentMouseOffset.y = event.clientY - offset.top;
|
|
45
|
-
this._mouseDown = true;
|
|
46
|
-
this._handleEventListener(document, "mousemove", this._handleMouseMove);
|
|
47
|
-
this._clickCounter++;
|
|
48
|
-
};
|
|
49
|
-
this._handleMouseUp = (event) => {
|
|
50
|
-
this._mouseDown = false;
|
|
51
|
-
this._handleEventListener(document, "mousemove", this._handleMouseMove, false);
|
|
52
|
-
this._clickCounter--;
|
|
53
|
-
if (this._isdragging) {
|
|
54
|
-
this._endDrag();
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
this._handleMouseMove = (event) => {
|
|
58
|
-
// nothing to drag?
|
|
59
|
-
if (!this._dragElement) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
// only drag when mouse down and there actually is movement
|
|
63
|
-
if (!this._mouseDown || (this._currentMousePosition.x === event.screenX && this._currentMousePosition.y === event.screenY)) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
this._isdragging = true;
|
|
67
|
-
this._startDrag();
|
|
68
|
-
this._drag(event);
|
|
69
|
-
this._currentMousePosition.x = event.screenX;
|
|
70
|
-
this._currentMousePosition.y = event.screenY;
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
set renderer(value) {
|
|
74
|
-
this._renderer = value;
|
|
75
|
-
this._setEvents();
|
|
76
|
-
}
|
|
77
|
-
set ghostLeft(value) {
|
|
78
|
-
this._ghostLeft = value;
|
|
79
|
-
this._positionGhostImage();
|
|
80
|
-
}
|
|
81
|
-
set ghostTop(value) {
|
|
82
|
-
this._ghostTop = value;
|
|
83
|
-
this._positionGhostImage();
|
|
84
|
-
}
|
|
85
|
-
ngOnDestroy() {
|
|
86
|
-
this._removeListeners();
|
|
87
|
-
}
|
|
88
|
-
addContainer(container) {
|
|
89
|
-
const direction = (getComputedStyle(container.element).flexDirection === "row" && getComputedStyle(container.element).display === "flex")
|
|
90
|
-
? CoOrientation.Horizontal
|
|
91
|
-
: CoOrientation.Vertical;
|
|
92
|
-
container.direction = direction;
|
|
93
|
-
this._containers.push(container);
|
|
94
|
-
}
|
|
95
|
-
addDragHandle(handle) {
|
|
96
|
-
this._dragHandles.push(handle);
|
|
97
|
-
}
|
|
98
|
-
removeContainer(container) {
|
|
99
|
-
ArrayUtils.RemoveElement(container, this._containers);
|
|
100
|
-
ArrayUtils.RemoveElement(container, this._disabledContainers);
|
|
101
|
-
if (!this._containers || this._containers.length === 0) {
|
|
102
|
-
this._removeListeners();
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
removeDragHandle(handle) {
|
|
106
|
-
ArrayUtils.RemoveElement(handle, this._dragHandles);
|
|
107
|
-
}
|
|
108
|
-
enableContainer(container) {
|
|
109
|
-
ArrayUtils.RemoveElement(container, this._disabledContainers);
|
|
110
|
-
}
|
|
111
|
-
disableContainer(container) {
|
|
112
|
-
this._disabledContainers.push(container);
|
|
113
|
-
}
|
|
114
|
-
_removeListeners() {
|
|
115
|
-
this._handleEventListener(document, "mouseup", this._handleMouseUp, false);
|
|
116
|
-
this._handleEventListener(document, "mousemove", this._handleMouseMove, false);
|
|
117
|
-
}
|
|
118
|
-
_setEvents() {
|
|
119
|
-
this._handleEventListener(document, "mousedown", this._handleMouseDown); //TODO: mousedown only within given containers
|
|
120
|
-
this._handleEventListener(document, "mouseup", this._handleMouseUp);
|
|
121
|
-
}
|
|
122
|
-
_setElementClass(element, elementClass) {
|
|
123
|
-
if (!this._renderer) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
this._renderer.addClass(element, elementClass);
|
|
127
|
-
}
|
|
128
|
-
_handleEventListener(element, event, handler, add = true) {
|
|
129
|
-
if (add) {
|
|
130
|
-
element.removeEventListener(event, handler);
|
|
131
|
-
element.addEventListener(event, handler);
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
element.removeEventListener(event, handler);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
// Returns the container that holds given element.
|
|
138
|
-
_getContainerOfElement(element) {
|
|
139
|
-
for (let i = 0, len1 = this._containers.length; i < len1; i++) {
|
|
140
|
-
const container = this._containers[i];
|
|
141
|
-
for (let ii = 0, len2 = container.element.children.length; ii < len2; ii++) {
|
|
142
|
-
if (container.element.children[ii] === element) {
|
|
143
|
-
return container;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Checks if given element is a child of container(s)
|
|
150
|
-
* @param element
|
|
151
|
-
* @returns {number} index of element
|
|
152
|
-
*/
|
|
153
|
-
_getElementOfContainer(element) {
|
|
154
|
-
for (let i = 0, len1 = this._containers.length; i < len1; i++) {
|
|
155
|
-
const container = this._containers[i];
|
|
156
|
-
for (let ii = 0, len2 = container.element.children.length; ii < len2; ii++) {
|
|
157
|
-
if (container.element.children[ii] === element) {
|
|
158
|
-
return { container: container, element: element, elementIdx: ii };
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return { container: undefined, element: undefined, elementIdx: -1 };
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Returns next sibling of container that contains given element.
|
|
166
|
-
* @param element
|
|
167
|
-
* @returns {any} null if there are no siblings left
|
|
168
|
-
*/
|
|
169
|
-
_getNextElementInContainer(element) {
|
|
170
|
-
const container = this._getContainerOfElement(element);
|
|
171
|
-
for (let i = 0, len = container.element.children.length; i < len; i++) {
|
|
172
|
-
if (container.element.children[i] === element) {
|
|
173
|
-
return i < (len - 1) ? { container: container, element: container.element.children[i + 1], elementIdx: i } : null;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
_getDragHandleClicked(element) {
|
|
178
|
-
if (this._dragHandles && this._dragHandles.length > 0) { // check if handle clicked
|
|
179
|
-
while (element) {
|
|
180
|
-
for (let i = 0, len = this._dragHandles.length; i < len; i++) {
|
|
181
|
-
if (element.classList && element.classList.length > 0 && !!this._dragHandles[i]) {
|
|
182
|
-
if (element.classList.contains(this._dragHandles[i])) {
|
|
183
|
-
return true;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
element = element.parentNode === document ? null : element.parentNode;
|
|
188
|
-
}
|
|
189
|
-
return false;
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
return true;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
// Returns element when it's a valid drop target, false otherwise.
|
|
196
|
-
_getValidDragDropElement(element, checkHandle = false) {
|
|
197
|
-
if (checkHandle) {
|
|
198
|
-
const validHandleClicked = this._getDragHandleClicked(element);
|
|
199
|
-
if (!validHandleClicked) {
|
|
200
|
-
return undefined;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
while (element) {
|
|
204
|
-
const elementOfContainer = this._getElementOfContainer(element);
|
|
205
|
-
if (elementOfContainer.elementIdx > -1) {
|
|
206
|
-
return elementOfContainer;
|
|
207
|
-
}
|
|
208
|
-
element = element.parentNode === document ? null : element.parentNode;
|
|
209
|
-
}
|
|
210
|
-
return undefined;
|
|
211
|
-
}
|
|
212
|
-
_getNextSibling(element) {
|
|
213
|
-
return this._getNextElementInContainer(element);
|
|
214
|
-
}
|
|
215
|
-
// Returns the current index of element within its container.
|
|
216
|
-
_indexOf(element) {
|
|
217
|
-
const elementOfContainer = this._getElementOfContainer(element.hasOwnProperty("element") ? element.element : element);
|
|
218
|
-
return elementOfContainer ? elementOfContainer.elementIdx : -1;
|
|
219
|
-
}
|
|
220
|
-
// Creates a ghost image/element of the element being dragged.
|
|
221
|
-
_createGhostImage() {
|
|
222
|
-
if (this._ghostDragImage) {
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
// create ghost drag image
|
|
226
|
-
const offsetRect = this._getOffset();
|
|
227
|
-
this._ghostDragImage = this._dragElement.element.cloneNode(true);
|
|
228
|
-
this._ghostDragImage.style.width = offsetRect.width + "px";
|
|
229
|
-
this._ghostDragImage.style.height = offsetRect.height + "px";
|
|
230
|
-
this.ghostLeft = offsetRect.left;
|
|
231
|
-
this.ghostTop = offsetRect.top;
|
|
232
|
-
this._setElementClass(this._ghostDragImage, "ghost-image");
|
|
233
|
-
this._setElementClass(document.activeElement, "no-select");
|
|
234
|
-
document.body.appendChild(this._ghostDragImage);
|
|
235
|
-
}
|
|
236
|
-
_destroyGhostImage() {
|
|
237
|
-
if (this._ghostDragImage) {
|
|
238
|
-
this._renderer.removeClass(document.activeElement, "no-select");
|
|
239
|
-
document.body.removeChild(this._ghostDragImage);
|
|
240
|
-
this._ghostDragImage = undefined;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
// Positions the ghost image at the given coordinates.
|
|
244
|
-
_positionGhostImage() {
|
|
245
|
-
if (!this._ghostDragImage) {
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
this._ghostDragImage.style.left = this._ghostLeft + "px";
|
|
249
|
-
this._ghostDragImage.style.top = this._ghostTop + "px";
|
|
250
|
-
}
|
|
251
|
-
_getScroll(scrollProp, offsetProp) {
|
|
252
|
-
if (document.activeElement.clientHeight) {
|
|
253
|
-
return document.activeElement[scrollProp];
|
|
254
|
-
}
|
|
255
|
-
return document.body[scrollProp];
|
|
256
|
-
}
|
|
257
|
-
_getOffset() {
|
|
258
|
-
const rect = this._dragElement.element.getBoundingClientRect();
|
|
259
|
-
const scrollLeft = 0;
|
|
260
|
-
const scrollTop = 0;
|
|
261
|
-
return {
|
|
262
|
-
bottom: rect.bottom,
|
|
263
|
-
height: rect.height,
|
|
264
|
-
left: rect.left + scrollLeft,
|
|
265
|
-
right: rect.right,
|
|
266
|
-
top: rect.top + scrollTop,
|
|
267
|
-
width: rect.width
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
_determineDroptarget(element, x, y) {
|
|
271
|
-
const dropElement = this._getValidDragDropElement(element);
|
|
272
|
-
if (dropElement) {
|
|
273
|
-
if (dropElement.element !== this._dragElement.element) {
|
|
274
|
-
this._dropTargetElement = dropElement;
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
this._dropTargetElement = null;
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Briefly hides the ghost image to be able to determine which element is under mouse.
|
|
282
|
-
* @param x
|
|
283
|
-
* @param y
|
|
284
|
-
* @returns {Element} Top level element
|
|
285
|
-
*/
|
|
286
|
-
_getHoveredElement(x, y) {
|
|
287
|
-
this._setElementClass(this._ghostDragImage, "ghost-image-hide");
|
|
288
|
-
const elm = document.elementFromPoint(x, y);
|
|
289
|
-
this._renderer.removeClass(this._ghostDragImage, "ghost-image-hide");
|
|
290
|
-
return elm;
|
|
291
|
-
}
|
|
292
|
-
_animateVisibility(element, transitionTime = 0.2, start = "0", end = "1") {
|
|
293
|
-
if (!element) {
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
const transitionStyle = "opacity " + transitionTime + "s ease-in-out";
|
|
297
|
-
const transition = element.style.transition;
|
|
298
|
-
element.style.transition = transition + (transition ? "," : "") + transitionStyle;
|
|
299
|
-
element.style.opacity = start;
|
|
300
|
-
element.style.opacity = end;
|
|
301
|
-
return new Promise((resolve) => {
|
|
302
|
-
setTimeout(() => {
|
|
303
|
-
resolve();
|
|
304
|
-
}, transitionTime * 1000);
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
_animateMove(parent, dragElement, dropTargetElement, down) {
|
|
308
|
-
if (down) { // insert element before
|
|
309
|
-
parent.insertBefore(dragElement.element, dropTargetElement.element);
|
|
310
|
-
}
|
|
311
|
-
else { // insert after
|
|
312
|
-
parent.insertBefore(dragElement.element, dropTargetElement.element.nextSibling);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
_startDrag() {
|
|
316
|
-
this._createGhostImage();
|
|
317
|
-
this._setElementClass(this._dragElement.element, "is-dragged");
|
|
318
|
-
}
|
|
319
|
-
_drag(event) {
|
|
320
|
-
this.ghostLeft = this._ghostLeft + (event.screenX - this._currentMousePosition.x);
|
|
321
|
-
this.ghostTop = this._ghostTop + (event.screenY - this._currentMousePosition.y);
|
|
322
|
-
const x = event.clientX;
|
|
323
|
-
const y = event.clientY;
|
|
324
|
-
const hoveredElement = this._getHoveredElement(x, y);
|
|
325
|
-
this._determineDroptarget(hoveredElement, x, y);
|
|
326
|
-
if (this._dropTargetElement) {
|
|
327
|
-
const down = (this._dropTargetElement.container.direction === CoOrientation.Vertical && event.screenY > this._currentMousePosition.y) ||
|
|
328
|
-
(this._dropTargetElement.container.direction === CoOrientation.Horizontal && event.screenX > this._currentMousePosition.x);
|
|
329
|
-
this._animateMove(this._dropTargetElement.container.element, this._dragElement, this._dropTargetElement, down);
|
|
330
|
-
this.drag.next({
|
|
331
|
-
element: this._dragElement,
|
|
332
|
-
elementIndex: this._dragElement.elementIdx,
|
|
333
|
-
source: this._dropTargetElement.container.element
|
|
334
|
-
});
|
|
335
|
-
this._lastDropTarget = this._dropTargetElement;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
// element is dropped
|
|
339
|
-
_endDrag() {
|
|
340
|
-
this._renderer.removeClass(this._dragElement.element, "is-dragged");
|
|
341
|
-
this._destroyGhostImage();
|
|
342
|
-
this.drop.next({
|
|
343
|
-
element: this._dragElement.element,
|
|
344
|
-
elementIndex: this._dragElement.elementIdx,
|
|
345
|
-
target: this._lastDropTarget ? this._lastDropTarget.element : null,
|
|
346
|
-
targetIndex: this._lastDropTarget ? this._lastDropTarget.elementIdx : -1,
|
|
347
|
-
container: this._lastDropTarget ? this._lastDropTarget.container : null
|
|
348
|
-
});
|
|
349
|
-
this._resetDrag();
|
|
350
|
-
}
|
|
351
|
-
_resetDrag() {
|
|
352
|
-
this._dragElement = null;
|
|
353
|
-
this._dragInContainer = null;
|
|
354
|
-
this._lastDropTarget = null;
|
|
355
|
-
this._isdragging = false;
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
DragDropService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DragDropService_Factory() { return new DragDropService(); }, token: DragDropService, providedIn: "root" });
|
|
359
|
-
DragDropService.decorators = [
|
|
360
|
-
{ type: Injectable, args: [{
|
|
361
|
-
providedIn: "root"
|
|
362
|
-
},] }
|
|
363
|
-
];
|
|
364
|
-
DragDropService.ctorParameters = () => [];
|
|
365
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWRjb21wb25lbnRzL3NyYy9saWIvc2VydmljZS9kcmFnLWRyb3Auc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksVUFBVSxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBSTdCLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sOEJBQThCLENBQUM7O0FBRzNEOztHQUVHO0FBSUgsTUFBTSxPQUFPLGVBQWU7SUFtRHhCO1FBMUNPLFNBQUksR0FBeUIsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUN4RCxTQUFJLEdBQXlCLElBQUksT0FBTyxFQUFlLENBQUM7UUFHL0QsbURBQW1EO1FBQzNDLGdCQUFXLEdBQXdCLEVBQUUsQ0FBQztRQUV0Qyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBSXRELDJEQUEyRDtRQUNuRCxpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQVM3QixrQkFBYSxHQUFXLENBQUMsQ0FBQztRQVkxQixlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLGNBQVMsR0FBVyxDQUFDLENBQUM7UUFFdEIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUU1QiwwQkFBcUIsR0FBUSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO1FBQzFDLHdCQUFtQixHQUFRLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7UUFvUWhELGtFQUFrRTtRQUMxRCxxQkFBZ0IsR0FBYSxDQUFDLEtBQWlCLEVBQVEsRUFBRTtZQUM3RCxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDN0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzdDLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUN2RCxPQUFPO2FBQ1Y7WUFDRCxNQUFNLE9BQU8sR0FBUSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ3BFLE1BQU0sV0FBVyxHQUE2QixJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNGLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2QsT0FBTzthQUNWO1lBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDaEUsT0FBTzthQUNWO1lBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO1lBQ3RELE1BQU0sTUFBTSxHQUFRLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztZQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUN4RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsQ0FBQyxDQUFBO1FBRU8sbUJBQWMsR0FBYSxDQUFDLEtBQWlCLEVBQVEsRUFBRTtZQUMzRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0UsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXJCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ25CO1FBQ0wsQ0FBQyxDQUFBO1FBRU8scUJBQWdCLEdBQWEsQ0FBQyxLQUFpQixFQUFRLEVBQUU7WUFDN0QsbUJBQW1CO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNwQixPQUFPO2FBQ1Y7WUFDRCwyREFBMkQ7WUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3hILE9BQU87YUFDVjtZQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDakQsQ0FBQyxDQUFBO0lBbFRELENBQUM7SUFuREQsSUFBVyxRQUFRLENBQUMsS0FBZ0I7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUE2QkQsSUFBWSxTQUFTLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBWSxRQUFRLENBQUMsS0FBYTtRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBYUQsV0FBVztRQUNQLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxZQUFZLENBQUMsU0FBNEI7UUFDNUMsTUFBTSxTQUFTLEdBQ1gsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxLQUFLLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQztZQUNuSCxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVU7WUFDMUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDakMsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLGFBQWEsQ0FBQyxNQUFXO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxlQUFlLENBQUMsU0FBNEI7UUFDL0MsVUFBVSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUMzQjtJQUNMLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxNQUFXO1FBQy9CLFVBQVUsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sZUFBZSxDQUFDLFNBQTRCO1FBQy9DLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxTQUE0QjtRQUNoRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVPLFVBQVU7UUFDZCxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLDhDQUE4QztRQUN2SCxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE9BQVksRUFBRSxZQUFvQjtRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE9BQVksRUFBRSxLQUFhLEVBQUUsT0FBWSxFQUFFLE1BQWUsSUFBSTtRQUN2RixJQUFJLEdBQUcsRUFBRTtZQUNMLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDNUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztTQUM1QzthQUFNO1lBQ0gsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFRCxrREFBa0Q7SUFDMUMsc0JBQXNCLENBQUMsT0FBb0I7UUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsSUFBSSxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0UsTUFBTSxTQUFTLEdBQXNCLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekQsS0FBSyxJQUFJLEVBQUUsR0FBVyxDQUFDLEVBQUUsSUFBSSxHQUFXLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFO2dCQUN4RixJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxLQUFLLE9BQU8sRUFBRTtvQkFDNUMsT0FBTyxTQUFTLENBQUM7aUJBQ3BCO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssc0JBQXNCLENBQUMsT0FBWTtRQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxJQUFJLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzRSxNQUFNLFNBQVMsR0FBc0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxLQUFLLElBQUksRUFBRSxHQUFXLENBQUMsRUFBRSxJQUFJLEdBQVcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQ3hGLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEtBQUssT0FBTyxFQUFFO29CQUM1QyxPQUFPLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUMsQ0FBQztpQkFDbkU7YUFDSjtTQUNKO1FBQ0QsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLDBCQUEwQixDQUFDLE9BQW9CO1FBQ25ELE1BQU0sU0FBUyxHQUFzQixJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUUsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsR0FBRyxHQUFXLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25GLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxFQUFFO2dCQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBZSxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDaEk7U0FDSjtJQUNMLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxPQUFZO1FBQ3RDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSwwQkFBMEI7WUFDL0UsT0FBTyxPQUFPLEVBQUU7Z0JBQ1osS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsR0FBRyxHQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzFFLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQzdFLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFOzRCQUNsRCxPQUFPLElBQUksQ0FBQzt5QkFDZjtxQkFDSjtpQkFDSjtnQkFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUN6RTtZQUNELE9BQU8sS0FBSyxDQUFDO1NBQ2hCO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVELGtFQUFrRTtJQUMxRCx3QkFBd0IsQ0FBQyxPQUFZLEVBQUUsY0FBdUIsS0FBSztRQUN2RSxJQUFJLFdBQVcsRUFBRTtZQUNiLE1BQU0sa0JBQWtCLEdBQVksSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDckIsT0FBTyxTQUFTLENBQUM7YUFDcEI7U0FDSjtRQUNELE9BQU8sT0FBTyxFQUFFO1lBQ1osTUFBTSxrQkFBa0IsR0FBNkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFGLElBQUksa0JBQWtCLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNwQyxPQUFPLGtCQUFrQixDQUFDO2FBQzdCO1lBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7U0FDekU7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRU8sZUFBZSxDQUFDLE9BQW9CO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCw2REFBNkQ7SUFDckQsUUFBUSxDQUFDLE9BQVk7UUFDekIsTUFBTSxrQkFBa0IsR0FBNkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hKLE9BQU8sa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELDhEQUE4RDtJQUN0RCxpQkFBaUI7UUFDckIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLE9BQU87U0FDVjtRQUNELDBCQUEwQjtRQUMxQixNQUFNLFVBQVUsR0FBUSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUM3RCxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzNELFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3RCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztTQUNwQztJQUNMLENBQUM7SUFFRCxzREFBc0Q7SUFDOUMsbUJBQW1CO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3ZCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN6RCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDM0QsQ0FBQztJQUVPLFVBQVUsQ0FBQyxVQUFrQixFQUFFLFVBQWtCO1FBQ3JELElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUU7WUFDckMsT0FBTyxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxVQUFVO1FBQ2QsTUFBTSxJQUFJLEdBQWUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzRSxNQUFNLFVBQVUsR0FBVyxDQUFDLENBQUM7UUFDN0IsTUFBTSxTQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQzVCLE9BQU87WUFDSCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVU7WUFDNUIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVM7WUFDekIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1NBQ3BCLENBQUM7SUFDTixDQUFDO0lBRU8sb0JBQW9CLENBQUMsT0FBWSxFQUFFLENBQVMsRUFBRSxDQUFTO1FBQzNELE1BQU0sV0FBVyxHQUE2QixJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckYsSUFBSSxXQUFXLEVBQUU7WUFDYixJQUFJLFdBQVcsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxXQUFXLENBQUM7Z0JBQ3RDLE9BQU87YUFDVjtTQUNKO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxrQkFBa0IsQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUMzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sR0FBRyxHQUFRLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE9BQVksRUFBRSxpQkFBeUIsR0FBRyxFQUFFLFFBQWdCLEdBQUcsRUFBRSxNQUFjLEdBQUc7UUFDekcsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE9BQU87U0FDVjtRQUNELE1BQU0sZUFBZSxHQUFXLFVBQVUsR0FBRyxjQUFjLEdBQUcsZUFBZSxDQUFDO1FBQzlFLE1BQU0sVUFBVSxHQUFXLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFVBQVUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUM7UUFDbEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUM1QixPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBaUIsRUFBRSxFQUFFO1lBQzNDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osT0FBTyxFQUFFLENBQUM7WUFDZCxDQUFDLEVBQUUsY0FBYyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFlBQVksQ0FBQyxNQUFtQixFQUFFLFdBQXFDLEVBQUUsaUJBQTJDLEVBQUUsSUFBYTtRQUN2SSxJQUFJLElBQUksRUFBRSxFQUFFLHdCQUF3QjtZQUNoQyxNQUFNLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdkU7YUFBTSxFQUFFLGVBQWU7WUFDcEIsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNuRjtJQUNMLENBQUM7SUFxRE8sVUFBVTtRQUNkLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU8sS0FBSyxDQUFDLEtBQWlCO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWhGLE1BQU0sQ0FBQyxHQUFXLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDaEMsTUFBTSxDQUFDLEdBQVcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUNoQyxNQUFNLGNBQWMsR0FBUSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3pCLE1BQU0sSUFBSSxHQUNOLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hILENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvSCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9HLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNYLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDMUIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVTtnQkFDMUMsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsT0FBTzthQUNwRCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztTQUNsRDtJQUNMLENBQUM7SUFFRCxxQkFBcUI7SUFDYixRQUFRO1FBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDWCxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPO1lBQ2xDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVU7WUFDMUMsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ2xFLFdBQVcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtTQUMxRSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVPLFVBQVU7UUFDZCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7Ozs7WUF6WkosVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEluamVjdGFibGUsIE9uRGVzdHJveSwgUmVuZGVyZXIyfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Q29Ecm9wRXZlbnR9IGZyb20gXCIuLi9ldmVudC9jby1kcm9wLWV2ZW50XCI7XHJcbmltcG9ydCB7Q29EcmFnRXZlbnR9IGZyb20gXCIuLi9ldmVudC9jby1kcmFnLWV2ZW50XCI7XHJcbmltcG9ydCB7RHJhZ0Ryb3BDb250YWluZXJ9IGZyb20gXCIuLi9idXNpbmVzc29iamVjdC9kcmFnLWRyb3AtY29udGFpbmVyXCI7XHJcbmltcG9ydCB7QXJyYXlVdGlsc30gZnJvbSBcIi4uL3V0aWxzL2FycmF5LXV0aWxzXCI7XHJcbmltcG9ydCB7Q29PcmllbnRhdGlvbn0gZnJvbSBcIkBjb2xpam5pdC9jb3JlY29tcG9uZW50c192MTJcIjtcclxuaW1wb3J0IHtEcmFnRHJvcENvbnRhaW5lckVsZW1lbnR9IGZyb20gXCIuLi9idXNpbmVzc29iamVjdC9kcmFnLWRyb3AtY29udGFpbmVyLWVsZW1lbnRcIjtcclxuXHJcbi8qKlxyXG4gKiBIYW5kbGVzIGRyYWcgYW5kIGRyb3AgZWxlbWVudHNcclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIlxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJhZ0Ryb3BTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICAgIHB1YmxpYyBzZXQgcmVuZGVyZXIodmFsdWU6IFJlbmRlcmVyMikge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fc2V0RXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVG9EbzogdXNlIGRyYWcgYW5kIGRyb3AgU3ViamVjdHMgaW5zdGVhZCBhbmQgdHJhY2sgb3JpZ2luIGFuZCB0YXJnZXQgY29tcG9uZW50c1xyXG4gICAgcHVibGljIGRyYWdEYXRhOiBhbnk7XHJcblxyXG4gICAgcHVibGljIGRyYWc6IFN1YmplY3Q8Q29EcmFnRXZlbnQ+ID0gbmV3IFN1YmplY3Q8Q29EcmFnRXZlbnQ+KCk7XHJcbiAgICBwdWJsaWMgZHJvcDogU3ViamVjdDxDb0Ryb3BFdmVudD4gPSBuZXcgU3ViamVjdDxDb0Ryb3BFdmVudD4oKTtcclxuXHJcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyO1xyXG4gICAgLy8gQ29udGFpbmVyKHMpIGhvbGRpbmcgdGhlIGVsZW1lbnRzIHRvIGJlIGRyYWdnZWQuXHJcbiAgICBwcml2YXRlIF9jb250YWluZXJzOiBEcmFnRHJvcENvbnRhaW5lcltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSBfZGlzYWJsZWRDb250YWluZXJzOiBEcmFnRHJvcENvbnRhaW5lcltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSBfZHJvcFRhcmdldEVsZW1lbnQ6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudDtcclxuXHJcbiAgICAvLyBEcmFnIGhhbmRsZShzKSB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzc2VzIG9mIHRoZSBoYW5kbGVzLlxyXG4gICAgcHJpdmF0ZSBfZHJhZ0hhbmRsZXM6IGFueVtdID0gW107XHJcbiAgICBwcml2YXRlIF9pc2RyYWdnaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9kcmFnRWxlbWVudDogRHJhZ0Ryb3BDb250YWluZXJFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0luQ29udGFpbmVyOiBhbnk7XHJcbiAgICBwcml2YXRlIF9sYXN0RHJvcFRhcmdldDogRHJhZ0Ryb3BDb250YWluZXJFbGVtZW50O1xyXG4gICAgLyoqXHJcbiAgICAgKiBHaG9zdCBpbWFnZSBvZiB0aGUgZWxlbWVudCBiZWluZyBkcmFnZ2VkXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2dob3N0RHJhZ0ltYWdlOiBhbnk7XHJcblxyXG4gICAgcHJpdmF0ZSBfY2xpY2tDb3VudGVyOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgc2V0IGdob3N0TGVmdCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZ2hvc3RMZWZ0ID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fcG9zaXRpb25HaG9zdEltYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXQgZ2hvc3RUb3AodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2dob3N0VG9wID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fcG9zaXRpb25HaG9zdEltYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZ2hvc3RMZWZ0OiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfZ2hvc3RUb3A6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfbW91c2VEb3duOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfY3VycmVudE1vdXNlUG9zaXRpb246IGFueSA9IHt4OiAwLCB5OiAwfTtcclxuICAgIHByaXZhdGUgX2N1cnJlbnRNb3VzZU9mZnNldDogYW55ID0ge3g6IDAsIHk6IDB9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRDb250YWluZXIoY29udGFpbmVyOiBEcmFnRHJvcENvbnRhaW5lcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbjogQ29PcmllbnRhdGlvbiA9XHJcbiAgICAgICAgICAgIChnZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lci5lbGVtZW50KS5mbGV4RGlyZWN0aW9uID09PSBcInJvd1wiICYmIGdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyLmVsZW1lbnQpLmRpc3BsYXkgPT09IFwiZmxleFwiKVxyXG4gICAgICAgICAgICAgICAgPyBDb09yaWVudGF0aW9uLkhvcml6b250YWxcclxuICAgICAgICAgICAgICAgIDogQ29PcmllbnRhdGlvbi5WZXJ0aWNhbDtcclxuICAgICAgICBjb250YWluZXIuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lcnMucHVzaChjb250YWluZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGREcmFnSGFuZGxlKGhhbmRsZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0hhbmRsZXMucHVzaChoYW5kbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVDb250YWluZXIoY29udGFpbmVyOiBEcmFnRHJvcENvbnRhaW5lcik6IHZvaWQge1xyXG4gICAgICAgIEFycmF5VXRpbHMuUmVtb3ZlRWxlbWVudChjb250YWluZXIsIHRoaXMuX2NvbnRhaW5lcnMpO1xyXG4gICAgICAgIEFycmF5VXRpbHMuUmVtb3ZlRWxlbWVudChjb250YWluZXIsIHRoaXMuX2Rpc2FibGVkQ29udGFpbmVycyk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXJzIHx8IHRoaXMuX2NvbnRhaW5lcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlRHJhZ0hhbmRsZShoYW5kbGU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIEFycmF5VXRpbHMuUmVtb3ZlRWxlbWVudChoYW5kbGUsIHRoaXMuX2RyYWdIYW5kbGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5hYmxlQ29udGFpbmVyKGNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXIpOiB2b2lkIHtcclxuICAgICAgICBBcnJheVV0aWxzLlJlbW92ZUVsZW1lbnQoY29udGFpbmVyLCB0aGlzLl9kaXNhYmxlZENvbnRhaW5lcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNhYmxlQ29udGFpbmVyKGNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9kaXNhYmxlZENvbnRhaW5lcnMucHVzaChjb250YWluZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3JlbW92ZUxpc3RlbmVycygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9oYW5kbGVFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcIm1vdXNldXBcIiwgdGhpcy5faGFuZGxlTW91c2VVcCwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIHRoaXMuX2hhbmRsZU1vdXNlTW92ZSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldEV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9oYW5kbGVFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcIm1vdXNlZG93blwiLCB0aGlzLl9oYW5kbGVNb3VzZURvd24pOyAvL1RPRE86IG1vdXNlZG93biBvbmx5IHdpdGhpbiBnaXZlbiBjb250YWluZXJzXHJcbiAgICAgICAgdGhpcy5faGFuZGxlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgXCJtb3VzZXVwXCIsIHRoaXMuX2hhbmRsZU1vdXNlVXApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldEVsZW1lbnRDbGFzcyhlbGVtZW50OiBhbnksIGVsZW1lbnRDbGFzczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9yZW5kZXJlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsIGVsZW1lbnRDbGFzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaGFuZGxlRXZlbnRMaXN0ZW5lcihlbGVtZW50OiBhbnksIGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IGFueSwgYWRkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChhZGQpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcclxuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm5zIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBnaXZlbiBlbGVtZW50LlxyXG4gICAgcHJpdmF0ZSBfZ2V0Q29udGFpbmVyT2ZFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogRHJhZ0Ryb3BDb250YWluZXIge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjE6IG51bWJlciA9IHRoaXMuX2NvbnRhaW5lcnMubGVuZ3RoOyBpIDwgbGVuMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXIgPSB0aGlzLl9jb250YWluZXJzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpaTogbnVtYmVyID0gMCwgbGVuMjogbnVtYmVyID0gY29udGFpbmVyLmVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpaSA8IGxlbjI7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZWxlbWVudC5jaGlsZHJlbltpaV0gPT09IGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIGdpdmVuIGVsZW1lbnQgaXMgYSBjaGlsZCBvZiBjb250YWluZXIocylcclxuICAgICAqIEBwYXJhbSBlbGVtZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBpbmRleCBvZiBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2dldEVsZW1lbnRPZkNvbnRhaW5lcihlbGVtZW50OiBhbnkpOiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjE6IG51bWJlciA9IHRoaXMuX2NvbnRhaW5lcnMubGVuZ3RoOyBpIDwgbGVuMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXIgPSB0aGlzLl9jb250YWluZXJzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpaTogbnVtYmVyID0gMCwgbGVuMjogbnVtYmVyID0gY29udGFpbmVyLmVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpaSA8IGxlbjI7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZWxlbWVudC5jaGlsZHJlbltpaV0gPT09IGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2NvbnRhaW5lcjogY29udGFpbmVyLCBlbGVtZW50OiBlbGVtZW50LCBlbGVtZW50SWR4OiBpaX07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtjb250YWluZXI6IHVuZGVmaW5lZCwgZWxlbWVudDogdW5kZWZpbmVkLCBlbGVtZW50SWR4OiAtMX07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIG5leHQgc2libGluZyBvZiBjb250YWluZXIgdGhhdCBjb250YWlucyBnaXZlbiBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIGVsZW1lbnRcclxuICAgICAqIEByZXR1cm5zIHthbnl9IG51bGwgaWYgdGhlcmUgYXJlIG5vIHNpYmxpbmdzIGxlZnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZ2V0TmV4dEVsZW1lbnRJbkNvbnRhaW5lcihlbGVtZW50OiBIVE1MRWxlbWVudCk6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyOiBEcmFnRHJvcENvbnRhaW5lciA9IHRoaXMuX2dldENvbnRhaW5lck9mRWxlbWVudChlbGVtZW50KTtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwLCBsZW46IG51bWJlciA9IGNvbnRhaW5lci5lbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXIuZWxlbWVudC5jaGlsZHJlbltpXSA9PT0gZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgPCAobGVuIC0gMSkgPyB7Y29udGFpbmVyOiBjb250YWluZXIsIGVsZW1lbnQ6IDxIVE1MRWxlbWVudD5jb250YWluZXIuZWxlbWVudC5jaGlsZHJlbltpICsgMV0sIGVsZW1lbnRJZHg6IGl9IDogbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9nZXREcmFnSGFuZGxlQ2xpY2tlZChlbGVtZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ0hhbmRsZXMgJiYgdGhpcy5fZHJhZ0hhbmRsZXMubGVuZ3RoID4gMCkgeyAvLyBjaGVjayBpZiBoYW5kbGUgY2xpY2tlZFxyXG4gICAgICAgICAgICB3aGlsZSAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgbGVuOiBudW1iZXIgPSB0aGlzLl9kcmFnSGFuZGxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdCAmJiBlbGVtZW50LmNsYXNzTGlzdC5sZW5ndGggPiAwICYmICEhdGhpcy5fZHJhZ0hhbmRsZXNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMuX2RyYWdIYW5kbGVzW2ldKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlID09PSBkb2N1bWVudCA/IG51bGwgOiBlbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm5zIGVsZW1lbnQgd2hlbiBpdCdzIGEgdmFsaWQgZHJvcCB0YXJnZXQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgIHByaXZhdGUgX2dldFZhbGlkRHJhZ0Ryb3BFbGVtZW50KGVsZW1lbnQ6IGFueSwgY2hlY2tIYW5kbGU6IGJvb2xlYW4gPSBmYWxzZSk6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKGNoZWNrSGFuZGxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkSGFuZGxlQ2xpY2tlZDogYm9vbGVhbiA9IHRoaXMuX2dldERyYWdIYW5kbGVDbGlja2VkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBpZiAoIXZhbGlkSGFuZGxlQ2xpY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50T2ZDb250YWluZXI6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuX2dldEVsZW1lbnRPZkNvbnRhaW5lcihlbGVtZW50KTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRPZkNvbnRhaW5lci5lbGVtZW50SWR4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50T2ZDb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZG9jdW1lbnQgPyBudWxsIDogZWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2dldE5leHRTaWJsaW5nKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogRHJhZ0Ryb3BDb250YWluZXJFbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TmV4dEVsZW1lbnRJbkNvbnRhaW5lcihlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGluZGV4IG9mIGVsZW1lbnQgd2l0aGluIGl0cyBjb250YWluZXIuXHJcbiAgICBwcml2YXRlIF9pbmRleE9mKGVsZW1lbnQ6IGFueSk6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudE9mQ29udGFpbmVyOiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50T2ZDb250YWluZXIoZWxlbWVudC5oYXNPd25Qcm9wZXJ0eShcImVsZW1lbnRcIikgPyBlbGVtZW50LmVsZW1lbnQgOiBlbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudE9mQ29udGFpbmVyID8gZWxlbWVudE9mQ29udGFpbmVyLmVsZW1lbnRJZHggOiAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGVzIGEgZ2hvc3QgaW1hZ2UvZWxlbWVudCBvZiB0aGUgZWxlbWVudCBiZWluZyBkcmFnZ2VkLlxyXG4gICAgcHJpdmF0ZSBfY3JlYXRlR2hvc3RJbWFnZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ2hvc3REcmFnSW1hZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjcmVhdGUgZ2hvc3QgZHJhZyBpbWFnZVxyXG4gICAgICAgIGNvbnN0IG9mZnNldFJlY3Q6IGFueSA9IHRoaXMuX2dldE9mZnNldCgpO1xyXG4gICAgICAgIHRoaXMuX2dob3N0RHJhZ0ltYWdlID0gdGhpcy5fZHJhZ0VsZW1lbnQuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fZ2hvc3REcmFnSW1hZ2Uuc3R5bGUud2lkdGggPSBvZmZzZXRSZWN0LndpZHRoICsgXCJweFwiO1xyXG4gICAgICAgIHRoaXMuX2dob3N0RHJhZ0ltYWdlLnN0eWxlLmhlaWdodCA9IG9mZnNldFJlY3QuaGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICAgIHRoaXMuZ2hvc3RMZWZ0ID0gb2Zmc2V0UmVjdC5sZWZ0O1xyXG4gICAgICAgIHRoaXMuZ2hvc3RUb3AgPSBvZmZzZXRSZWN0LnRvcDtcclxuICAgICAgICB0aGlzLl9zZXRFbGVtZW50Q2xhc3ModGhpcy5fZ2hvc3REcmFnSW1hZ2UsIFwiZ2hvc3QtaW1hZ2VcIik7XHJcbiAgICAgICAgdGhpcy5fc2V0RWxlbWVudENsYXNzKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIFwibm8tc2VsZWN0XCIpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZ2hvc3REcmFnSW1hZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2Rlc3Ryb3lHaG9zdEltYWdlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9naG9zdERyYWdJbWFnZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5hY3RpdmVFbGVtZW50LCBcIm5vLXNlbGVjdFwiKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLl9naG9zdERyYWdJbWFnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2dob3N0RHJhZ0ltYWdlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBQb3NpdGlvbnMgdGhlIGdob3N0IGltYWdlIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy5cclxuICAgIHByaXZhdGUgX3Bvc2l0aW9uR2hvc3RJbWFnZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2dob3N0RHJhZ0ltYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZ2hvc3REcmFnSW1hZ2Uuc3R5bGUubGVmdCA9IHRoaXMuX2dob3N0TGVmdCArIFwicHhcIjtcclxuICAgICAgICB0aGlzLl9naG9zdERyYWdJbWFnZS5zdHlsZS50b3AgPSB0aGlzLl9naG9zdFRvcCArIFwicHhcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9nZXRTY3JvbGwoc2Nyb2xsUHJvcDogc3RyaW5nLCBvZmZzZXRQcm9wOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNsaWVudEhlaWdodCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFtzY3JvbGxQcm9wXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHlbc2Nyb2xsUHJvcF07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZ2V0T2Zmc2V0KCk6IENsaWVudFJlY3Qge1xyXG4gICAgICAgIGNvbnN0IHJlY3Q6IENsaWVudFJlY3QgPSB0aGlzLl9kcmFnRWxlbWVudC5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJvdHRvbTogcmVjdC5ib3R0b20sXHJcbiAgICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXHJcbiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCArIHNjcm9sbExlZnQsXHJcbiAgICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0LFxyXG4gICAgICAgICAgICB0b3A6IHJlY3QudG9wICsgc2Nyb2xsVG9wLFxyXG4gICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZGV0ZXJtaW5lRHJvcHRhcmdldChlbGVtZW50OiBhbnksIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZHJvcEVsZW1lbnQ6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuX2dldFZhbGlkRHJhZ0Ryb3BFbGVtZW50KGVsZW1lbnQpO1xyXG4gICAgICAgIGlmIChkcm9wRWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoZHJvcEVsZW1lbnQuZWxlbWVudCAhPT0gdGhpcy5fZHJhZ0VsZW1lbnQuZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJvcFRhcmdldEVsZW1lbnQgPSBkcm9wRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kcm9wVGFyZ2V0RWxlbWVudCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCcmllZmx5IGhpZGVzIHRoZSBnaG9zdCBpbWFnZSB0byBiZSBhYmxlIHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50IGlzIHVuZGVyIG1vdXNlLlxyXG4gICAgICogQHBhcmFtIHhcclxuICAgICAqIEBwYXJhbSB5XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gVG9wIGxldmVsIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZ2V0SG92ZXJlZEVsZW1lbnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBhbnkge1xyXG4gICAgICAgIHRoaXMuX3NldEVsZW1lbnRDbGFzcyh0aGlzLl9naG9zdERyYWdJbWFnZSwgXCJnaG9zdC1pbWFnZS1oaWRlXCIpO1xyXG4gICAgICAgIGNvbnN0IGVsbTogYW55ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLl9naG9zdERyYWdJbWFnZSwgXCJnaG9zdC1pbWFnZS1oaWRlXCIpO1xyXG4gICAgICAgIHJldHVybiBlbG07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfYW5pbWF0ZVZpc2liaWxpdHkoZWxlbWVudDogYW55LCB0cmFuc2l0aW9uVGltZTogbnVtYmVyID0gMC4yLCBzdGFydDogc3RyaW5nID0gXCIwXCIsIGVuZDogc3RyaW5nID0gXCIxXCIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0cmFuc2l0aW9uU3R5bGU6IHN0cmluZyA9IFwib3BhY2l0eSBcIiArIHRyYW5zaXRpb25UaW1lICsgXCJzIGVhc2UtaW4tb3V0XCI7XHJcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbjogc3RyaW5nID0gZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IHRyYW5zaXRpb24gKyAodHJhbnNpdGlvbiA/IFwiLFwiIDogXCJcIikgKyB0cmFuc2l0aW9uU3R5bGU7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gc3RhcnQ7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gZW5kO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZTogRnVuY3Rpb24pID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0sIHRyYW5zaXRpb25UaW1lICogMTAwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfYW5pbWF0ZU1vdmUocGFyZW50OiBIVE1MRWxlbWVudCwgZHJhZ0VsZW1lbnQ6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCwgZHJvcFRhcmdldEVsZW1lbnQ6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCwgZG93bjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmIChkb3duKSB7IC8vIGluc2VydCBlbGVtZW50IGJlZm9yZVxyXG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdFbGVtZW50LmVsZW1lbnQsIGRyb3BUYXJnZXRFbGVtZW50LmVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7IC8vIGluc2VydCBhZnRlclxyXG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdFbGVtZW50LmVsZW1lbnQsIGRyb3BUYXJnZXRFbGVtZW50LmVsZW1lbnQubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGVzIHRoZSBtb3VzZSBkb3duIGV2ZW50LiBTYXZlcyB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbi5cclxuICAgIHByaXZhdGUgX2hhbmRsZU1vdXNlRG93bjogRnVuY3Rpb24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgICB0aGlzLl9jdXJyZW50TW91c2VQb3NpdGlvbi54ID0gZXZlbnQuc2NyZWVuWDtcclxuICAgICAgICB0aGlzLl9jdXJyZW50TW91c2VQb3NpdGlvbi55ID0gZXZlbnQuc2NyZWVuWTtcclxuICAgICAgICBpZiAoZXZlbnQuYnV0dG9ucyAhPT0gMSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBlbGVtZW50OiBhbnkgPSBldmVudC50YXJnZXQgPyBldmVudC50YXJnZXQgOiBldmVudC5zcmNFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGRyYWdFbGVtZW50OiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLl9nZXRWYWxpZERyYWdEcm9wRWxlbWVudChlbGVtZW50LCB0cnVlKTtcclxuICAgICAgICBpZiAoIWRyYWdFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2Rpc2FibGVkQ29udGFpbmVycy5pbmRleE9mKGRyYWdFbGVtZW50LmNvbnRhaW5lcikgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZHJhZ0VsZW1lbnQgPSBkcmFnRWxlbWVudDtcclxuICAgICAgICB0aGlzLl9kcmFnSW5Db250YWluZXIgPSBkcmFnRWxlbWVudC5jb250YWluZXIuZWxlbWVudDtcclxuICAgICAgICBjb25zdCBvZmZzZXQ6IGFueSA9IHRoaXMuX2dldE9mZnNldCgpO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRNb3VzZU9mZnNldC54ID0gZXZlbnQuY2xpZW50WCAtIG9mZnNldC5sZWZ0O1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRNb3VzZU9mZnNldC55ID0gZXZlbnQuY2xpZW50WSAtIG9mZnNldC50b3A7XHJcbiAgICAgICAgdGhpcy5fbW91c2VEb3duID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCB0aGlzLl9oYW5kbGVNb3VzZU1vdmUpO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrQ291bnRlcisrO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2hhbmRsZU1vdXNlVXA6IEZ1bmN0aW9uID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgICAgdGhpcy5fbW91c2VEb3duID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgXCJtb3VzZW1vdmVcIiwgdGhpcy5faGFuZGxlTW91c2VNb3ZlLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tDb3VudGVyLS07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pc2RyYWdnaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZERyYWcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaGFuZGxlTW91c2VNb3ZlOiBGdW5jdGlvbiA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZHJhZz9cclxuICAgICAgICBpZiAoIXRoaXMuX2RyYWdFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gb25seSBkcmFnIHdoZW4gbW91c2UgZG93biBhbmQgdGhlcmUgYWN0dWFsbHkgaXMgbW92ZW1lbnRcclxuICAgICAgICBpZiAoIXRoaXMuX21vdXNlRG93biB8fCAodGhpcy5fY3VycmVudE1vdXNlUG9zaXRpb24ueCA9PT0gZXZlbnQuc2NyZWVuWCAmJiB0aGlzLl9jdXJyZW50TW91c2VQb3NpdGlvbi55ID09PSBldmVudC5zY3JlZW5ZKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzZHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0RHJhZygpO1xyXG4gICAgICAgIHRoaXMuX2RyYWcoZXZlbnQpO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLnggPSBldmVudC5zY3JlZW5YO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLnkgPSBldmVudC5zY3JlZW5ZO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3N0YXJ0RHJhZygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVHaG9zdEltYWdlKCk7XHJcbiAgICAgICAgdGhpcy5fc2V0RWxlbWVudENsYXNzKHRoaXMuX2RyYWdFbGVtZW50LmVsZW1lbnQsIFwiaXMtZHJhZ2dlZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9kcmFnKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5naG9zdExlZnQgPSB0aGlzLl9naG9zdExlZnQgKyAoZXZlbnQuc2NyZWVuWCAtIHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLngpO1xyXG4gICAgICAgIHRoaXMuZ2hvc3RUb3AgPSB0aGlzLl9naG9zdFRvcCArIChldmVudC5zY3JlZW5ZIC0gdGhpcy5fY3VycmVudE1vdXNlUG9zaXRpb24ueSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHg6IG51bWJlciA9IGV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgY29uc3QgeTogbnVtYmVyID0gZXZlbnQuY2xpZW50WTtcclxuICAgICAgICBjb25zdCBob3ZlcmVkRWxlbWVudDogYW55ID0gdGhpcy5fZ2V0SG92ZXJlZEVsZW1lbnQoeCwgeSk7XHJcbiAgICAgICAgdGhpcy5fZGV0ZXJtaW5lRHJvcHRhcmdldChob3ZlcmVkRWxlbWVudCwgeCwgeSk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Ryb3BUYXJnZXRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvd246IGJvb2xlYW4gPVxyXG4gICAgICAgICAgICAgICAgKHRoaXMuX2Ryb3BUYXJnZXRFbGVtZW50LmNvbnRhaW5lci5kaXJlY3Rpb24gPT09IENvT3JpZW50YXRpb24uVmVydGljYWwgJiYgZXZlbnQuc2NyZWVuWSA+IHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLnkpIHx8XHJcbiAgICAgICAgICAgICAgICAodGhpcy5fZHJvcFRhcmdldEVsZW1lbnQuY29udGFpbmVyLmRpcmVjdGlvbiA9PT0gQ29PcmllbnRhdGlvbi5Ib3Jpem9udGFsICYmIGV2ZW50LnNjcmVlblggPiB0aGlzLl9jdXJyZW50TW91c2VQb3NpdGlvbi54KTtcclxuICAgICAgICAgICAgdGhpcy5fYW5pbWF0ZU1vdmUodGhpcy5fZHJvcFRhcmdldEVsZW1lbnQuY29udGFpbmVyLmVsZW1lbnQsIHRoaXMuX2RyYWdFbGVtZW50LCB0aGlzLl9kcm9wVGFyZ2V0RWxlbWVudCwgZG93bik7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZy5uZXh0KHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuX2RyYWdFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudEluZGV4OiB0aGlzLl9kcmFnRWxlbWVudC5lbGVtZW50SWR4LFxyXG4gICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLl9kcm9wVGFyZ2V0RWxlbWVudC5jb250YWluZXIuZWxlbWVudFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdERyb3BUYXJnZXQgPSB0aGlzLl9kcm9wVGFyZ2V0RWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZWxlbWVudCBpcyBkcm9wcGVkXHJcbiAgICBwcml2YXRlIF9lbmREcmFnKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX2RyYWdFbGVtZW50LmVsZW1lbnQsIFwiaXMtZHJhZ2dlZFwiKTtcclxuICAgICAgICB0aGlzLl9kZXN0cm95R2hvc3RJbWFnZSgpO1xyXG4gICAgICAgIHRoaXMuZHJvcC5uZXh0KHtcclxuICAgICAgICAgICAgZWxlbWVudDogdGhpcy5fZHJhZ0VsZW1lbnQuZWxlbWVudCxcclxuICAgICAgICAgICAgZWxlbWVudEluZGV4OiB0aGlzLl9kcmFnRWxlbWVudC5lbGVtZW50SWR4LFxyXG4gICAgICAgICAgICB0YXJnZXQ6IHRoaXMuX2xhc3REcm9wVGFyZ2V0ID8gdGhpcy5fbGFzdERyb3BUYXJnZXQuZWxlbWVudCA6IG51bGwsXHJcbiAgICAgICAgICAgIHRhcmdldEluZGV4OiB0aGlzLl9sYXN0RHJvcFRhcmdldCA/IHRoaXMuX2xhc3REcm9wVGFyZ2V0LmVsZW1lbnRJZHggOiAtMSwgLy8gaXRlbXMgYXJlIGFscmVhZHkgc2hpZnRlZCBzbyBzdWJ0cmFjdCAxIGZyb20gdGFyZ2V0IGluZGV4XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5fbGFzdERyb3BUYXJnZXQgPyB0aGlzLl9sYXN0RHJvcFRhcmdldC5jb250YWluZXIgOiBudWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXREcmFnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVzZXREcmFnKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RyYWdFbGVtZW50ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kcmFnSW5Db250YWluZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2xhc3REcm9wVGFyZ2V0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9pc2RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { Subject } from "rxjs";
|
|
3
|
+
import { ArrayUtils } from "../utils/array-utils";
|
|
4
|
+
import { CoOrientation } from "@colijnit/corecomponents_v12";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Handles drag and drop elements
|
|
8
|
+
*/
|
|
9
|
+
export class DragDropService {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.drag = new Subject();
|
|
12
|
+
this.drop = new Subject();
|
|
13
|
+
// Container(s) holding the elements to be dragged.
|
|
14
|
+
this._containers = [];
|
|
15
|
+
this._disabledContainers = [];
|
|
16
|
+
// Drag handle(s) that contains the classes of the handles.
|
|
17
|
+
this._dragHandles = [];
|
|
18
|
+
this._isdragging = false;
|
|
19
|
+
this._clickCounter = 0;
|
|
20
|
+
this._ghostLeft = 0;
|
|
21
|
+
this._ghostTop = 0;
|
|
22
|
+
this._mouseDown = false;
|
|
23
|
+
this._currentMousePosition = { x: 0, y: 0 };
|
|
24
|
+
this._currentMouseOffset = { x: 0, y: 0 };
|
|
25
|
+
// Handles the mouse down event. Saves the current mouse position.
|
|
26
|
+
this._handleMouseDown = (event) => {
|
|
27
|
+
this._currentMousePosition.x = event.screenX;
|
|
28
|
+
this._currentMousePosition.y = event.screenY;
|
|
29
|
+
if (event.buttons !== 1 || event.metaKey || event.ctrlKey) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const element = event.target ? event.target : event.srcElement;
|
|
33
|
+
const dragElement = this._getValidDragDropElement(element, true);
|
|
34
|
+
if (!dragElement) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (this._disabledContainers.indexOf(dragElement.container) !== -1) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this._dragElement = dragElement;
|
|
41
|
+
this._dragInContainer = dragElement.container.element;
|
|
42
|
+
const offset = this._getOffset();
|
|
43
|
+
this._currentMouseOffset.x = event.clientX - offset.left;
|
|
44
|
+
this._currentMouseOffset.y = event.clientY - offset.top;
|
|
45
|
+
this._mouseDown = true;
|
|
46
|
+
this._handleEventListener(document, "mousemove", this._handleMouseMove);
|
|
47
|
+
this._clickCounter++;
|
|
48
|
+
};
|
|
49
|
+
this._handleMouseUp = (event) => {
|
|
50
|
+
this._mouseDown = false;
|
|
51
|
+
this._handleEventListener(document, "mousemove", this._handleMouseMove, false);
|
|
52
|
+
this._clickCounter--;
|
|
53
|
+
if (this._isdragging) {
|
|
54
|
+
this._endDrag();
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
this._handleMouseMove = (event) => {
|
|
58
|
+
// nothing to drag?
|
|
59
|
+
if (!this._dragElement) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// only drag when mouse down and there actually is movement
|
|
63
|
+
if (!this._mouseDown || (this._currentMousePosition.x === event.screenX && this._currentMousePosition.y === event.screenY)) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this._isdragging = true;
|
|
67
|
+
this._startDrag();
|
|
68
|
+
this._drag(event);
|
|
69
|
+
this._currentMousePosition.x = event.screenX;
|
|
70
|
+
this._currentMousePosition.y = event.screenY;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
set renderer(value) {
|
|
74
|
+
this._renderer = value;
|
|
75
|
+
this._setEvents();
|
|
76
|
+
}
|
|
77
|
+
set ghostLeft(value) {
|
|
78
|
+
this._ghostLeft = value;
|
|
79
|
+
this._positionGhostImage();
|
|
80
|
+
}
|
|
81
|
+
set ghostTop(value) {
|
|
82
|
+
this._ghostTop = value;
|
|
83
|
+
this._positionGhostImage();
|
|
84
|
+
}
|
|
85
|
+
ngOnDestroy() {
|
|
86
|
+
this._removeListeners();
|
|
87
|
+
}
|
|
88
|
+
addContainer(container) {
|
|
89
|
+
const direction = (getComputedStyle(container.element).flexDirection === "row" && getComputedStyle(container.element).display === "flex")
|
|
90
|
+
? CoOrientation.Horizontal
|
|
91
|
+
: CoOrientation.Vertical;
|
|
92
|
+
container.direction = direction;
|
|
93
|
+
this._containers.push(container);
|
|
94
|
+
}
|
|
95
|
+
addDragHandle(handle) {
|
|
96
|
+
this._dragHandles.push(handle);
|
|
97
|
+
}
|
|
98
|
+
removeContainer(container) {
|
|
99
|
+
ArrayUtils.RemoveElement(container, this._containers);
|
|
100
|
+
ArrayUtils.RemoveElement(container, this._disabledContainers);
|
|
101
|
+
if (!this._containers || this._containers.length === 0) {
|
|
102
|
+
this._removeListeners();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
removeDragHandle(handle) {
|
|
106
|
+
ArrayUtils.RemoveElement(handle, this._dragHandles);
|
|
107
|
+
}
|
|
108
|
+
enableContainer(container) {
|
|
109
|
+
ArrayUtils.RemoveElement(container, this._disabledContainers);
|
|
110
|
+
}
|
|
111
|
+
disableContainer(container) {
|
|
112
|
+
this._disabledContainers.push(container);
|
|
113
|
+
}
|
|
114
|
+
_removeListeners() {
|
|
115
|
+
this._handleEventListener(document, "mouseup", this._handleMouseUp, false);
|
|
116
|
+
this._handleEventListener(document, "mousemove", this._handleMouseMove, false);
|
|
117
|
+
}
|
|
118
|
+
_setEvents() {
|
|
119
|
+
this._handleEventListener(document, "mousedown", this._handleMouseDown); //TODO: mousedown only within given containers
|
|
120
|
+
this._handleEventListener(document, "mouseup", this._handleMouseUp);
|
|
121
|
+
}
|
|
122
|
+
_setElementClass(element, elementClass) {
|
|
123
|
+
if (!this._renderer) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
this._renderer.addClass(element, elementClass);
|
|
127
|
+
}
|
|
128
|
+
_handleEventListener(element, event, handler, add = true) {
|
|
129
|
+
if (add) {
|
|
130
|
+
element.removeEventListener(event, handler);
|
|
131
|
+
element.addEventListener(event, handler);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
element.removeEventListener(event, handler);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Returns the container that holds given element.
|
|
138
|
+
_getContainerOfElement(element) {
|
|
139
|
+
for (let i = 0, len1 = this._containers.length; i < len1; i++) {
|
|
140
|
+
const container = this._containers[i];
|
|
141
|
+
for (let ii = 0, len2 = container.element.children.length; ii < len2; ii++) {
|
|
142
|
+
if (container.element.children[ii] === element) {
|
|
143
|
+
return container;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Checks if given element is a child of container(s)
|
|
150
|
+
* @param element
|
|
151
|
+
* @returns {number} index of element
|
|
152
|
+
*/
|
|
153
|
+
_getElementOfContainer(element) {
|
|
154
|
+
for (let i = 0, len1 = this._containers.length; i < len1; i++) {
|
|
155
|
+
const container = this._containers[i];
|
|
156
|
+
for (let ii = 0, len2 = container.element.children.length; ii < len2; ii++) {
|
|
157
|
+
if (container.element.children[ii] === element) {
|
|
158
|
+
return { container: container, element: element, elementIdx: ii };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return { container: undefined, element: undefined, elementIdx: -1 };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Returns next sibling of container that contains given element.
|
|
166
|
+
* @param element
|
|
167
|
+
* @returns {any} null if there are no siblings left
|
|
168
|
+
*/
|
|
169
|
+
_getNextElementInContainer(element) {
|
|
170
|
+
const container = this._getContainerOfElement(element);
|
|
171
|
+
for (let i = 0, len = container.element.children.length; i < len; i++) {
|
|
172
|
+
if (container.element.children[i] === element) {
|
|
173
|
+
return i < (len - 1) ? { container: container, element: container.element.children[i + 1], elementIdx: i } : null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
_getDragHandleClicked(element) {
|
|
178
|
+
if (this._dragHandles && this._dragHandles.length > 0) { // check if handle clicked
|
|
179
|
+
while (element) {
|
|
180
|
+
for (let i = 0, len = this._dragHandles.length; i < len; i++) {
|
|
181
|
+
if (element.classList && element.classList.length > 0 && !!this._dragHandles[i]) {
|
|
182
|
+
if (element.classList.contains(this._dragHandles[i])) {
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
element = element.parentNode === document ? null : element.parentNode;
|
|
188
|
+
}
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Returns element when it's a valid drop target, false otherwise.
|
|
196
|
+
_getValidDragDropElement(element, checkHandle = false) {
|
|
197
|
+
if (checkHandle) {
|
|
198
|
+
const validHandleClicked = this._getDragHandleClicked(element);
|
|
199
|
+
if (!validHandleClicked) {
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
while (element) {
|
|
204
|
+
const elementOfContainer = this._getElementOfContainer(element);
|
|
205
|
+
if (elementOfContainer.elementIdx > -1) {
|
|
206
|
+
return elementOfContainer;
|
|
207
|
+
}
|
|
208
|
+
element = element.parentNode === document ? null : element.parentNode;
|
|
209
|
+
}
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
_getNextSibling(element) {
|
|
213
|
+
return this._getNextElementInContainer(element);
|
|
214
|
+
}
|
|
215
|
+
// Returns the current index of element within its container.
|
|
216
|
+
_indexOf(element) {
|
|
217
|
+
const elementOfContainer = this._getElementOfContainer(element.hasOwnProperty("element") ? element.element : element);
|
|
218
|
+
return elementOfContainer ? elementOfContainer.elementIdx : -1;
|
|
219
|
+
}
|
|
220
|
+
// Creates a ghost image/element of the element being dragged.
|
|
221
|
+
_createGhostImage() {
|
|
222
|
+
if (this._ghostDragImage) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// create ghost drag image
|
|
226
|
+
const offsetRect = this._getOffset();
|
|
227
|
+
this._ghostDragImage = this._dragElement.element.cloneNode(true);
|
|
228
|
+
this._ghostDragImage.style.width = offsetRect.width + "px";
|
|
229
|
+
this._ghostDragImage.style.height = offsetRect.height + "px";
|
|
230
|
+
this.ghostLeft = offsetRect.left;
|
|
231
|
+
this.ghostTop = offsetRect.top;
|
|
232
|
+
this._setElementClass(this._ghostDragImage, "ghost-image");
|
|
233
|
+
this._setElementClass(document.activeElement, "no-select");
|
|
234
|
+
document.body.appendChild(this._ghostDragImage);
|
|
235
|
+
}
|
|
236
|
+
_destroyGhostImage() {
|
|
237
|
+
if (this._ghostDragImage) {
|
|
238
|
+
this._renderer.removeClass(document.activeElement, "no-select");
|
|
239
|
+
document.body.removeChild(this._ghostDragImage);
|
|
240
|
+
this._ghostDragImage = undefined;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Positions the ghost image at the given coordinates.
|
|
244
|
+
_positionGhostImage() {
|
|
245
|
+
if (!this._ghostDragImage) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
this._ghostDragImage.style.left = this._ghostLeft + "px";
|
|
249
|
+
this._ghostDragImage.style.top = this._ghostTop + "px";
|
|
250
|
+
}
|
|
251
|
+
_getScroll(scrollProp, offsetProp) {
|
|
252
|
+
if (document.activeElement.clientHeight) {
|
|
253
|
+
return document.activeElement[scrollProp];
|
|
254
|
+
}
|
|
255
|
+
return document.body[scrollProp];
|
|
256
|
+
}
|
|
257
|
+
_getOffset() {
|
|
258
|
+
const rect = this._dragElement.element.getBoundingClientRect();
|
|
259
|
+
const scrollLeft = 0;
|
|
260
|
+
const scrollTop = 0;
|
|
261
|
+
return {
|
|
262
|
+
bottom: rect.bottom,
|
|
263
|
+
height: rect.height,
|
|
264
|
+
left: rect.left + scrollLeft,
|
|
265
|
+
right: rect.right,
|
|
266
|
+
top: rect.top + scrollTop,
|
|
267
|
+
width: rect.width
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
_determineDroptarget(element, x, y) {
|
|
271
|
+
const dropElement = this._getValidDragDropElement(element);
|
|
272
|
+
if (dropElement) {
|
|
273
|
+
if (dropElement.element !== this._dragElement.element) {
|
|
274
|
+
this._dropTargetElement = dropElement;
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
this._dropTargetElement = null;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Briefly hides the ghost image to be able to determine which element is under mouse.
|
|
282
|
+
* @param x
|
|
283
|
+
* @param y
|
|
284
|
+
* @returns {Element} Top level element
|
|
285
|
+
*/
|
|
286
|
+
_getHoveredElement(x, y) {
|
|
287
|
+
this._setElementClass(this._ghostDragImage, "ghost-image-hide");
|
|
288
|
+
const elm = document.elementFromPoint(x, y);
|
|
289
|
+
this._renderer.removeClass(this._ghostDragImage, "ghost-image-hide");
|
|
290
|
+
return elm;
|
|
291
|
+
}
|
|
292
|
+
_animateVisibility(element, transitionTime = 0.2, start = "0", end = "1") {
|
|
293
|
+
if (!element) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const transitionStyle = "opacity " + transitionTime + "s ease-in-out";
|
|
297
|
+
const transition = element.style.transition;
|
|
298
|
+
element.style.transition = transition + (transition ? "," : "") + transitionStyle;
|
|
299
|
+
element.style.opacity = start;
|
|
300
|
+
element.style.opacity = end;
|
|
301
|
+
return new Promise((resolve) => {
|
|
302
|
+
setTimeout(() => {
|
|
303
|
+
resolve();
|
|
304
|
+
}, transitionTime * 1000);
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
_animateMove(parent, dragElement, dropTargetElement, down) {
|
|
308
|
+
if (down) { // insert element before
|
|
309
|
+
parent.insertBefore(dragElement.element, dropTargetElement.element);
|
|
310
|
+
}
|
|
311
|
+
else { // insert after
|
|
312
|
+
parent.insertBefore(dragElement.element, dropTargetElement.element.nextSibling);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
_startDrag() {
|
|
316
|
+
this._createGhostImage();
|
|
317
|
+
this._setElementClass(this._dragElement.element, "is-dragged");
|
|
318
|
+
}
|
|
319
|
+
_drag(event) {
|
|
320
|
+
this.ghostLeft = this._ghostLeft + (event.screenX - this._currentMousePosition.x);
|
|
321
|
+
this.ghostTop = this._ghostTop + (event.screenY - this._currentMousePosition.y);
|
|
322
|
+
const x = event.clientX;
|
|
323
|
+
const y = event.clientY;
|
|
324
|
+
const hoveredElement = this._getHoveredElement(x, y);
|
|
325
|
+
this._determineDroptarget(hoveredElement, x, y);
|
|
326
|
+
if (this._dropTargetElement) {
|
|
327
|
+
const down = (this._dropTargetElement.container.direction === CoOrientation.Vertical && event.screenY > this._currentMousePosition.y) ||
|
|
328
|
+
(this._dropTargetElement.container.direction === CoOrientation.Horizontal && event.screenX > this._currentMousePosition.x);
|
|
329
|
+
this._animateMove(this._dropTargetElement.container.element, this._dragElement, this._dropTargetElement, down);
|
|
330
|
+
this.drag.next({
|
|
331
|
+
element: this._dragElement,
|
|
332
|
+
elementIndex: this._dragElement.elementIdx,
|
|
333
|
+
source: this._dropTargetElement.container.element
|
|
334
|
+
});
|
|
335
|
+
this._lastDropTarget = this._dropTargetElement;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// element is dropped
|
|
339
|
+
_endDrag() {
|
|
340
|
+
this._renderer.removeClass(this._dragElement.element, "is-dragged");
|
|
341
|
+
this._destroyGhostImage();
|
|
342
|
+
this.drop.next({
|
|
343
|
+
element: this._dragElement.element,
|
|
344
|
+
elementIndex: this._dragElement.elementIdx,
|
|
345
|
+
target: this._lastDropTarget ? this._lastDropTarget.element : null,
|
|
346
|
+
targetIndex: this._lastDropTarget ? this._lastDropTarget.elementIdx : -1,
|
|
347
|
+
container: this._lastDropTarget ? this._lastDropTarget.container : null
|
|
348
|
+
});
|
|
349
|
+
this._resetDrag();
|
|
350
|
+
}
|
|
351
|
+
_resetDrag() {
|
|
352
|
+
this._dragElement = null;
|
|
353
|
+
this._dragInContainer = null;
|
|
354
|
+
this._lastDropTarget = null;
|
|
355
|
+
this._isdragging = false;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
DragDropService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DragDropService_Factory() { return new DragDropService(); }, token: DragDropService, providedIn: "root" });
|
|
359
|
+
DragDropService.decorators = [
|
|
360
|
+
{ type: Injectable, args: [{
|
|
361
|
+
providedIn: "root"
|
|
362
|
+
},] }
|
|
363
|
+
];
|
|
364
|
+
DragDropService.ctorParameters = () => [];
|
|
365
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWRjb21wb25lbnRzL3NyYy9saWIvc2VydmljZS9kcmFnLWRyb3Auc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksVUFBVSxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBSTdCLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sOEJBQThCLENBQUM7O0FBRzNEOztHQUVHO0FBSUgsTUFBTSxPQUFPLGVBQWU7SUFtRHhCO1FBMUNPLFNBQUksR0FBeUIsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUN4RCxTQUFJLEdBQXlCLElBQUksT0FBTyxFQUFlLENBQUM7UUFHL0QsbURBQW1EO1FBQzNDLGdCQUFXLEdBQXdCLEVBQUUsQ0FBQztRQUV0Qyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBSXRELDJEQUEyRDtRQUNuRCxpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQVM3QixrQkFBYSxHQUFXLENBQUMsQ0FBQztRQVkxQixlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLGNBQVMsR0FBVyxDQUFDLENBQUM7UUFFdEIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUU1QiwwQkFBcUIsR0FBUSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO1FBQzFDLHdCQUFtQixHQUFRLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7UUFvUWhELGtFQUFrRTtRQUMxRCxxQkFBZ0IsR0FBYSxDQUFDLEtBQWlCLEVBQVEsRUFBRTtZQUM3RCxJQUFJLENB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QUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtTQUMxRSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVPLFVBQVU7UUFDZCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7Ozs7WUF6WkosVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEluamVjdGFibGUsIE9uRGVzdHJveSwgUmVuZGVyZXIyfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtDb0Ryb3BFdmVudH0gZnJvbSBcIi4uL2V2ZW50L2NvLWRyb3AtZXZlbnRcIjtcbmltcG9ydCB7Q29EcmFnRXZlbnR9IGZyb20gXCIuLi9ldmVudC9jby1kcmFnLWV2ZW50XCI7XG5pbXBvcnQge0RyYWdEcm9wQ29udGFpbmVyfSBmcm9tIFwiLi4vYnVzaW5lc3NvYmplY3QvZHJhZy1kcm9wLWNvbnRhaW5lclwiO1xuaW1wb3J0IHtBcnJheVV0aWxzfSBmcm9tIFwiLi4vdXRpbHMvYXJyYXktdXRpbHNcIjtcbmltcG9ydCB7Q29PcmllbnRhdGlvbn0gZnJvbSBcIkBjb2xpam5pdC9jb3JlY29tcG9uZW50c192MTJcIjtcbmltcG9ydCB7RHJhZ0Ryb3BDb250YWluZXJFbGVtZW50fSBmcm9tIFwiLi4vYnVzaW5lc3NvYmplY3QvZHJhZy1kcm9wLWNvbnRhaW5lci1lbGVtZW50XCI7XG5cbi8qKlxuICogSGFuZGxlcyBkcmFnIGFuZCBkcm9wIGVsZW1lbnRzXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogXCJyb290XCJcbn0pXG5leHBvcnQgY2xhc3MgRHJhZ0Ryb3BTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwdWJsaWMgc2V0IHJlbmRlcmVyKHZhbHVlOiBSZW5kZXJlcjIpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fc2V0RXZlbnRzKCk7XG4gICAgfVxuXG4gICAgLy8gVG9EbzogdXNlIGRyYWcgYW5kIGRyb3AgU3ViamVjdHMgaW5zdGVhZCBhbmQgdHJhY2sgb3JpZ2luIGFuZCB0YXJnZXQgY29tcG9uZW50c1xuICAgIHB1YmxpYyBkcmFnRGF0YTogYW55O1xuXG4gICAgcHVibGljIGRyYWc6IFN1YmplY3Q8Q29EcmFnRXZlbnQ+ID0gbmV3IFN1YmplY3Q8Q29EcmFnRXZlbnQ+KCk7XG4gICAgcHVibGljIGRyb3A6IFN1YmplY3Q8Q29Ecm9wRXZlbnQ+ID0gbmV3IFN1YmplY3Q8Q29Ecm9wRXZlbnQ+KCk7XG5cbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyO1xuICAgIC8vIENvbnRhaW5lcihzKSBob2xkaW5nIHRoZSBlbGVtZW50cyB0byBiZSBkcmFnZ2VkLlxuICAgIHByaXZhdGUgX2NvbnRhaW5lcnM6IERyYWdEcm9wQ29udGFpbmVyW10gPSBbXTtcblxuICAgIHByaXZhdGUgX2Rpc2FibGVkQ29udGFpbmVyczogRHJhZ0Ryb3BDb250YWluZXJbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBfZHJvcFRhcmdldEVsZW1lbnQ6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudDtcblxuICAgIC8vIERyYWcgaGFuZGxlKHMpIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzZXMgb2YgdGhlIGhhbmRsZXMuXG4gICAgcHJpdmF0ZSBfZHJhZ0hhbmRsZXM6IGFueVtdID0gW107XG4gICAgcHJpdmF0ZSBfaXNkcmFnZ2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2RyYWdFbGVtZW50OiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfZHJhZ0luQ29udGFpbmVyOiBhbnk7XG4gICAgcHJpdmF0ZSBfbGFzdERyb3BUYXJnZXQ6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudDtcbiAgICAvKipcbiAgICAgKiBHaG9zdCBpbWFnZSBvZiB0aGUgZWxlbWVudCBiZWluZyBkcmFnZ2VkXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2hvc3REcmFnSW1hZ2U6IGFueTtcblxuICAgIHByaXZhdGUgX2NsaWNrQ291bnRlcjogbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgc2V0IGdob3N0TGVmdCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2dob3N0TGVmdCA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9wb3NpdGlvbkdob3N0SW1hZ2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldCBnaG9zdFRvcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2dob3N0VG9wID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uR2hvc3RJbWFnZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dob3N0TGVmdDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIF9naG9zdFRvcDogbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgX21vdXNlRG93bjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfY3VycmVudE1vdXNlUG9zaXRpb246IGFueSA9IHt4OiAwLCB5OiAwfTtcbiAgICBwcml2YXRlIF9jdXJyZW50TW91c2VPZmZzZXQ6IGFueSA9IHt4OiAwLCB5OiAwfTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ29udGFpbmVyKGNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uOiBDb09yaWVudGF0aW9uID1cbiAgICAgICAgICAgIChnZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lci5lbGVtZW50KS5mbGV4RGlyZWN0aW9uID09PSBcInJvd1wiICYmIGdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyLmVsZW1lbnQpLmRpc3BsYXkgPT09IFwiZmxleFwiKVxuICAgICAgICAgICAgICAgID8gQ29PcmllbnRhdGlvbi5Ib3Jpem9udGFsXG4gICAgICAgICAgICAgICAgOiBDb09yaWVudGF0aW9uLlZlcnRpY2FsO1xuICAgICAgICBjb250YWluZXIuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICB0aGlzLl9jb250YWluZXJzLnB1c2goY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRHJhZ0hhbmRsZShoYW5kbGU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kcmFnSGFuZGxlcy5wdXNoKGhhbmRsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUNvbnRhaW5lcihjb250YWluZXI6IERyYWdEcm9wQ29udGFpbmVyKTogdm9pZCB7XG4gICAgICAgIEFycmF5VXRpbHMuUmVtb3ZlRWxlbWVudChjb250YWluZXIsIHRoaXMuX2NvbnRhaW5lcnMpO1xuICAgICAgICBBcnJheVV0aWxzLlJlbW92ZUVsZW1lbnQoY29udGFpbmVyLCB0aGlzLl9kaXNhYmxlZENvbnRhaW5lcnMpO1xuICAgICAgICBpZiAoIXRoaXMuX2NvbnRhaW5lcnMgfHwgdGhpcy5fY29udGFpbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZURyYWdIYW5kbGUoaGFuZGxlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgQXJyYXlVdGlscy5SZW1vdmVFbGVtZW50KGhhbmRsZSwgdGhpcy5fZHJhZ0hhbmRsZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbmFibGVDb250YWluZXIoY29udGFpbmVyOiBEcmFnRHJvcENvbnRhaW5lcik6IHZvaWQge1xuICAgICAgICBBcnJheVV0aWxzLlJlbW92ZUVsZW1lbnQoY29udGFpbmVyLCB0aGlzLl9kaXNhYmxlZENvbnRhaW5lcnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNhYmxlQ29udGFpbmVyKGNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWRDb250YWluZXJzLnB1c2goY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZW1vdmVMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2hhbmRsZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIFwibW91c2V1cFwiLCB0aGlzLl9oYW5kbGVNb3VzZVVwLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2hhbmRsZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIHRoaXMuX2hhbmRsZU1vdXNlTW92ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldEV2ZW50cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFuZGxlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgXCJtb3VzZWRvd25cIiwgdGhpcy5faGFuZGxlTW91c2VEb3duKTsgLy9UT0RPOiBtb3VzZWRvd24gb25seSB3aXRoaW4gZ2l2ZW4gY29udGFpbmVyc1xuICAgICAgICB0aGlzLl9oYW5kbGVFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcIm1vdXNldXBcIiwgdGhpcy5faGFuZGxlTW91c2VVcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0RWxlbWVudENsYXNzKGVsZW1lbnQ6IGFueSwgZWxlbWVudENsYXNzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yZW5kZXJlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsIGVsZW1lbnRDbGFzcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlRXZlbnRMaXN0ZW5lcihlbGVtZW50OiBhbnksIGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IGFueSwgYWRkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBnaXZlbiBlbGVtZW50LlxuICAgIHByaXZhdGUgX2dldENvbnRhaW5lck9mRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IERyYWdEcm9wQ29udGFpbmVyIHtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgbGVuMTogbnVtYmVyID0gdGhpcy5fY29udGFpbmVycy5sZW5ndGg7IGkgPCBsZW4xOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXIgPSB0aGlzLl9jb250YWluZXJzW2ldO1xuICAgICAgICAgICAgZm9yIChsZXQgaWk6IG51bWJlciA9IDAsIGxlbjI6IG51bWJlciA9IGNvbnRhaW5lci5lbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaWkgPCBsZW4yOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5lbGVtZW50LmNoaWxkcmVuW2lpXSA9PT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBnaXZlbiBlbGVtZW50IGlzIGEgY2hpbGQgb2YgY29udGFpbmVyKHMpXG4gICAgICogQHBhcmFtIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBpbmRleCBvZiBlbGVtZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0RWxlbWVudE9mQ29udGFpbmVyKGVsZW1lbnQ6IGFueSk6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCB7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjE6IG51bWJlciA9IHRoaXMuX2NvbnRhaW5lcnMubGVuZ3RoOyBpIDwgbGVuMTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXI6IERyYWdEcm9wQ29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyc1tpXTtcbiAgICAgICAgICAgIGZvciAobGV0IGlpOiBudW1iZXIgPSAwLCBsZW4yOiBudW1iZXIgPSBjb250YWluZXIuZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGlpIDwgbGVuMjsgaWkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZWxlbWVudC5jaGlsZHJlbltpaV0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtjb250YWluZXI6IGNvbnRhaW5lciwgZWxlbWVudDogZWxlbWVudCwgZWxlbWVudElkeDogaWl9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge2NvbnRhaW5lcjogdW5kZWZpbmVkLCBlbGVtZW50OiB1bmRlZmluZWQsIGVsZW1lbnRJZHg6IC0xfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG5leHQgc2libGluZyBvZiBjb250YWluZXIgdGhhdCBjb250YWlucyBnaXZlbiBlbGVtZW50LlxuICAgICAqIEBwYXJhbSBlbGVtZW50XG4gICAgICogQHJldHVybnMge2FueX0gbnVsbCBpZiB0aGVyZSBhcmUgbm8gc2libGluZ3MgbGVmdFxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldE5leHRFbGVtZW50SW5Db250YWluZXIoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQge1xuICAgICAgICBjb25zdCBjb250YWluZXI6IERyYWdEcm9wQ29udGFpbmVyID0gdGhpcy5fZ2V0Q29udGFpbmVyT2ZFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwLCBsZW46IG51bWJlciA9IGNvbnRhaW5lci5lbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLmVsZW1lbnQuY2hpbGRyZW5baV0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSA8IChsZW4gLSAxKSA/IHtjb250YWluZXI6IGNvbnRhaW5lciwgZWxlbWVudDogPEhUTUxFbGVtZW50PmNvbnRhaW5lci5lbGVtZW50LmNoaWxkcmVuW2kgKyAxXSwgZWxlbWVudElkeDogaX0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0RHJhZ0hhbmRsZUNsaWNrZWQoZWxlbWVudDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9kcmFnSGFuZGxlcyAmJiB0aGlzLl9kcmFnSGFuZGxlcy5sZW5ndGggPiAwKSB7IC8vIGNoZWNrIGlmIGhhbmRsZSBjbGlja2VkXG4gICAgICAgICAgICB3aGlsZSAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gdGhpcy5fZHJhZ0hhbmRsZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0ICYmIGVsZW1lbnQuY2xhc3NMaXN0Lmxlbmd0aCA+IDAgJiYgISF0aGlzLl9kcmFnSGFuZGxlc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMuX2RyYWdIYW5kbGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgPT09IGRvY3VtZW50ID8gbnVsbCA6IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBlbGVtZW50IHdoZW4gaXQncyBhIHZhbGlkIGRyb3AgdGFyZ2V0LCBmYWxzZSBvdGhlcndpc2UuXG4gICAgcHJpdmF0ZSBfZ2V0VmFsaWREcmFnRHJvcEVsZW1lbnQoZWxlbWVudDogYW55LCBjaGVja0hhbmRsZTogYm9vbGVhbiA9IGZhbHNlKTogRHJhZ0Ryb3BDb250YWluZXJFbGVtZW50IHtcbiAgICAgICAgaWYgKGNoZWNrSGFuZGxlKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZEhhbmRsZUNsaWNrZWQ6IGJvb2xlYW4gPSB0aGlzLl9nZXREcmFnSGFuZGxlQ2xpY2tlZChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICghdmFsaWRIYW5kbGVDbGlja2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudE9mQ29udGFpbmVyOiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50T2ZDb250YWluZXIoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudE9mQ29udGFpbmVyLmVsZW1lbnRJZHggPiAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50T2ZDb250YWluZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlID09PSBkb2N1bWVudCA/IG51bGwgOiBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXROZXh0U2libGluZyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXROZXh0RWxlbWVudEluQ29udGFpbmVyKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgaW5kZXggb2YgZWxlbWVudCB3aXRoaW4gaXRzIGNvbnRhaW5lci5cbiAgICBwcml2YXRlIF9pbmRleE9mKGVsZW1lbnQ6IGFueSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRPZkNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXJFbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudE9mQ29udGFpbmVyKGVsZW1lbnQuaGFzT3duUHJvcGVydHkoXCJlbGVtZW50XCIpID8gZWxlbWVudC5lbGVtZW50IDogZWxlbWVudCk7XG4gICAgICAgIHJldHVybiBlbGVtZW50T2ZDb250YWluZXIgPyBlbGVtZW50T2ZDb250YWluZXIuZWxlbWVudElkeCA6IC0xO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZXMgYSBnaG9zdCBpbWFnZS9lbGVtZW50IG9mIHRoZSBlbGVtZW50IGJlaW5nIGRyYWdnZWQuXG4gICAgcHJpdmF0ZSBfY3JlYXRlR2hvc3RJbWFnZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2dob3N0RHJhZ0ltYWdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gY3JlYXRlIGdob3N0IGRyYWcgaW1hZ2VcbiAgICAgICAgY29uc3Qgb2Zmc2V0UmVjdDogYW55ID0gdGhpcy5fZ2V0T2Zmc2V0KCk7XG4gICAgICAgIHRoaXMuX2dob3N0RHJhZ0ltYWdlID0gdGhpcy5fZHJhZ0VsZW1lbnQuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgIHRoaXMuX2dob3N0RHJhZ0ltYWdlLnN0eWxlLndpZHRoID0gb2Zmc2V0UmVjdC53aWR0aCArIFwicHhcIjtcbiAgICAgICAgdGhpcy5fZ2hvc3REcmFnSW1hZ2Uuc3R5bGUuaGVpZ2h0ID0gb2Zmc2V0UmVjdC5oZWlnaHQgKyBcInB4XCI7XG4gICAgICAgIHRoaXMuZ2hvc3RMZWZ0ID0gb2Zmc2V0UmVjdC5sZWZ0O1xuICAgICAgICB0aGlzLmdob3N0VG9wID0gb2Zmc2V0UmVjdC50b3A7XG4gICAgICAgIHRoaXMuX3NldEVsZW1lbnRDbGFzcyh0aGlzLl9naG9zdERyYWdJbWFnZSwgXCJnaG9zdC1pbWFnZVwiKTtcbiAgICAgICAgdGhpcy5fc2V0RWxlbWVudENsYXNzKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIFwibm8tc2VsZWN0XCIpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2dob3N0RHJhZ0ltYWdlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZXN0cm95R2hvc3RJbWFnZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2dob3N0RHJhZ0ltYWdlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5hY3RpdmVFbGVtZW50LCBcIm5vLXNlbGVjdFwiKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5fZ2hvc3REcmFnSW1hZ2UpO1xuICAgICAgICAgICAgdGhpcy5fZ2hvc3REcmFnSW1hZ2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQb3NpdGlvbnMgdGhlIGdob3N0IGltYWdlIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy5cbiAgICBwcml2YXRlIF9wb3NpdGlvbkdob3N0SW1hZ2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fZ2hvc3REcmFnSW1hZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9naG9zdERyYWdJbWFnZS5zdHlsZS5sZWZ0ID0gdGhpcy5fZ2hvc3RMZWZ0ICsgXCJweFwiO1xuICAgICAgICB0aGlzLl9naG9zdERyYWdJbWFnZS5zdHlsZS50b3AgPSB0aGlzLl9naG9zdFRvcCArIFwicHhcIjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTY3JvbGwoc2Nyb2xsUHJvcDogc3RyaW5nLCBvZmZzZXRQcm9wOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50W3Njcm9sbFByb3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5W3Njcm9sbFByb3BdO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldE9mZnNldCgpOiBDbGllbnRSZWN0IHtcbiAgICAgICAgY29uc3QgcmVjdDogQ2xpZW50UmVjdCA9IHRoaXMuX2RyYWdFbGVtZW50LmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQ6IG51bWJlciA9IDA7XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcDogbnVtYmVyID0gMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJvdHRvbTogcmVjdC5ib3R0b20sXG4gICAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0ICsgc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0LFxuICAgICAgICAgICAgdG9wOiByZWN0LnRvcCArIHNjcm9sbFRvcCxcbiAgICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGV0ZXJtaW5lRHJvcHRhcmdldChlbGVtZW50OiBhbnksIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRyb3BFbGVtZW50OiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLl9nZXRWYWxpZERyYWdEcm9wRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgaWYgKGRyb3BFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZHJvcEVsZW1lbnQuZWxlbWVudCAhPT0gdGhpcy5fZHJhZ0VsZW1lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BUYXJnZXRFbGVtZW50ID0gZHJvcEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Ryb3BUYXJnZXRFbGVtZW50ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCcmllZmx5IGhpZGVzIHRoZSBnaG9zdCBpbWFnZSB0byBiZSBhYmxlIHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50IGlzIHVuZGVyIG1vdXNlLlxuICAgICAqIEBwYXJhbSB4XG4gICAgICogQHBhcmFtIHlcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gVG9wIGxldmVsIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRIb3ZlcmVkRWxlbWVudCh4OiBudW1iZXIsIHk6IG51bWJlcik6IGFueSB7XG4gICAgICAgIHRoaXMuX3NldEVsZW1lbnRDbGFzcyh0aGlzLl9naG9zdERyYWdJbWFnZSwgXCJnaG9zdC1pbWFnZS1oaWRlXCIpO1xuICAgICAgICBjb25zdCBlbG06IGFueSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX2dob3N0RHJhZ0ltYWdlLCBcImdob3N0LWltYWdlLWhpZGVcIik7XG4gICAgICAgIHJldHVybiBlbG07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYW5pbWF0ZVZpc2liaWxpdHkoZWxlbWVudDogYW55LCB0cmFuc2l0aW9uVGltZTogbnVtYmVyID0gMC4yLCBzdGFydDogc3RyaW5nID0gXCIwXCIsIGVuZDogc3RyaW5nID0gXCIxXCIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJhbnNpdGlvblN0eWxlOiBzdHJpbmcgPSBcIm9wYWNpdHkgXCIgKyB0cmFuc2l0aW9uVGltZSArIFwicyBlYXNlLWluLW91dFwiO1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uOiBzdHJpbmcgPSBlbGVtZW50LnN0eWxlLnRyYW5zaXRpb247XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IHRyYW5zaXRpb24gKyAodHJhbnNpdGlvbiA/IFwiLFwiIDogXCJcIikgKyB0cmFuc2l0aW9uU3R5bGU7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IHN0YXJ0O1xuICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSBlbmQ7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZTogRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIHRyYW5zaXRpb25UaW1lICogMTAwMCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FuaW1hdGVNb3ZlKHBhcmVudDogSFRNTEVsZW1lbnQsIGRyYWdFbGVtZW50OiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQsIGRyb3BUYXJnZXRFbGVtZW50OiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQsIGRvd246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGRvd24pIHsgLy8gaW5zZXJ0IGVsZW1lbnQgYmVmb3JlXG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdFbGVtZW50LmVsZW1lbnQsIGRyb3BUYXJnZXRFbGVtZW50LmVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgeyAvLyBpbnNlcnQgYWZ0ZXJcbiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZHJhZ0VsZW1lbnQuZWxlbWVudCwgZHJvcFRhcmdldEVsZW1lbnQuZWxlbWVudC5uZXh0U2libGluZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGVzIHRoZSBtb3VzZSBkb3duIGV2ZW50LiBTYXZlcyB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbi5cbiAgICBwcml2YXRlIF9oYW5kbGVNb3VzZURvd246IEZ1bmN0aW9uID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLnggPSBldmVudC5zY3JlZW5YO1xuICAgICAgICB0aGlzLl9jdXJyZW50TW91c2VQb3NpdGlvbi55ID0gZXZlbnQuc2NyZWVuWTtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbnMgIT09IDEgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudDogYW55ID0gZXZlbnQudGFyZ2V0ID8gZXZlbnQudGFyZ2V0IDogZXZlbnQuc3JjRWxlbWVudDtcbiAgICAgICAgY29uc3QgZHJhZ0VsZW1lbnQ6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuX2dldFZhbGlkRHJhZ0Ryb3BFbGVtZW50KGVsZW1lbnQsIHRydWUpO1xuICAgICAgICBpZiAoIWRyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Rpc2FibGVkQ29udGFpbmVycy5pbmRleE9mKGRyYWdFbGVtZW50LmNvbnRhaW5lcikgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZHJhZ0VsZW1lbnQgPSBkcmFnRWxlbWVudDtcbiAgICAgICAgdGhpcy5fZHJhZ0luQ29udGFpbmVyID0gZHJhZ0VsZW1lbnQuY29udGFpbmVyLmVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG9mZnNldDogYW55ID0gdGhpcy5fZ2V0T2Zmc2V0KCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRNb3VzZU9mZnNldC54ID0gZXZlbnQuY2xpZW50WCAtIG9mZnNldC5sZWZ0O1xuICAgICAgICB0aGlzLl9jdXJyZW50TW91c2VPZmZzZXQueSA9IGV2ZW50LmNsaWVudFkgLSBvZmZzZXQudG9wO1xuICAgICAgICB0aGlzLl9tb3VzZURvd24gPSB0cnVlO1xuICAgICAgICB0aGlzLl9oYW5kbGVFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCB0aGlzLl9oYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgICB0aGlzLl9jbGlja0NvdW50ZXIrKztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVNb3VzZVVwOiBGdW5jdGlvbiA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLl9tb3VzZURvd24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faGFuZGxlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgXCJtb3VzZW1vdmVcIiwgdGhpcy5faGFuZGxlTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2NsaWNrQ291bnRlci0tO1xuXG4gICAgICAgIGlmICh0aGlzLl9pc2RyYWdnaW5nKSB7XG4gICAgICAgICAgICB0aGlzLl9lbmREcmFnKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVNb3VzZU1vdmU6IEZ1bmN0aW9uID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZHJhZz9cbiAgICAgICAgaWYgKCF0aGlzLl9kcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9ubHkgZHJhZyB3aGVuIG1vdXNlIGRvd24gYW5kIHRoZXJlIGFjdHVhbGx5IGlzIG1vdmVtZW50XG4gICAgICAgIGlmICghdGhpcy5fbW91c2VEb3duIHx8ICh0aGlzLl9jdXJyZW50TW91c2VQb3NpdGlvbi54ID09PSBldmVudC5zY3JlZW5YICYmIHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLnkgPT09IGV2ZW50LnNjcmVlblkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNkcmFnZ2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N0YXJ0RHJhZygpO1xuICAgICAgICB0aGlzLl9kcmFnKGV2ZW50KTtcbiAgICAgICAgdGhpcy5fY3VycmVudE1vdXNlUG9zaXRpb24ueCA9IGV2ZW50LnNjcmVlblg7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLnkgPSBldmVudC5zY3JlZW5ZO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3N0YXJ0RHJhZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlR2hvc3RJbWFnZSgpO1xuICAgICAgICB0aGlzLl9zZXRFbGVtZW50Q2xhc3ModGhpcy5fZHJhZ0VsZW1lbnQuZWxlbWVudCwgXCJpcy1kcmFnZ2VkXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5naG9zdExlZnQgPSB0aGlzLl9naG9zdExlZnQgKyAoZXZlbnQuc2NyZWVuWCAtIHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLngpO1xuICAgICAgICB0aGlzLmdob3N0VG9wID0gdGhpcy5fZ2hvc3RUb3AgKyAoZXZlbnQuc2NyZWVuWSAtIHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLnkpO1xuXG4gICAgICAgIGNvbnN0IHg6IG51bWJlciA9IGV2ZW50LmNsaWVudFg7XG4gICAgICAgIGNvbnN0IHk6IG51bWJlciA9IGV2ZW50LmNsaWVudFk7XG4gICAgICAgIGNvbnN0IGhvdmVyZWRFbGVtZW50OiBhbnkgPSB0aGlzLl9nZXRIb3ZlcmVkRWxlbWVudCh4LCB5KTtcbiAgICAgICAgdGhpcy5fZGV0ZXJtaW5lRHJvcHRhcmdldChob3ZlcmVkRWxlbWVudCwgeCwgeSk7XG4gICAgICAgIGlmICh0aGlzLl9kcm9wVGFyZ2V0RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZG93bjogYm9vbGVhbiA9XG4gICAgICAgICAgICAgICAgKHRoaXMuX2Ryb3BUYXJnZXRFbGVtZW50LmNvbnRhaW5lci5kaXJlY3Rpb24gPT09IENvT3JpZW50YXRpb24uVmVydGljYWwgJiYgZXZlbnQuc2NyZWVuWSA+IHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLnkpIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMuX2Ryb3BUYXJnZXRFbGVtZW50LmNvbnRhaW5lci5kaXJlY3Rpb24gPT09IENvT3JpZW50YXRpb24uSG9yaXpvbnRhbCAmJiBldmVudC5zY3JlZW5YID4gdGhpcy5fY3VycmVudE1vdXNlUG9zaXRpb24ueCk7XG4gICAgICAgICAgICB0aGlzLl9hbmltYXRlTW92ZSh0aGlzLl9kcm9wVGFyZ2V0RWxlbWVudC5jb250YWluZXIuZWxlbWVudCwgdGhpcy5fZHJhZ0VsZW1lbnQsIHRoaXMuX2Ryb3BUYXJnZXRFbGVtZW50LCBkb3duKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZy5uZXh0KHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLl9kcmFnRWxlbWVudCxcbiAgICAgICAgICAgICAgICBlbGVtZW50SW5kZXg6IHRoaXMuX2RyYWdFbGVtZW50LmVsZW1lbnRJZHgsXG4gICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLl9kcm9wVGFyZ2V0RWxlbWVudC5jb250YWluZXIuZWxlbWVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RHJvcFRhcmdldCA9IHRoaXMuX2Ryb3BUYXJnZXRFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZWxlbWVudCBpcyBkcm9wcGVkXG4gICAgcHJpdmF0ZSBfZW5kRHJhZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fZHJhZ0VsZW1lbnQuZWxlbWVudCwgXCJpcy1kcmFnZ2VkXCIpO1xuICAgICAgICB0aGlzLl9kZXN0cm95R2hvc3RJbWFnZSgpO1xuICAgICAgICB0aGlzLmRyb3AubmV4dCh7XG4gICAgICAgICAgICBlbGVtZW50OiB0aGlzLl9kcmFnRWxlbWVudC5lbGVtZW50LFxuICAgICAgICAgICAgZWxlbWVudEluZGV4OiB0aGlzLl9kcmFnRWxlbWVudC5lbGVtZW50SWR4LFxuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLl9sYXN0RHJvcFRhcmdldCA/IHRoaXMuX2xhc3REcm9wVGFyZ2V0LmVsZW1lbnQgOiBudWxsLFxuICAgICAgICAgICAgdGFyZ2V0SW5kZXg6IHRoaXMuX2xhc3REcm9wVGFyZ2V0ID8gdGhpcy5fbGFzdERyb3BUYXJnZXQuZWxlbWVudElkeCA6IC0xLCAvLyBpdGVtcyBhcmUgYWxyZWFkeSBzaGlmdGVkIHNvIHN1YnRyYWN0IDEgZnJvbSB0YXJnZXQgaW5kZXhcbiAgICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5fbGFzdERyb3BUYXJnZXQgPyB0aGlzLl9sYXN0RHJvcFRhcmdldC5jb250YWluZXIgOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZXNldERyYWcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNldERyYWcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2RyYWdFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZHJhZ0luQ29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbGFzdERyb3BUYXJnZXQgPSBudWxsO1xuICAgICAgICB0aGlzLl9pc2RyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxufVxuIl19
|