From 4b2879d433cb83aeff5748ce192e40e5b69154aa Mon Sep 17 00:00:00 2001 From: MarSeventh <1193267292@qq.com> Date: Tue, 30 Jun 2026 16:02:02 +0800 Subject: [PATCH] style: integrate dashboard page switcher --- frontend-dist/css/385.20c34d33.css | 1 + frontend-dist/css/385.20c34d33.css.gz | Bin 0 -> 4931 bytes frontend-dist/css/428.8044ed41.css | 1 - frontend-dist/css/428.8044ed41.css.gz | Bin 4026 -> 0 bytes frontend-dist/css/451.7e03bef9.css | 1 + frontend-dist/css/451.7e03bef9.css.gz | Bin 0 -> 5055 bytes frontend-dist/css/740.a94dbb46.css | 1 - frontend-dist/css/740.a94dbb46.css.gz | Bin 5880 -> 0 bytes frontend-dist/css/770.37d2e9e0.css | 1 - frontend-dist/css/770.37d2e9e0.css.gz | Bin 14165 -> 0 bytes frontend-dist/css/833.95983fa6.css | 1 - frontend-dist/css/833.95983fa6.css.gz | Bin 4320 -> 0 bytes frontend-dist/css/915.52b943c1.css | 1 + frontend-dist/css/915.52b943c1.css.gz | Bin 0 -> 4609 bytes frontend-dist/css/997.87fa4059.css | 1 + frontend-dist/css/997.87fa4059.css.gz | Bin 0 -> 14389 bytes frontend-dist/css/app.b63c4c0f.css | 1 - frontend-dist/css/app.b63c4c0f.css.gz | Bin 5022 -> 0 bytes frontend-dist/css/app.ed6a21b7.css | 1 + frontend-dist/css/app.ed6a21b7.css.gz | Bin 0 -> 5009 bytes frontend-dist/index.html | 2 +- frontend-dist/index.html.gz | Bin 521 -> 520 bytes frontend-dist/js/142.fc366b6d.js | 2 ++ frontend-dist/js/142.fc366b6d.js.gz | Bin 0 -> 4379 bytes frontend-dist/js/142.fc366b6d.js.map | 1 + frontend-dist/js/142.fc366b6d.js.map.gz | Bin 0 -> 11910 bytes frontend-dist/js/309.b7dca603.js | 2 -- frontend-dist/js/309.b7dca603.js.gz | Bin 4310 -> 0 bytes frontend-dist/js/309.b7dca603.js.map | 1 - frontend-dist/js/309.b7dca603.js.map.gz | Bin 11806 -> 0 bytes frontend-dist/js/396.226339af.js.gz | Bin 2760 -> 0 bytes frontend-dist/js/396.226339af.js.map.gz | Bin 7044 -> 0 bytes .../js/{396.226339af.js => 396.b3b6ae37.js} | 4 ++-- frontend-dist/js/396.b3b6ae37.js.gz | Bin 0 -> 2761 bytes ...96.226339af.js.map => 396.b3b6ae37.js.map} | 2 +- frontend-dist/js/396.b3b6ae37.js.map.gz | Bin 0 -> 7044 bytes .../js/{529.e05f38bd.js => 529.287c329f.js} | 4 ++-- frontend-dist/js/529.287c329f.js.gz | Bin 0 -> 106482 bytes ...29.e05f38bd.js.map => 529.287c329f.js.map} | 2 +- ...f38bd.js.map.gz => 529.287c329f.js.map.gz} | Bin 364915 -> 364915 bytes frontend-dist/js/529.e05f38bd.js.gz | Bin 106479 -> 0 bytes frontend-dist/js/770.865557c0.js | 2 -- frontend-dist/js/770.865557c0.js.gz | Bin 57686 -> 0 bytes frontend-dist/js/770.865557c0.js.map | 1 - frontend-dist/js/770.865557c0.js.map.gz | Bin 145433 -> 0 bytes frontend-dist/js/997.7b6c8b5a.js | 2 ++ frontend-dist/js/997.7b6c8b5a.js.gz | Bin 0 -> 57735 bytes frontend-dist/js/997.7b6c8b5a.js.map | 1 + frontend-dist/js/997.7b6c8b5a.js.map.gz | Bin 0 -> 145474 bytes .../js/{app.5832846c.js => app.4c47588b.js} | 4 ++-- frontend-dist/js/app.4c47588b.js.gz | Bin 0 -> 25158 bytes ...pp.5832846c.js.map => app.4c47588b.js.map} | 2 +- frontend-dist/js/app.4c47588b.js.map.gz | Bin 0 -> 18560 bytes frontend-dist/js/app.5832846c.js.gz | Bin 25164 -> 0 bytes frontend-dist/js/app.5832846c.js.map.gz | Bin 18560 -> 0 bytes 55 files changed, 21 insertions(+), 21 deletions(-) create mode 100644 frontend-dist/css/385.20c34d33.css create mode 100644 frontend-dist/css/385.20c34d33.css.gz delete mode 100644 frontend-dist/css/428.8044ed41.css delete mode 100644 frontend-dist/css/428.8044ed41.css.gz create mode 100644 frontend-dist/css/451.7e03bef9.css create mode 100644 frontend-dist/css/451.7e03bef9.css.gz delete mode 100644 frontend-dist/css/740.a94dbb46.css delete mode 100644 frontend-dist/css/740.a94dbb46.css.gz delete mode 100644 frontend-dist/css/770.37d2e9e0.css delete mode 100644 frontend-dist/css/770.37d2e9e0.css.gz delete mode 100644 frontend-dist/css/833.95983fa6.css delete mode 100644 frontend-dist/css/833.95983fa6.css.gz create mode 100644 frontend-dist/css/915.52b943c1.css create mode 100644 frontend-dist/css/915.52b943c1.css.gz create mode 100644 frontend-dist/css/997.87fa4059.css create mode 100644 frontend-dist/css/997.87fa4059.css.gz delete mode 100644 frontend-dist/css/app.b63c4c0f.css delete mode 100644 frontend-dist/css/app.b63c4c0f.css.gz create mode 100644 frontend-dist/css/app.ed6a21b7.css create mode 100644 frontend-dist/css/app.ed6a21b7.css.gz create mode 100644 frontend-dist/js/142.fc366b6d.js create mode 100644 frontend-dist/js/142.fc366b6d.js.gz create mode 100644 frontend-dist/js/142.fc366b6d.js.map create mode 100644 frontend-dist/js/142.fc366b6d.js.map.gz delete mode 100644 frontend-dist/js/309.b7dca603.js delete mode 100644 frontend-dist/js/309.b7dca603.js.gz delete mode 100644 frontend-dist/js/309.b7dca603.js.map delete mode 100644 frontend-dist/js/309.b7dca603.js.map.gz delete mode 100644 frontend-dist/js/396.226339af.js.gz delete mode 100644 frontend-dist/js/396.226339af.js.map.gz rename frontend-dist/js/{396.226339af.js => 396.b3b6ae37.js} (98%) create mode 100644 frontend-dist/js/396.b3b6ae37.js.gz rename frontend-dist/js/{396.226339af.js.map => 396.b3b6ae37.js.map} (99%) create mode 100644 frontend-dist/js/396.b3b6ae37.js.map.gz rename frontend-dist/js/{529.e05f38bd.js => 529.287c329f.js} (99%) create mode 100644 frontend-dist/js/529.287c329f.js.gz rename frontend-dist/js/{529.e05f38bd.js.map => 529.287c329f.js.map} (99%) rename frontend-dist/js/{529.e05f38bd.js.map.gz => 529.287c329f.js.map.gz} (99%) delete mode 100644 frontend-dist/js/529.e05f38bd.js.gz delete mode 100644 frontend-dist/js/770.865557c0.js delete mode 100644 frontend-dist/js/770.865557c0.js.gz delete mode 100644 frontend-dist/js/770.865557c0.js.map delete mode 100644 frontend-dist/js/770.865557c0.js.map.gz create mode 100644 frontend-dist/js/997.7b6c8b5a.js create mode 100644 frontend-dist/js/997.7b6c8b5a.js.gz create mode 100644 frontend-dist/js/997.7b6c8b5a.js.map create mode 100644 frontend-dist/js/997.7b6c8b5a.js.map.gz rename frontend-dist/js/{app.5832846c.js => app.4c47588b.js} (98%) create mode 100644 frontend-dist/js/app.4c47588b.js.gz rename frontend-dist/js/{app.5832846c.js.map => app.4c47588b.js.map} (98%) create mode 100644 frontend-dist/js/app.4c47588b.js.map.gz delete mode 100644 frontend-dist/js/app.5832846c.js.gz delete mode 100644 frontend-dist/js/app.5832846c.js.map.gz diff --git a/frontend-dist/css/385.20c34d33.css b/frontend-dist/css/385.20c34d33.css new file mode 100644 index 00000000..ebecf837 --- /dev/null +++ b/frontend-dist/css/385.20c34d33.css @@ -0,0 +1 @@ +:root{--el-loading-spinner-size:42px;--el-loading-fullscreen-spinner-size:50px}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{background-color:var(--el-mask-color);bottom:0;left:0;margin:0;position:absolute;right:0;top:0;transition:opacity var(--el-transition-duration);z-index:2000}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:calc((0px - var(--el-loading-fullscreen-spinner-size))/2)}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:var(--el-loading-fullscreen-spinner-size);width:var(--el-loading-fullscreen-spinner-size)}.el-loading-spinner{margin-top:calc((0px - var(--el-loading-spinner-size))/2);position:absolute;text-align:center;top:50%;width:100%}.el-loading-spinner .el-loading-text{color:var(--el-color-primary);font-size:14px;margin:3px 0}.el-loading-spinner .circular{animation:loading-rotate 2s linear infinite;display:inline;height:var(--el-loading-spinner-size);width:var(--el-loading-spinner-size)}.el-loading-spinner .path{animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:var(--el-color-primary);stroke-linecap:round}.el-loading-spinner i{color:var(--el-color-primary)}.el-loading-fade-enter-from,.el-loading-fade-leave-to{opacity:0}@keyframes loading-rotate{to{transform:rotate(1turn)}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-tag{--el-tag-font-size:12px;--el-tag-border-radius:4px;--el-tag-border-radius-rounded:9999px;align-items:center;background-color:var(--el-tag-bg-color);border-color:var(--el-tag-border-color);border-radius:var(--el-tag-border-radius);border-style:solid;border-width:1px;box-sizing:border-box;color:var(--el-tag-text-color);display:inline-flex;font-size:var(--el-tag-font-size);height:24px;justify-content:center;line-height:1;padding:0 9px;vertical-align:middle;white-space:nowrap;--el-icon-size:14px}.el-tag,.el-tag.el-tag--primary{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-bg-color:var(--el-color-success-light-9);--el-tag-border-color:var(--el-color-success-light-8);--el-tag-hover-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-bg-color:var(--el-color-warning-light-9);--el-tag-border-color:var(--el-color-warning-light-8);--el-tag-hover-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-bg-color:var(--el-color-danger-light-9);--el-tag-border-color:var(--el-color-danger-light-8);--el-tag-hover-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-bg-color:var(--el-color-error-light-9);--el-tag-border-color:var(--el-color-error-light-8);--el-tag-hover-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-bg-color:var(--el-color-info-light-9);--el-tag-border-color:var(--el-color-info-light-8);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-hit{border-color:var(--el-color-primary)}.el-tag.is-round{border-radius:var(--el-tag-border-radius-rounded)}.el-tag .el-tag__close{color:var(--el-tag-text-color);flex-shrink:0}.el-tag .el-tag__close:hover{background-color:var(--el-tag-hover-color);color:var(--el-color-white)}.el-tag.el-tag--primary{--el-tag-text-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-text-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-text-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-text-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-text-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-text-color:var(--el-color-info)}.el-tag .el-icon{border-radius:50%;cursor:pointer;display:flex;font-size:calc(var(--el-icon-size) - 2px);height:var(--el-icon-size);width:var(--el-icon-size)}.el-tag .el-tag__close{background-color:transparent;border:none;border-radius:50%;margin-left:6px;outline:none;overflow:hidden;padding:0}.el-tag .el-tag__close:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-tag--dark{--el-tag-text-color:var(--el-color-white)}.el-tag--dark,.el-tag--dark.el-tag--primary{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--success{--el-tag-bg-color:var(--el-color-success);--el-tag-border-color:var(--el-color-success);--el-tag-hover-color:var(--el-color-success-light-3)}.el-tag--dark.el-tag--warning{--el-tag-bg-color:var(--el-color-warning);--el-tag-border-color:var(--el-color-warning);--el-tag-hover-color:var(--el-color-warning-light-3)}.el-tag--dark.el-tag--danger{--el-tag-bg-color:var(--el-color-danger);--el-tag-border-color:var(--el-color-danger);--el-tag-hover-color:var(--el-color-danger-light-3)}.el-tag--dark.el-tag--error{--el-tag-bg-color:var(--el-color-error);--el-tag-border-color:var(--el-color-error);--el-tag-hover-color:var(--el-color-error-light-3)}.el-tag--dark.el-tag--info{--el-tag-bg-color:var(--el-color-info);--el-tag-border-color:var(--el-color-info);--el-tag-hover-color:var(--el-color-info-light-3)}.el-tag--dark.el-tag--danger,.el-tag--dark.el-tag--error,.el-tag--dark.el-tag--info,.el-tag--dark.el-tag--primary,.el-tag--dark.el-tag--success,.el-tag--dark.el-tag--warning{--el-tag-text-color:var(--el-color-white)}.el-tag--plain,.el-tag--plain.el-tag--primary{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary)}.el-tag--plain.el-tag--success{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-success-light-5);--el-tag-hover-color:var(--el-color-success)}.el-tag--plain.el-tag--warning{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-warning-light-5);--el-tag-hover-color:var(--el-color-warning)}.el-tag--plain.el-tag--danger{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-danger-light-5);--el-tag-hover-color:var(--el-color-danger)}.el-tag--plain.el-tag--error{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-error-light-5);--el-tag-hover-color:var(--el-color-error)}.el-tag--plain.el-tag--info{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-info-light-5);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-closable{padding-right:5px}.el-tag--large{height:32px;padding:0 11px;--el-icon-size:16px}.el-tag--large .el-tag__close{margin-left:8px}.el-tag--large.is-closable{padding-right:7px}.el-tag--small{height:20px;padding:0 7px;--el-icon-size:12px}.el-tag--small .el-tag__close{margin-left:4px}.el-tag--small.is-closable{padding-right:3px}.el-tag--small .el-icon-close{transform:scale(.8)}.el-tag.el-tag--primary.is-hit{border-color:var(--el-color-primary)}.el-tag.el-tag--success.is-hit{border-color:var(--el-color-success)}.el-tag.el-tag--warning.is-hit{border-color:var(--el-color-warning)}.el-tag.el-tag--danger.is-hit{border-color:var(--el-color-danger)}.el-tag.el-tag--error.is-hit{border-color:var(--el-color-error)}.el-tag.el-tag--info.is-hit{border-color:var(--el-color-info)}.el-scrollbar{--el-scrollbar-opacity:0.3;--el-scrollbar-bg-color:var(--el-text-color-secondary);--el-scrollbar-hover-opacity:0.5;--el-scrollbar-hover-bg-color:var(--el-text-color-secondary);height:100%;overflow:hidden;position:relative}.el-scrollbar__wrap{height:100%;overflow:auto}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{display:none}.el-scrollbar__thumb{background-color:var(--el-scrollbar-bg-color,var(--el-text-color-secondary));border-radius:inherit;cursor:pointer;display:block;height:0;opacity:var(--el-scrollbar-opacity,.3);position:relative;transition:var(--el-transition-duration) background-color;width:0}.el-scrollbar__thumb:hover{background-color:var(--el-scrollbar-hover-bg-color,var(--el-text-color-secondary));opacity:var(--el-scrollbar-hover-opacity,.5)}.el-scrollbar__bar{border-radius:4px;bottom:2px;position:absolute;right:2px;z-index:1}.el-scrollbar__bar.is-vertical{top:2px;width:6px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-scrollbar-fade-enter-active{transition:opacity .34s ease-out}.el-scrollbar-fade-leave-active{transition:opacity .12s ease-out}.el-scrollbar-fade-enter-from,.el-scrollbar-fade-leave-active{opacity:0}.el-popper{--el-popper-border-radius:var(--el-popover-border-radius,4px);border-radius:var(--el-popper-border-radius);font-size:12px;line-height:20px;min-width:10px;overflow-wrap:break-word;padding:5px 11px;position:absolute;visibility:visible;word-break:normal;z-index:2000}.el-popper.is-dark{color:var(--el-bg-color)}.el-popper.is-dark,.el-popper.is-dark>.el-popper__arrow:before{background:var(--el-text-color-primary);border:1px solid var(--el-text-color-primary)}.el-popper.is-dark>.el-popper__arrow:before{right:0}.el-popper.is-light,.el-popper.is-light>.el-popper__arrow:before{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light)}.el-popper.is-light>.el-popper__arrow:before{right:0}.el-popper.is-pure{padding:0}.el-popper__arrow,.el-popper__arrow:before{height:10px;position:absolute;width:10px;z-index:-1}.el-popper__arrow:before{background:var(--el-text-color-primary);box-sizing:border-box;content:" ";transform:rotate(45deg)}.el-popper[data-popper-placement^=top]>.el-popper__arrow{bottom:-5px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-bottom-right-radius:2px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow{top:-5px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-top-left-radius:2px}.el-popper[data-popper-placement^=left]>.el-popper__arrow{right:-5px}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-top-right-radius:2px}.el-popper[data-popper-placement^=right]>.el-popper__arrow{left:-5px}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-bottom-left-radius:2px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-left-color:transparent!important;border-top-color:transparent!important}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-bottom-color:transparent!important;border-right-color:transparent!important}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-bottom-color:transparent!important;border-left-color:transparent!important}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-right-color:transparent!important;border-top-color:transparent!important}.el-switch{--el-switch-on-color:var(--el-color-primary);--el-switch-off-color:var(--el-border-color);align-items:center;display:inline-flex;font-size:14px;height:32px;line-height:20px;position:relative;vertical-align:middle}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{color:var(--el-text-color-primary);cursor:pointer;display:inline-block;font-size:14px;font-weight:500;height:20px;transition:var(--el-transition-duration-fast);vertical-align:middle}.el-switch__label.is-active{color:var(--el-color-primary)}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{display:inline-block;font-size:14px;line-height:1}.el-switch__label .el-icon{height:inherit}.el-switch__label .el-icon svg{vertical-align:middle}.el-switch__input{height:0;margin:0;opacity:0;position:absolute;width:0}.el-switch__input:focus-visible~.el-switch__core{outline:2px solid var(--el-switch-on-color);outline-offset:1px}.el-switch__core{align-items:center;background:var(--el-switch-off-color);border:1px solid var(--el-switch-border-color,var(--el-switch-off-color));border-radius:10px;box-sizing:border-box;cursor:pointer;display:inline-flex;height:20px;min-width:40px;outline:none;position:relative;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration)}.el-switch__core .el-switch__inner{align-items:center;display:flex;height:16px;justify-content:center;overflow:hidden;padding:0 4px 0 18px;transition:all var(--el-transition-duration);width:100%}.el-switch__core .el-switch__inner .is-icon,.el-switch__core .el-switch__inner .is-text{color:var(--el-color-white);font-size:12px;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-switch__core .el-switch__action{align-items:center;background-color:var(--el-color-white);border-radius:var(--el-border-radius-circle);color:var(--el-switch-off-color);display:flex;height:16px;justify-content:center;left:1px;position:absolute;transition:all var(--el-transition-duration);width:16px}.el-switch.is-checked .el-switch__core{background-color:var(--el-switch-on-color);border-color:var(--el-switch-border-color,var(--el-switch-on-color))}.el-switch.is-checked .el-switch__core .el-switch__action{color:var(--el-switch-on-color);left:calc(100% - 17px)}.el-switch.is-checked .el-switch__core .el-switch__inner{padding:0 18px 0 4px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter-from,.el-switch .label-fade-leave-active{opacity:0}.el-switch--large{font-size:14px;height:40px;line-height:24px}.el-switch--large .el-switch__label{font-size:14px;height:24px}.el-switch--large .el-switch__label *{font-size:14px}.el-switch--large .el-switch__core{border-radius:12px;height:24px;min-width:50px}.el-switch--large .el-switch__core .el-switch__inner{height:20px;padding:0 6px 0 22px}.el-switch--large .el-switch__core .el-switch__action{height:20px;width:20px}.el-switch--large.is-checked .el-switch__core .el-switch__action{left:calc(100% - 21px)}.el-switch--large.is-checked .el-switch__core .el-switch__inner{padding:0 22px 0 6px}.el-switch--small{font-size:12px;height:24px;line-height:16px}.el-switch--small .el-switch__label{font-size:12px;height:16px}.el-switch--small .el-switch__label *{font-size:12px}.el-switch--small .el-switch__core{border-radius:8px;height:16px;min-width:30px}.el-switch--small .el-switch__core .el-switch__inner{height:12px;padding:0 2px 0 14px}.el-switch--small .el-switch__core .el-switch__action{height:12px;width:12px}.el-switch--small.is-checked .el-switch__core .el-switch__action{left:calc(100% - 13px)}.el-switch--small.is-checked .el-switch__core .el-switch__inner{padding:0 14px 0 2px}.el-select-dropdown{border-radius:var(--el-border-radius-base);box-sizing:border-box;z-index:calc(var(--el-index-top) + 1)}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty,.el-select-dropdown__loading{color:var(--el-text-color-secondary);font-size:var(--el-select-font-size);margin:0;padding:10px 0;text-align:center}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{box-sizing:border-box;list-style:none;margin:0;padding:6px 0}.el-select-dropdown__list.el-vl__window{margin:6px 0;padding:0}.el-select-dropdown__header{border-bottom:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__footer{border-top:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__item{box-sizing:border-box;color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-base);height:34px;line-height:34px;overflow:hidden;padding:0 32px 0 20px;position:relative;text-overflow:ellipsis;white-space:nowrap}.el-select-dropdown__item.is-hovering{background-color:var(--el-fill-color-light)}.el-select-dropdown__item.is-selected{color:var(--el-color-primary);font-weight:700}.el-select-dropdown__item.is-disabled{background-color:unset;color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after{background-color:var(--el-color-primary);background-position:50%;background-repeat:no-repeat;border-right:none;border-top:none;content:"";height:12px;mask:url("data:image/svg+xml;utf8,%3Csvg class=%27icon%27 width=%27200%27 height=%27200%27 viewBox=%270 0 1024 1024%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath fill=%27currentColor%27 d=%27M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z%27%3E%3C/path%3E%3C/svg%3E") no-repeat;mask-size:100% 100%;-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class=%27icon%27 width=%27200%27 height=%27200%27 viewBox=%270 0 1024 1024%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath fill=%27currentColor%27 d=%27M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z%27%3E%3C/path%3E%3C/svg%3E") no-repeat;-webkit-mask-size:100% 100%;position:absolute;right:20px;top:50%;transform:translateY(-50%);width:12px}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-disabled:after{background-color:var(--el-text-color-placeholder)}.el-select-group{margin:0;padding:0}.el-select-group__wrap{list-style:none;margin:0;padding:0;position:relative}.el-select-group__title{box-sizing:border-box;color:var(--el-color-info);font-size:12px;line-height:34px;overflow:hidden;padding:0 20px;text-overflow:ellipsis;white-space:nowrap}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-color:var(--el-disabled-text-color);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px;--el-select-width:100%;display:inline-block;position:relative;vertical-align:middle;width:var(--el-select-width)}.el-select__wrapper{align-items:center;background-color:var(--el-fill-color-blank);border-radius:var(--el-border-radius-base);box-shadow:0 0 0 1px var(--el-border-color) inset;box-sizing:border-box;cursor:pointer;display:flex;font-size:14px;gap:6px;line-height:24px;min-height:32px;padding:4px 12px;position:relative;text-align:left;transform:translateZ(0);transition:var(--el-transition-duration)}.el-select__wrapper.is-filterable{cursor:text}.el-select__wrapper.is-focused{box-shadow:0 0 0 1px var(--el-color-primary) inset}.el-select__wrapper.is-hovering:not(.is-focused){box-shadow:0 0 0 1px var(--el-border-color-hover) inset}.el-select__wrapper.is-disabled{background-color:var(--el-fill-color-light);color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select__wrapper.is-disabled,.el-select__wrapper.is-disabled:hover{box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select__wrapper.is-disabled.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-select__wrapper.is-disabled .el-select__selected-item{color:var(--el-select-disabled-color)}.el-select__wrapper.is-disabled .el-select__caret,.el-select__wrapper.is-disabled .el-tag,.el-select__wrapper.is-disabled input{cursor:not-allowed}.el-select__wrapper.is-disabled .el-select__prefix,.el-select__wrapper.is-disabled .el-select__suffix{pointer-events:none}.el-select__prefix,.el-select__suffix{align-items:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));display:flex;flex-shrink:0;gap:6px}.el-select__caret{color:var(--el-select-input-color);cursor:pointer;font-size:var(--el-select-input-font-size);transform:rotate(0deg);transition:var(--el-transition-duration)}.el-select__caret.is-reverse{transform:rotate(180deg)}.el-select__clear{cursor:pointer}.el-select__clear:hover{color:var(--el-select-close-hover-color)}.el-select__selection{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:6px;min-width:0;position:relative}.el-select__selection.is-near{margin-left:-8px}.el-select__selection .el-tag{border-color:transparent;cursor:pointer}.el-select__selection .el-tag.el-tag--plain{border-color:var(--el-tag-border-color)}.el-select__selection .el-tag .el-tag__content{min-width:0}.el-select__selected-item{display:flex;flex-wrap:wrap;-webkit-user-select:none;user-select:none}.el-select__tags-text{line-height:normal}.el-select__placeholder,.el-select__tags-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-select__placeholder{color:var(--el-input-text-color,var(--el-text-color-regular));position:absolute;top:50%;transform:translateY(-50%);width:100%;z-index:-1}.el-select__placeholder.is-transparent{color:var(--el-text-color-placeholder);-webkit-user-select:none;user-select:none}.el-select__popper.el-popper{background:var(--el-bg-color-overlay);box-shadow:var(--el-box-shadow-light)}.el-select__popper.el-popper,.el-select__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-left-color:transparent;border-top-color:transparent}.el-select__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-select__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:transparent;border-left-color:transparent}.el-select__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-select__input-wrapper{flex:1}.el-select__input-wrapper.is-hidden{opacity:0;position:absolute;z-index:-1}.el-select__input{appearance:none;background-color:transparent;border:none;color:var(--el-select-multiple-input-color);font-family:inherit;font-size:inherit;height:24px;outline:none;padding:0;width:100%}.el-select__input-calculator{left:0;max-width:100%;overflow:hidden;position:absolute;top:0;visibility:hidden;white-space:pre}.el-select--large .el-select__wrapper{font-size:14px;gap:6px;line-height:24px;min-height:40px;padding:8px 16px}.el-select--large .el-select__selection{gap:6px}.el-select--large .el-select__selection.is-near{margin-left:-8px}.el-select--large .el-select__prefix,.el-select--large .el-select__suffix{gap:6px}.el-select--large .el-select__input{height:24px}.el-select--small .el-select__wrapper{font-size:12px;gap:4px;line-height:20px;min-height:24px;padding:2px 8px}.el-select--small .el-select__selection{gap:4px}.el-select--small .el-select__selection.is-near{margin-left:-6px}.el-select--small .el-select__prefix,.el-select--small .el-select__suffix{gap:4px}.el-select--small .el-select__input{height:20px}.el-checkbox{--el-checkbox-font-size:14px;--el-checkbox-font-weight:var(--el-font-weight-primary);--el-checkbox-text-color:var(--el-text-color-regular);--el-checkbox-input-height:14px;--el-checkbox-input-width:14px;--el-checkbox-border-radius:var(--el-border-radius-small);--el-checkbox-bg-color:var(--el-fill-color-blank);--el-checkbox-input-border:var(--el-border);--el-checkbox-disabled-border-color:var(--el-border-color);--el-checkbox-disabled-input-fill:var(--el-fill-color-light);--el-checkbox-disabled-icon-color:var(--el-text-color-placeholder);--el-checkbox-disabled-checked-input-fill:var(--el-border-color-extra-light);--el-checkbox-disabled-checked-input-border-color:var(--el-border-color);--el-checkbox-disabled-checked-icon-color:var(--el-text-color-placeholder);--el-checkbox-checked-text-color:var(--el-color-primary);--el-checkbox-checked-input-border-color:var(--el-color-primary);--el-checkbox-checked-bg-color:var(--el-color-primary);--el-checkbox-checked-icon-color:var(--el-color-white);--el-checkbox-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-checkbox-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-checkbox-font-weight);height:var(--el-checkbox-height,32px);margin-right:30px;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-checkbox.is-disabled{cursor:not-allowed}.el-checkbox.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-checkbox.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-checkbox.is-bordered.is-disabled{border-color:var(--el-border-color-lighter)}.el-checkbox.is-bordered.el-checkbox--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__label{font-size:var(--el-font-size-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:0 11px 0 7px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox input:focus-visible+.el-checkbox__inner{border-radius:var(--el-checkbox-border-radius);outline:2px solid var(--el-checkbox-input-border-color-hover);outline-offset:1px}.el-checkbox__input{cursor:pointer;display:inline-flex;outline:none;position:relative;white-space:nowrap}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:var(--el-checkbox-disabled-input-fill);border-color:var(--el-checkbox-disabled-border-color);cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-icon-color);cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-disabled-checked-icon-color);border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:var(--el-disabled-text-color);cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-checked-icon-color);transform:translate(-45%,-60%) rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--el-checkbox-checked-text-color)}.el-checkbox__input.is-focus:not(.is-checked) .el-checkbox__original:not(:focus-visible){border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-checked-icon-color);content:"";display:block;height:2px;left:0;position:absolute;right:0;top:5px;transform:scale(.5)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{background-color:var(--el-checkbox-bg-color);border:var(--el-checkbox-input-border);border-radius:var(--el-checkbox-border-radius);box-sizing:border-box;display:inline-block;height:var(--el-checkbox-input-height);position:relative;transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46),outline .25s cubic-bezier(.71,-.46,.29,1.46);width:var(--el-checkbox-input-width);z-index:var(--el-index-normal)}.el-checkbox__inner:hover{border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__inner:after{border:1px solid transparent;border-left:0;border-top:0;box-sizing:content-box;content:"";height:7px;left:50%;position:absolute;top:50%;transform:translate(-45%,-60%) rotate(45deg) scaleY(0);transform-origin:center;transition:transform .15s ease-in .05s;width:3px}.el-checkbox__original{height:0;margin:0;opacity:0;outline:none;position:absolute;width:0;z-index:-1}.el-checkbox__label{display:inline-block;font-size:var(--el-checkbox-font-size);line-height:1;padding-left:8px}.el-checkbox.el-checkbox--large{height:40px}.el-checkbox.el-checkbox--large .el-checkbox__label{font-size:14px}.el-checkbox.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.el-checkbox--small{height:24px}.el-checkbox.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.el-checkbox--small .el-checkbox__input.is-indeterminate .el-checkbox__inner:before{top:4px}.el-checkbox.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox:last-of-type{margin-right:0} \ No newline at end of file diff --git a/frontend-dist/css/385.20c34d33.css.gz b/frontend-dist/css/385.20c34d33.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..34738abb841df5134f25bc5dacfd89aa03d69b2c GIT binary patch literal 4931 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 BvFZQ- literal 0 HcmV?d00001 diff --git a/frontend-dist/css/428.8044ed41.css b/frontend-dist/css/428.8044ed41.css deleted file mode 100644 index a0f90892..00000000 --- a/frontend-dist/css/428.8044ed41.css +++ /dev/null @@ -1 +0,0 @@ -:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:0.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;border-radius:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-modal-dialog.is-penetrable{pointer-events:none}.el-modal-dialog.is-penetrable .el-dialog{pointer-events:auto}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-overlay.is-drawer{overflow:hidden}.el-drawer{--el-drawer-bg-color:var(--el-dialog-bg-color,var(--el-bg-color));--el-drawer-padding-primary:var(--el-dialog-padding-primary,20px);--el-drawer-dragger-size:8px;background-color:var(--el-drawer-bg-color);box-shadow:var(--el-box-shadow-dark);box-sizing:border-box;display:flex;flex-direction:column;position:absolute;transition:all var(--el-transition-duration)}.el-drawer .btt,.el-drawer .ltr,.el-drawer .rtl,.el-drawer .ttb{transform:translate(0)}.el-drawer__sr-focus:focus{outline:none!important}.el-drawer__header{align-items:center;color:var(--el-text-color-primary);display:flex;margin-bottom:32px;overflow:hidden;padding:var(--el-drawer-padding-primary);padding-bottom:0}.el-drawer__header>:first-child{flex:1}.el-drawer__title{flex:1;font-size:16px;line-height:inherit;margin:0}.el-drawer__footer{overflow:hidden;padding:var(--el-drawer-padding-primary);padding-top:10px;text-align:right}.el-drawer__close-btn{background-color:transparent;border:none;color:inherit;cursor:pointer;display:inline-flex;font-size:var(--el-font-size-extra-large);outline:none}.el-drawer__close-btn:focus i,.el-drawer__close-btn:hover i{color:var(--el-color-primary)}.el-drawer__body{flex:1;overflow:auto;padding:var(--el-drawer-padding-primary)}.el-drawer__body>*{box-sizing:border-box}.el-drawer.is-dragging{transition:none}.el-drawer__dragger{-webkit-user-select:none;user-select:none}.el-drawer__dragger,.el-drawer__dragger:before{background-color:transparent;position:absolute;transition:all .2s}.el-drawer__dragger:before{content:""}.el-drawer__dragger:hover:before{background-color:var(--el-color-primary)}.el-drawer.ltr,.el-drawer.rtl{bottom:0;height:100%;top:0}.el-drawer.ltr>.el-drawer__dragger,.el-drawer.rtl>.el-drawer__dragger{bottom:0;cursor:ew-resize;height:100%;top:0;width:var(--el-drawer-dragger-size)}.el-drawer.ltr>.el-drawer__dragger:before,.el-drawer.rtl>.el-drawer__dragger:before{bottom:0;top:0;width:3px}.el-drawer.btt,.el-drawer.ttb{left:0;right:0;width:100%}.el-drawer.btt>.el-drawer__dragger,.el-drawer.ttb>.el-drawer__dragger{cursor:ns-resize;height:var(--el-drawer-dragger-size);left:0;right:0;width:100%}.el-drawer.btt>.el-drawer__dragger:before,.el-drawer.ttb>.el-drawer__dragger:before{height:3px;left:0;right:0}.el-drawer.ltr{left:0}.el-drawer.ltr>.el-drawer__dragger{right:0}.el-drawer.ltr>.el-drawer__dragger:before{right:-2px}.el-drawer.rtl{right:0}.el-drawer.rtl>.el-drawer__dragger{left:0}.el-drawer.rtl>.el-drawer__dragger:before{left:-2px}.el-drawer.ttb{top:0}.el-drawer.ttb>.el-drawer__dragger{bottom:0}.el-drawer.ttb>.el-drawer__dragger:before{bottom:-2px}.el-drawer.btt{bottom:0}.el-drawer.btt>.el-drawer__dragger{top:0}.el-drawer.btt>.el-drawer__dragger:before{top:-2px}.el-modal-drawer.is-penetrable{pointer-events:none}.el-modal-drawer.is-penetrable .el-drawer{pointer-events:auto}.el-drawer-fade-enter-active,.el-drawer-fade-leave-active{transition:all var(--el-transition-duration)}.el-drawer-fade-enter-active,.el-drawer-fade-enter-from,.el-drawer-fade-enter-to,.el-drawer-fade-leave-active,.el-drawer-fade-leave-from,.el-drawer-fade-leave-to{overflow:hidden!important}.el-drawer-fade-enter-from,.el-drawer-fade-leave-to{background-color:transparent!important}.el-drawer-fade-enter-from .rtl,.el-drawer-fade-leave-to .rtl{transform:translateX(100%)}.el-drawer-fade-enter-from .ltr,.el-drawer-fade-leave-to .ltr{transform:translateX(-100%)}.el-drawer-fade-enter-from .ttb,.el-drawer-fade-leave-to .ttb{transform:translateY(-100%)}.el-drawer-fade-enter-from .btt,.el-drawer-fade-leave-to .btt{transform:translateY(100%)}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-radio-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-radio-font-weight);height:32px;margin-right:30px;outline:none;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{border-color:var(--el-border-color-lighter);cursor:not-allowed}.el-radio.is-bordered.el-radio--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.is-bordered.el-radio--small{border-radius:var(--el-border-radius-base);padding:0 11px 0 7px}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{cursor:pointer;display:inline-flex;outline:none;position:relative;vertical-align:middle;white-space:nowrap}.el-radio__input.is-disabled .el-radio__inner{border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled .el-radio__inner:after{background-color:var(--el-disabled-bg-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{background:var(--el-color-primary);border-color:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{background-color:var(--el-color-white);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{background-color:var(--el-radio-input-bg-color);border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);box-sizing:border-box;cursor:pointer;display:inline-block;height:var(--el-radio-input-height);position:relative;width:var(--el-radio-input-width)}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{border-radius:var(--el-radio-input-border-radius);content:"";height:4px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);transition:transform .15s ease-in;width:4px}.el-radio__original{bottom:0;left:0;margin:0;opacity:0;outline:none;position:absolute;right:0;top:0;z-index:-1}.el-radio__original:focus-visible+.el-radio__inner{border-radius:var(--el-radio-input-border-radius);outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{height:12px;width:12px}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transform:scaleY(1);transform-origin:center top;transition:var(--el-transition-md-fade)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transform:scaleY(1);transform-origin:center bottom;transition:var(--el-transition-md-fade)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transform:scale(1);transform-origin:top left;transition:var(--el-transition-md-fade)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-enter-active,.el-collapse-transition-leave-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-tree{--el-tree-node-content-height:26px;--el-tree-node-hover-bg-color:var(--el-fill-color-light);--el-tree-text-color:var(--el-text-color-regular);--el-tree-expand-icon-color:var(--el-text-color-placeholder);background:var(--el-fill-color-blank);color:var(--el-tree-text-color);cursor:default;font-size:var(--el-font-size-base);position:relative}.el-tree__empty-block{height:100%;min-height:60px;position:relative;text-align:center;width:100%}.el-tree__empty-text{color:var(--el-text-color-secondary);font-size:var(--el-font-size-base);left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.el-tree__drop-indicator{background-color:var(--el-color-primary);height:1px;left:0;position:absolute;right:0}.el-tree-node{outline:none;white-space:nowrap}.el-tree-node:focus>.el-tree-node__content{background-color:var(--el-tree-node-hover-bg-color)}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:var(--el-color-primary);color:#fff}.el-tree-node__content{--el-checkbox-height:var(--el-tree-node-content-height);align-items:center;cursor:pointer;display:flex;height:var(--el-tree-node-content-height)}.el-tree-node__content>.el-tree-node__expand-icon{box-sizing:content-box;padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree-node__content:hover{background-color:var(--el-tree-node-hover-bg-color)}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{color:var(--el-tree-expand-icon-color);cursor:pointer;font-size:12px;transform:rotate(0deg);transition:transform var(--el-transition-duration) ease-in-out}.el-tree-node__expand-icon.expanded{transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default;visibility:hidden}.el-tree-node__expand-icon.is-hidden{visibility:hidden}.el-tree-node__loading-icon{color:var(--el-tree-expand-icon-color);font-size:var(--el-font-size-base);margin-right:8px}.el-tree-node>.el-tree-node__children{background-color:transparent;overflow:hidden}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:var(--el-color-primary-light-9)}.el-text{--el-text-font-size:var(--el-font-size-base);--el-text-color:var(--el-text-color-regular);align-self:center;color:var(--el-text-color);font-size:var(--el-text-font-size);margin:0;overflow-wrap:break-word;padding:0}.el-text.is-truncated{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-text.is-line-clamp{display:-webkit-inline-box;-webkit-box-orient:vertical;overflow:hidden}.el-text--large{--el-text-font-size:var(--el-font-size-medium)}.el-text--default{--el-text-font-size:var(--el-font-size-base)}.el-text--small{--el-text-font-size:var(--el-font-size-extra-small)}.el-text.el-text--primary{--el-text-color:var(--el-color-primary)}.el-text.el-text--success{--el-text-color:var(--el-color-success)}.el-text.el-text--warning{--el-text-color:var(--el-color-warning)}.el-text.el-text--danger{--el-text-color:var(--el-color-danger)}.el-text.el-text--error{--el-text-color:var(--el-color-error)}.el-text.el-text--info{--el-text-color:var(--el-color-info)}.el-text>.el-icon{vertical-align:-2px}.el-popover{--el-popover-bg-color:var(--el-bg-color-overlay);--el-popover-font-size:var(--el-font-size-base);--el-popover-border-color:var(--el-border-color-lighter);--el-popover-padding:12px;--el-popover-padding-large:18px 20px;--el-popover-title-font-size:16px;--el-popover-title-text-color:var(--el-text-color-primary);--el-popover-border-radius:4px}.el-popover.el-popper{background:var(--el-popover-bg-color);border:1px solid var(--el-popover-border-color);border-radius:var(--el-popover-border-radius);box-shadow:var(--el-box-shadow-light);box-sizing:border-box;color:var(--el-text-color-regular);font-size:var(--el-popover-font-size);line-height:1.4;min-width:150px;overflow-wrap:break-word;padding:var(--el-popover-padding);z-index:var(--el-index-popper)}.el-popover.el-popper--plain{padding:var(--el-popover-padding-large)}.el-popover__title{color:var(--el-popover-title-text-color);font-size:var(--el-popover-title-font-size);line-height:1;margin-bottom:12px}.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing){outline-width:0}.el-popover.el-popper.is-dark{--el-popover-bg-color:var(--el-text-color-primary);--el-popover-border-color:var(--el-text-color-primary);--el-popover-title-text-color:var(--el-bg-color);color:var(--el-bg-color)}.el-popover.el-popper:focus,.el-popover.el-popper:focus:active{outline-width:0}.el-radio-group{align-items:center;display:inline-flex;flex-wrap:wrap;font-size:0}.directory-tree-picker[data-v-62eab69a],.drawer-trigger-wrapper[data-v-62eab69a],.popover-trigger-wrapper[data-v-62eab69a]{display:inline-block}.tree-container[data-v-62eab69a]{min-height:200px;max-height:400px;overflow-y:auto;padding:8px}.directory-tree[data-v-62eab69a]{background:transparent;--el-tree-node-hover-bg-color:var(--el-fill-color-light)}.directory-tree[data-v-62eab69a] .el-tree-node__content{height:44px;padding:0 8px;border-radius:8px;transition:all .2s ease}.directory-tree[data-v-62eab69a] .el-tree-node__content:hover{background-color:var(--el-fill-color-light)}.directory-tree[data-v-62eab69a] .el-tree-node.is-current>.el-tree-node__content{background-color:var(--el-color-primary-light-9)}.tree-node[data-v-62eab69a]{display:flex;align-items:center;gap:8px;padding:4px 0;width:100%;min-height:36px}.tree-node.is-current[data-v-62eab69a]{color:var(--el-color-primary);font-weight:500}.folder-icon[data-v-62eab69a]{color:var(--el-color-warning);font-size:16px;flex-shrink:0}.node-label[data-v-62eab69a]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mobile-tree[data-v-62eab69a] .el-tree-node__content{height:48px;padding:0 12px}.mobile-tree .tree-node[data-v-62eab69a]{min-height:40px}.error-state[data-v-62eab69a]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px 20px;text-align:center}.error-icon[data-v-62eab69a]{font-size:32px;color:var(--el-color-danger)}.error-text[data-v-62eab69a]{color:var(--el-text-color-secondary);font-size:14px}.tree-container[data-v-62eab69a] .el-loading-mask{border-radius:8px}.el-card{--el-card-border-color:var(--el-border-color-light);--el-card-border-radius:4px;--el-card-padding:20px;--el-card-bg-color:var(--el-fill-color-blank);background-color:var(--el-card-bg-color);border:1px solid var(--el-card-border-color);border-radius:var(--el-card-border-radius);color:var(--el-text-color-primary);display:flex;flex-direction:column;overflow:hidden;transition:var(--el-transition-duration)}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{box-shadow:var(--el-box-shadow-light)}.el-card__header{border-bottom:1px solid var(--el-card-border-color);box-sizing:border-box;padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding)}.el-card__body{flex:1;overflow:auto;padding:var(--el-card-padding)}.el-card__footer{border-top:1px solid var(--el-card-border-color);box-sizing:border-box;padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding)}.directory-tree-popover{padding:0!important;border-radius:12px!important;box-shadow:var(--el-box-shadow-light)!important}.el-zoom-in-top-enter-active.directory-tree-popover,.el-zoom-in-top-leave-active.directory-tree-popover{transition:transform .15s ease-out,opacity .15s ease-out!important}.directory-tree-drawer{border-radius:16px 16px 0 0!important}.directory-tree-drawer .el-drawer__header{margin-bottom:0;padding:16px 20px;border-bottom:1px solid var(--el-border-color-lighter)}.directory-tree-drawer .el-drawer__body{padding:0} \ No newline at end of file diff --git a/frontend-dist/css/428.8044ed41.css.gz b/frontend-dist/css/428.8044ed41.css.gz deleted file mode 100644 index cda74beef54dcede37fc52c1b25366080dd93948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4026 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.el-icon{vertical-align:-2px}.el-overlay.is-drawer{overflow:hidden}.el-drawer{--el-drawer-bg-color:var(--el-dialog-bg-color,var(--el-bg-color));--el-drawer-padding-primary:var(--el-dialog-padding-primary,20px);--el-drawer-dragger-size:8px;background-color:var(--el-drawer-bg-color);box-shadow:var(--el-box-shadow-dark);box-sizing:border-box;display:flex;flex-direction:column;position:absolute;transition:all var(--el-transition-duration)}.el-drawer .btt,.el-drawer .ltr,.el-drawer .rtl,.el-drawer .ttb{transform:translate(0)}.el-drawer__sr-focus:focus{outline:none!important}.el-drawer__header{align-items:center;color:var(--el-text-color-primary);display:flex;margin-bottom:32px;overflow:hidden;padding:var(--el-drawer-padding-primary);padding-bottom:0}.el-drawer__header>:first-child{flex:1}.el-drawer__title{flex:1;font-size:16px;line-height:inherit;margin:0}.el-drawer__footer{overflow:hidden;padding:var(--el-drawer-padding-primary);padding-top:10px;text-align:right}.el-drawer__close-btn{background-color:transparent;border:none;color:inherit;cursor:pointer;display:inline-flex;font-size:var(--el-font-size-extra-large);outline:none}.el-drawer__close-btn:focus i,.el-drawer__close-btn:hover i{color:var(--el-color-primary)}.el-drawer__body{flex:1;overflow:auto;padding:var(--el-drawer-padding-primary)}.el-drawer__body>*{box-sizing:border-box}.el-drawer.is-dragging{transition:none}.el-drawer__dragger{-webkit-user-select:none;user-select:none}.el-drawer__dragger,.el-drawer__dragger:before{background-color:transparent;position:absolute;transition:all .2s}.el-drawer__dragger:before{content:""}.el-drawer__dragger:hover:before{background-color:var(--el-color-primary)}.el-drawer.ltr,.el-drawer.rtl{bottom:0;height:100%;top:0}.el-drawer.ltr>.el-drawer__dragger,.el-drawer.rtl>.el-drawer__dragger{bottom:0;cursor:ew-resize;height:100%;top:0;width:var(--el-drawer-dragger-size)}.el-drawer.ltr>.el-drawer__dragger:before,.el-drawer.rtl>.el-drawer__dragger:before{bottom:0;top:0;width:3px}.el-drawer.btt,.el-drawer.ttb{left:0;right:0;width:100%}.el-drawer.btt>.el-drawer__dragger,.el-drawer.ttb>.el-drawer__dragger{cursor:ns-resize;height:var(--el-drawer-dragger-size);left:0;right:0;width:100%}.el-drawer.btt>.el-drawer__dragger:before,.el-drawer.ttb>.el-drawer__dragger:before{height:3px;left:0;right:0}.el-drawer.ltr{left:0}.el-drawer.ltr>.el-drawer__dragger{right:0}.el-drawer.ltr>.el-drawer__dragger:before{right:-2px}.el-drawer.rtl{right:0}.el-drawer.rtl>.el-drawer__dragger{left:0}.el-drawer.rtl>.el-drawer__dragger:before{left:-2px}.el-drawer.ttb{top:0}.el-drawer.ttb>.el-drawer__dragger{bottom:0}.el-drawer.ttb>.el-drawer__dragger:before{bottom:-2px}.el-drawer.btt{bottom:0}.el-drawer.btt>.el-drawer__dragger{top:0}.el-drawer.btt>.el-drawer__dragger:before{top:-2px}.el-modal-drawer.is-penetrable{pointer-events:none}.el-modal-drawer.is-penetrable .el-drawer{pointer-events:auto}.el-drawer-fade-enter-active,.el-drawer-fade-leave-active{transition:all var(--el-transition-duration)}.el-drawer-fade-enter-active,.el-drawer-fade-enter-from,.el-drawer-fade-enter-to,.el-drawer-fade-leave-active,.el-drawer-fade-leave-from,.el-drawer-fade-leave-to{overflow:hidden!important}.el-drawer-fade-enter-from,.el-drawer-fade-leave-to{background-color:transparent!important}.el-drawer-fade-enter-from .rtl,.el-drawer-fade-leave-to .rtl{transform:translateX(100%)}.el-drawer-fade-enter-from .ltr,.el-drawer-fade-leave-to .ltr{transform:translateX(-100%)}.el-drawer-fade-enter-from .ttb,.el-drawer-fade-leave-to .ttb{transform:translateY(-100%)}.el-drawer-fade-enter-from .btt,.el-drawer-fade-leave-to .btt{transform:translateY(100%)}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button:first-child:last-child{border-bottom-left-radius:var(--el-border-radius-base);border-bottom-right-radius:var(--el-border-radius-base);border-top-left-radius:var(--el-border-radius-base);border-top-right-radius:var(--el-border-radius-base)}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:var(--el-border-radius-round)}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button.is-active,.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-button-group--horizontal{display:inline-block;vertical-align:middle}.el-button-group--horizontal:after,.el-button-group--horizontal:before{content:"";display:table}.el-button-group--horizontal:after{clear:both}.el-button-group--horizontal>.el-button{float:left;position:relative}.el-button-group--horizontal>.el-button:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.el-button-group--horizontal>.el-button:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.el-button-group--horizontal>.el-button:not(:last-child){margin-right:-1px}.el-button-group--horizontal .el-button--primary:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--primary:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--primary:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--success:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--success:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--success:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--warning:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--warning:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--warning:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--danger:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--danger:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--danger:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--info:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--info:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--info:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal>.el-dropdown>.el-button{border-bottom-left-radius:0;border-left-color:var(--el-button-divide-border-color);border-top-left-radius:0}.el-button-group--vertical{align-items:stretch;display:inline-flex;flex-direction:column}.el-button-group--vertical>.el-button{margin-top:-1px}.el-button-group--vertical>.el-button:first-child{border-bottom-left-radius:0;border-bottom-right-radius:0}.el-button-group--vertical>.el-button:last-child{border-top-left-radius:0;border-top-right-radius:0}.el-button-group--vertical>.el-dropdown{margin-top:-1px}.el-button-group--vertical>.el-dropdown>.el-button{border-left-color:var(--el-button-divide-border-color);border-top-left-radius:0;border-top-right-radius:0}.el-button-group--vertical .el-button--primary:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--primary:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--primary:not(:first-child):not(:last-child){border-bottom-color:var(--el-button-divide-border-color);border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--success:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--success:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--success:not(:first-child):not(:last-child){border-bottom-color:var(--el-button-divide-border-color);border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--warning:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--warning:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--warning:not(:first-child):not(:last-child){border-bottom-color:var(--el-button-divide-border-color);border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--danger:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--danger:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--danger:not(:first-child):not(:last-child){border-bottom-color:var(--el-button-divide-border-color);border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--info:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--info:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--info:not(:first-child):not(:last-child){border-bottom-color:var(--el-button-divide-border-color);border-top-color:var(--el-button-divide-border-color)}.el-dropdown{--el-dropdown-menu-box-shadow:var(--el-box-shadow-light);--el-dropdown-menuItem-hover-fill:var(--el-color-primary-light-9);--el-dropdown-menuItem-hover-color:var(--el-color-primary);--el-dropdown-menu-index:10;color:var(--el-text-color-regular);display:inline-flex;font-size:var(--el-font-size-base);line-height:1;position:relative;vertical-align:top}.el-dropdown.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-dropdown__popper{--el-dropdown-menu-box-shadow:var(--el-box-shadow-light);--el-dropdown-menuItem-hover-fill:var(--el-color-primary-light-9);--el-dropdown-menuItem-hover-color:var(--el-color-primary);--el-dropdown-menu-index:10}.el-dropdown__popper.el-popper{background:var(--el-bg-color-overlay);box-shadow:var(--el-dropdown-menu-box-shadow)}.el-dropdown__popper.el-popper,.el-dropdown__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-dropdown__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-left-color:transparent;border-top-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:transparent;border-left-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-dropdown__popper .el-dropdown-menu{border:none}.el-dropdown__popper .el-dropdown__popper-selfdefine{outline:none}.el-dropdown__popper .el-scrollbar__bar{z-index:calc(var(--el-dropdown-menu-index) + 1)}.el-dropdown__popper .el-dropdown__list{box-sizing:border-box;list-style:none;margin:0;padding:0}.el-dropdown .el-dropdown__caret-button{align-items:center;border-left:none;display:inline-flex;justify-content:center;padding-left:0;padding-right:0;width:32px}.el-dropdown .el-dropdown__caret-button>span{display:inline-flex}.el-dropdown .el-dropdown__caret-button:before{background:var(--el-overlay-color-lighter);bottom:-1px;content:"";display:block;left:0;position:absolute;top:-1px;width:1px}.el-dropdown .el-dropdown__caret-button.el-button:before{background:var(--el-border-color);opacity:.5}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{font-size:inherit;padding-left:0}.el-dropdown .el-dropdown-selfdefine{outline:none}.el-dropdown--large .el-dropdown__caret-button{width:40px}.el-dropdown--small .el-dropdown__caret-button{width:24px}.el-dropdown-menu{background-color:var(--el-bg-color-overlay);border:none;border-radius:var(--el-border-radius-base);box-shadow:none;left:0;list-style:none;margin:0;padding:5px 0;position:relative;top:0;z-index:var(--el-dropdown-menu-index)}.el-dropdown-menu__item{align-items:center;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:var(--el-font-size-base);line-height:22px;list-style:none;margin:0;outline:none;padding:5px 16px;white-space:nowrap}.el-dropdown-menu__item:not(.is-disabled):focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:var(--el-dropdown-menuItem-hover-fill);color:var(--el-dropdown-menuItem-hover-color)}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{border-top:1px solid var(--el-border-color-lighter);margin:6px 0}.el-dropdown-menu__item.is-disabled{color:var(--el-text-color-disabled);cursor:not-allowed}.el-dropdown-menu--large{padding:7px 0}.el-dropdown-menu--large .el-dropdown-menu__item{font-size:14px;line-height:22px;padding:7px 20px}.el-dropdown-menu--large .el-dropdown-menu__item--divided{margin:8px 0}.el-dropdown-menu--small{padding:3px 0}.el-dropdown-menu--small .el-dropdown-menu__item{font-size:12px;line-height:20px;padding:2px 12px}.el-dropdown-menu--small .el-dropdown-menu__item--divided{margin:4px 0}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transform:scaleY(1);transform-origin:center top;transition:var(--el-transition-md-fade)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transform:scaleY(1);transform-origin:center bottom;transition:var(--el-transition-md-fade)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transform:scale(1);transform-origin:top left;transition:var(--el-transition-md-fade)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-enter-active,.el-collapse-transition-leave-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-tree{--el-tree-node-content-height:26px;--el-tree-node-hover-bg-color:var(--el-fill-color-light);--el-tree-text-color:var(--el-text-color-regular);--el-tree-expand-icon-color:var(--el-text-color-placeholder);background:var(--el-fill-color-blank);color:var(--el-tree-text-color);cursor:default;font-size:var(--el-font-size-base);position:relative}.el-tree__empty-block{height:100%;min-height:60px;position:relative;text-align:center;width:100%}.el-tree__empty-text{color:var(--el-text-color-secondary);font-size:var(--el-font-size-base);left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.el-tree__drop-indicator{background-color:var(--el-color-primary);height:1px;left:0;position:absolute;right:0}.el-tree-node{outline:none;white-space:nowrap}.el-tree-node:focus>.el-tree-node__content{background-color:var(--el-tree-node-hover-bg-color)}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:var(--el-color-primary);color:#fff}.el-tree-node__content{--el-checkbox-height:var(--el-tree-node-content-height);align-items:center;cursor:pointer;display:flex;height:var(--el-tree-node-content-height)}.el-tree-node__content>.el-tree-node__expand-icon{box-sizing:content-box;padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree-node__content:hover{background-color:var(--el-tree-node-hover-bg-color)}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{color:var(--el-tree-expand-icon-color);cursor:pointer;font-size:12px;transform:rotate(0deg);transition:transform var(--el-transition-duration) ease-in-out}.el-tree-node__expand-icon.expanded{transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default;visibility:hidden}.el-tree-node__expand-icon.is-hidden{visibility:hidden}.el-tree-node__loading-icon{color:var(--el-tree-expand-icon-color);font-size:var(--el-font-size-base);margin-right:8px}.el-tree-node>.el-tree-node__children{background-color:transparent;overflow:hidden}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:var(--el-color-primary-light-9)}.el-popover{--el-popover-bg-color:var(--el-bg-color-overlay);--el-popover-font-size:var(--el-font-size-base);--el-popover-border-color:var(--el-border-color-lighter);--el-popover-padding:12px;--el-popover-padding-large:18px 20px;--el-popover-title-font-size:16px;--el-popover-title-text-color:var(--el-text-color-primary);--el-popover-border-radius:4px}.el-popover.el-popper{background:var(--el-popover-bg-color);border:1px solid var(--el-popover-border-color);border-radius:var(--el-popover-border-radius);box-shadow:var(--el-box-shadow-light);box-sizing:border-box;color:var(--el-text-color-regular);font-size:var(--el-popover-font-size);line-height:1.4;min-width:150px;overflow-wrap:break-word;padding:var(--el-popover-padding);z-index:var(--el-index-popper)}.el-popover.el-popper--plain{padding:var(--el-popover-padding-large)}.el-popover__title{color:var(--el-popover-title-text-color);font-size:var(--el-popover-title-font-size);line-height:1;margin-bottom:12px}.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing){outline-width:0}.el-popover.el-popper.is-dark{--el-popover-bg-color:var(--el-text-color-primary);--el-popover-border-color:var(--el-text-color-primary);--el-popover-title-text-color:var(--el-bg-color);color:var(--el-bg-color)}.el-popover.el-popper:focus,.el-popover.el-popper:focus:active{outline-width:0}.directory-tree-picker[data-v-62eab69a],.drawer-trigger-wrapper[data-v-62eab69a],.popover-trigger-wrapper[data-v-62eab69a]{display:inline-block}.tree-container[data-v-62eab69a]{min-height:200px;max-height:400px;overflow-y:auto;padding:8px}.directory-tree[data-v-62eab69a]{background:transparent;--el-tree-node-hover-bg-color:var(--el-fill-color-light)}.directory-tree[data-v-62eab69a] .el-tree-node__content{height:44px;padding:0 8px;border-radius:8px;transition:all .2s ease}.directory-tree[data-v-62eab69a] .el-tree-node__content:hover{background-color:var(--el-fill-color-light)}.directory-tree[data-v-62eab69a] .el-tree-node.is-current>.el-tree-node__content{background-color:var(--el-color-primary-light-9)}.tree-node[data-v-62eab69a]{display:flex;align-items:center;gap:8px;padding:4px 0;width:100%;min-height:36px}.tree-node.is-current[data-v-62eab69a]{color:var(--el-color-primary);font-weight:500}.folder-icon[data-v-62eab69a]{color:var(--el-color-warning);font-size:16px;flex-shrink:0}.node-label[data-v-62eab69a]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mobile-tree[data-v-62eab69a] .el-tree-node__content{height:48px;padding:0 12px}.mobile-tree .tree-node[data-v-62eab69a]{min-height:40px}.error-state[data-v-62eab69a]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px 20px;text-align:center}.error-icon[data-v-62eab69a]{font-size:32px;color:var(--el-color-danger)}.error-text[data-v-62eab69a]{color:var(--el-text-color-secondary);font-size:14px}.tree-container[data-v-62eab69a] .el-loading-mask{border-radius:8px}.el-card{--el-card-border-color:var(--el-border-color-light);--el-card-border-radius:4px;--el-card-padding:20px;--el-card-bg-color:var(--el-fill-color-blank);background-color:var(--el-card-bg-color);border:1px solid var(--el-card-border-color);border-radius:var(--el-card-border-radius);color:var(--el-text-color-primary);display:flex;flex-direction:column;overflow:hidden;transition:var(--el-transition-duration)}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{box-shadow:var(--el-box-shadow-light)}.el-card__header{border-bottom:1px solid var(--el-card-border-color);box-sizing:border-box;padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding)}.el-card__body{flex:1;overflow:auto;padding:var(--el-card-padding)}.el-card__footer{border-top:1px solid var(--el-card-border-color);box-sizing:border-box;padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding)}.directory-tree-popover{padding:0!important;border-radius:12px!important;box-shadow:var(--el-box-shadow-light)!important}.el-zoom-in-top-enter-active.directory-tree-popover,.el-zoom-in-top-leave-active.directory-tree-popover{transition:transform .15s ease-out,opacity .15s ease-out!important}.directory-tree-drawer{border-radius:16px 16px 0 0!important}.directory-tree-drawer .el-drawer__header{margin-bottom:0;padding:16px 20px;border-bottom:1px solid var(--el-border-color-lighter)}.directory-tree-drawer .el-drawer__body{padding:0} \ No newline at end of file diff --git a/frontend-dist/css/451.7e03bef9.css.gz b/frontend-dist/css/451.7e03bef9.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..051488a03b41e8f3664aa1944dda4c5113bafae0 GIT binary patch literal 5055 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 VA%z8Q*;Cr_{{gL#H0c|C0080a;$Hv& literal 0 HcmV?d00001 diff --git a/frontend-dist/css/740.a94dbb46.css b/frontend-dist/css/740.a94dbb46.css deleted file mode 100644 index 9a7c72a8..00000000 --- a/frontend-dist/css/740.a94dbb46.css +++ /dev/null @@ -1 +0,0 @@ -.el-popper{--el-popper-border-radius:var(--el-popover-border-radius,4px);border-radius:var(--el-popper-border-radius);font-size:12px;line-height:20px;min-width:10px;overflow-wrap:break-word;padding:5px 11px;position:absolute;visibility:visible;word-break:normal;z-index:2000}.el-popper.is-dark{color:var(--el-bg-color)}.el-popper.is-dark,.el-popper.is-dark>.el-popper__arrow:before{background:var(--el-text-color-primary);border:1px solid var(--el-text-color-primary)}.el-popper.is-dark>.el-popper__arrow:before{right:0}.el-popper.is-light,.el-popper.is-light>.el-popper__arrow:before{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light)}.el-popper.is-light>.el-popper__arrow:before{right:0}.el-popper.is-pure{padding:0}.el-popper__arrow,.el-popper__arrow:before{height:10px;position:absolute;width:10px;z-index:-1}.el-popper__arrow:before{background:var(--el-text-color-primary);box-sizing:border-box;content:" ";transform:rotate(45deg)}.el-popper[data-popper-placement^=top]>.el-popper__arrow{bottom:-5px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-bottom-right-radius:2px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow{top:-5px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-top-left-radius:2px}.el-popper[data-popper-placement^=left]>.el-popper__arrow{right:-5px}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-top-right-radius:2px}.el-popper[data-popper-placement^=right]>.el-popper__arrow{left:-5px}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-bottom-left-radius:2px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-left-color:transparent!important;border-top-color:transparent!important}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-bottom-color:transparent!important;border-right-color:transparent!important}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-bottom-color:transparent!important;border-left-color:transparent!important}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-right-color:transparent!important;border-top-color:transparent!important}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button:first-child:last-child{border-bottom-left-radius:var(--el-border-radius-base);border-bottom-right-radius:var(--el-border-radius-base);border-top-left-radius:var(--el-border-radius-base);border-top-right-radius:var(--el-border-radius-base)}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:var(--el-border-radius-round)}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button.is-active,.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-button-group--horizontal{display:inline-block;vertical-align:middle}.el-button-group--horizontal:after,.el-button-group--horizontal:before{content:"";display:table}.el-button-group--horizontal:after{clear:both}.el-button-group--horizontal>.el-button{float:left;position:relative}.el-button-group--horizontal>.el-button:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.el-button-group--horizontal>.el-button:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.el-button-group--horizontal>.el-button:not(:last-child){margin-right:-1px}.el-button-group--horizontal .el-button--primary:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--primary:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--primary:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--success:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--success:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--success:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--warning:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--warning:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--warning:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--danger:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--danger:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--danger:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--info:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--info:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--info:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal>.el-dropdown>.el-button{border-bottom-left-radius:0;border-left-color:var(--el-button-divide-border-color);border-top-left-radius:0}.el-button-group--vertical{align-items:stretch;display:inline-flex;flex-direction:column}.el-button-group--vertical>.el-button{margin-top:-1px}.el-button-group--vertical>.el-button:first-child{border-bottom-left-radius:0;border-bottom-right-radius:0}.el-button-group--vertical>.el-button:last-child{border-top-left-radius:0;border-top-right-radius:0}.el-button-group--vertical>.el-dropdown{margin-top:-1px}.el-button-group--vertical>.el-dropdown>.el-button{border-left-color:var(--el-button-divide-border-color);border-top-left-radius:0;border-top-right-radius:0}.el-button-group--vertical .el-button--primary:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--primary:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--primary:not(:first-child):not(:last-child){border-bottom-color:var(--el-button-divide-border-color);border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--success:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--success:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--success:not(:first-child):not(:last-child){border-bottom-color:var(--el-button-divide-border-color);border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--warning:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--warning:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--warning:not(:first-child):not(:last-child){border-bottom-color:var(--el-button-divide-border-color);border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--danger:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--danger:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--danger:not(:first-child):not(:last-child){border-bottom-color:var(--el-button-divide-border-color);border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--info:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--info:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--info:not(:first-child):not(:last-child){border-bottom-color:var(--el-button-divide-border-color);border-top-color:var(--el-button-divide-border-color)}.el-scrollbar{--el-scrollbar-opacity:0.3;--el-scrollbar-bg-color:var(--el-text-color-secondary);--el-scrollbar-hover-opacity:0.5;--el-scrollbar-hover-bg-color:var(--el-text-color-secondary);height:100%;overflow:hidden;position:relative}.el-scrollbar__wrap{height:100%;overflow:auto}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{display:none}.el-scrollbar__thumb{background-color:var(--el-scrollbar-bg-color,var(--el-text-color-secondary));border-radius:inherit;cursor:pointer;display:block;height:0;opacity:var(--el-scrollbar-opacity,.3);position:relative;transition:var(--el-transition-duration) background-color;width:0}.el-scrollbar__thumb:hover{background-color:var(--el-scrollbar-hover-bg-color,var(--el-text-color-secondary));opacity:var(--el-scrollbar-hover-opacity,.5)}.el-scrollbar__bar{border-radius:4px;bottom:2px;position:absolute;right:2px;z-index:1}.el-scrollbar__bar.is-vertical{top:2px;width:6px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-scrollbar-fade-enter-active{transition:opacity .34s ease-out}.el-scrollbar-fade-leave-active{transition:opacity .12s ease-out}.el-scrollbar-fade-enter-from,.el-scrollbar-fade-leave-active{opacity:0}.el-dropdown{--el-dropdown-menu-box-shadow:var(--el-box-shadow-light);--el-dropdown-menuItem-hover-fill:var(--el-color-primary-light-9);--el-dropdown-menuItem-hover-color:var(--el-color-primary);--el-dropdown-menu-index:10;color:var(--el-text-color-regular);display:inline-flex;font-size:var(--el-font-size-base);line-height:1;position:relative;vertical-align:top}.el-dropdown.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-dropdown__popper{--el-dropdown-menu-box-shadow:var(--el-box-shadow-light);--el-dropdown-menuItem-hover-fill:var(--el-color-primary-light-9);--el-dropdown-menuItem-hover-color:var(--el-color-primary);--el-dropdown-menu-index:10}.el-dropdown__popper.el-popper{background:var(--el-bg-color-overlay);box-shadow:var(--el-dropdown-menu-box-shadow)}.el-dropdown__popper.el-popper,.el-dropdown__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-dropdown__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-left-color:transparent;border-top-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:transparent;border-left-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-dropdown__popper .el-dropdown-menu{border:none}.el-dropdown__popper .el-dropdown__popper-selfdefine{outline:none}.el-dropdown__popper .el-scrollbar__bar{z-index:calc(var(--el-dropdown-menu-index) + 1)}.el-dropdown__popper .el-dropdown__list{box-sizing:border-box;list-style:none;margin:0;padding:0}.el-dropdown .el-dropdown__caret-button{align-items:center;border-left:none;display:inline-flex;justify-content:center;padding-left:0;padding-right:0;width:32px}.el-dropdown .el-dropdown__caret-button>span{display:inline-flex}.el-dropdown .el-dropdown__caret-button:before{background:var(--el-overlay-color-lighter);bottom:-1px;content:"";display:block;left:0;position:absolute;top:-1px;width:1px}.el-dropdown .el-dropdown__caret-button.el-button:before{background:var(--el-border-color);opacity:.5}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{font-size:inherit;padding-left:0}.el-dropdown .el-dropdown-selfdefine{outline:none}.el-dropdown--large .el-dropdown__caret-button{width:40px}.el-dropdown--small .el-dropdown__caret-button{width:24px}.el-dropdown-menu{background-color:var(--el-bg-color-overlay);border:none;border-radius:var(--el-border-radius-base);box-shadow:none;left:0;list-style:none;margin:0;padding:5px 0;position:relative;top:0;z-index:var(--el-dropdown-menu-index)}.el-dropdown-menu__item{align-items:center;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:var(--el-font-size-base);line-height:22px;list-style:none;margin:0;outline:none;padding:5px 16px;white-space:nowrap}.el-dropdown-menu__item:not(.is-disabled):focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:var(--el-dropdown-menuItem-hover-fill);color:var(--el-dropdown-menuItem-hover-color)}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{border-top:1px solid var(--el-border-color-lighter);margin:6px 0}.el-dropdown-menu__item.is-disabled{color:var(--el-text-color-disabled);cursor:not-allowed}.el-dropdown-menu--large{padding:7px 0}.el-dropdown-menu--large .el-dropdown-menu__item{font-size:14px;line-height:22px;padding:7px 20px}.el-dropdown-menu--large .el-dropdown-menu__item--divided{margin:8px 0}.el-dropdown-menu--small{padding:3px 0}.el-dropdown-menu--small .el-dropdown-menu__item{font-size:12px;line-height:20px;padding:2px 12px}.el-dropdown-menu--small .el-dropdown-menu__item--divided{margin:4px 0}:root{--el-loading-spinner-size:42px;--el-loading-fullscreen-spinner-size:50px}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{background-color:var(--el-mask-color);bottom:0;left:0;margin:0;position:absolute;right:0;top:0;transition:opacity var(--el-transition-duration);z-index:2000}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:calc((0px - var(--el-loading-fullscreen-spinner-size))/2)}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:var(--el-loading-fullscreen-spinner-size);width:var(--el-loading-fullscreen-spinner-size)}.el-loading-spinner{margin-top:calc((0px - var(--el-loading-spinner-size))/2);position:absolute;text-align:center;top:50%;width:100%}.el-loading-spinner .el-loading-text{color:var(--el-color-primary);font-size:14px;margin:3px 0}.el-loading-spinner .circular{animation:loading-rotate 2s linear infinite;display:inline;height:var(--el-loading-spinner-size);width:var(--el-loading-spinner-size)}.el-loading-spinner .path{animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:var(--el-color-primary);stroke-linecap:round}.el-loading-spinner i{color:var(--el-color-primary)}.el-loading-fade-enter-from,.el-loading-fade-leave-to{opacity:0}@keyframes loading-rotate{to{transform:rotate(1turn)}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-tag{--el-tag-font-size:12px;--el-tag-border-radius:4px;--el-tag-border-radius-rounded:9999px;align-items:center;background-color:var(--el-tag-bg-color);border-color:var(--el-tag-border-color);border-radius:var(--el-tag-border-radius);border-style:solid;border-width:1px;box-sizing:border-box;color:var(--el-tag-text-color);display:inline-flex;font-size:var(--el-tag-font-size);height:24px;justify-content:center;line-height:1;padding:0 9px;vertical-align:middle;white-space:nowrap;--el-icon-size:14px}.el-tag,.el-tag.el-tag--primary{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-bg-color:var(--el-color-success-light-9);--el-tag-border-color:var(--el-color-success-light-8);--el-tag-hover-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-bg-color:var(--el-color-warning-light-9);--el-tag-border-color:var(--el-color-warning-light-8);--el-tag-hover-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-bg-color:var(--el-color-danger-light-9);--el-tag-border-color:var(--el-color-danger-light-8);--el-tag-hover-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-bg-color:var(--el-color-error-light-9);--el-tag-border-color:var(--el-color-error-light-8);--el-tag-hover-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-bg-color:var(--el-color-info-light-9);--el-tag-border-color:var(--el-color-info-light-8);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-hit{border-color:var(--el-color-primary)}.el-tag.is-round{border-radius:var(--el-tag-border-radius-rounded)}.el-tag .el-tag__close{color:var(--el-tag-text-color);flex-shrink:0}.el-tag .el-tag__close:hover{background-color:var(--el-tag-hover-color);color:var(--el-color-white)}.el-tag.el-tag--primary{--el-tag-text-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-text-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-text-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-text-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-text-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-text-color:var(--el-color-info)}.el-tag .el-icon{border-radius:50%;cursor:pointer;display:flex;font-size:calc(var(--el-icon-size) - 2px);height:var(--el-icon-size);width:var(--el-icon-size)}.el-tag .el-tag__close{background-color:transparent;border:none;border-radius:50%;margin-left:6px;outline:none;overflow:hidden;padding:0}.el-tag .el-tag__close:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-tag--dark{--el-tag-text-color:var(--el-color-white)}.el-tag--dark,.el-tag--dark.el-tag--primary{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--success{--el-tag-bg-color:var(--el-color-success);--el-tag-border-color:var(--el-color-success);--el-tag-hover-color:var(--el-color-success-light-3)}.el-tag--dark.el-tag--warning{--el-tag-bg-color:var(--el-color-warning);--el-tag-border-color:var(--el-color-warning);--el-tag-hover-color:var(--el-color-warning-light-3)}.el-tag--dark.el-tag--danger{--el-tag-bg-color:var(--el-color-danger);--el-tag-border-color:var(--el-color-danger);--el-tag-hover-color:var(--el-color-danger-light-3)}.el-tag--dark.el-tag--error{--el-tag-bg-color:var(--el-color-error);--el-tag-border-color:var(--el-color-error);--el-tag-hover-color:var(--el-color-error-light-3)}.el-tag--dark.el-tag--info{--el-tag-bg-color:var(--el-color-info);--el-tag-border-color:var(--el-color-info);--el-tag-hover-color:var(--el-color-info-light-3)}.el-tag--dark.el-tag--danger,.el-tag--dark.el-tag--error,.el-tag--dark.el-tag--info,.el-tag--dark.el-tag--primary,.el-tag--dark.el-tag--success,.el-tag--dark.el-tag--warning{--el-tag-text-color:var(--el-color-white)}.el-tag--plain,.el-tag--plain.el-tag--primary{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary)}.el-tag--plain.el-tag--success{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-success-light-5);--el-tag-hover-color:var(--el-color-success)}.el-tag--plain.el-tag--warning{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-warning-light-5);--el-tag-hover-color:var(--el-color-warning)}.el-tag--plain.el-tag--danger{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-danger-light-5);--el-tag-hover-color:var(--el-color-danger)}.el-tag--plain.el-tag--error{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-error-light-5);--el-tag-hover-color:var(--el-color-error)}.el-tag--plain.el-tag--info{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-info-light-5);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-closable{padding-right:5px}.el-tag--large{height:32px;padding:0 11px;--el-icon-size:16px}.el-tag--large .el-tag__close{margin-left:8px}.el-tag--large.is-closable{padding-right:7px}.el-tag--small{height:20px;padding:0 7px;--el-icon-size:12px}.el-tag--small .el-tag__close{margin-left:4px}.el-tag--small.is-closable{padding-right:3px}.el-tag--small .el-icon-close{transform:scale(.8)}.el-tag.el-tag--primary.is-hit{border-color:var(--el-color-primary)}.el-tag.el-tag--success.is-hit{border-color:var(--el-color-success)}.el-tag.el-tag--warning.is-hit{border-color:var(--el-color-warning)}.el-tag.el-tag--danger.is-hit{border-color:var(--el-color-danger)}.el-tag.el-tag--error.is-hit{border-color:var(--el-color-error)}.el-tag.el-tag--info.is-hit{border-color:var(--el-color-info)}.el-switch{--el-switch-on-color:var(--el-color-primary);--el-switch-off-color:var(--el-border-color);align-items:center;display:inline-flex;font-size:14px;height:32px;line-height:20px;position:relative;vertical-align:middle}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{color:var(--el-text-color-primary);cursor:pointer;display:inline-block;font-size:14px;font-weight:500;height:20px;transition:var(--el-transition-duration-fast);vertical-align:middle}.el-switch__label.is-active{color:var(--el-color-primary)}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{display:inline-block;font-size:14px;line-height:1}.el-switch__label .el-icon{height:inherit}.el-switch__label .el-icon svg{vertical-align:middle}.el-switch__input{height:0;margin:0;opacity:0;position:absolute;width:0}.el-switch__input:focus-visible~.el-switch__core{outline:2px solid var(--el-switch-on-color);outline-offset:1px}.el-switch__core{align-items:center;background:var(--el-switch-off-color);border:1px solid var(--el-switch-border-color,var(--el-switch-off-color));border-radius:10px;box-sizing:border-box;cursor:pointer;display:inline-flex;height:20px;min-width:40px;outline:none;position:relative;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration)}.el-switch__core .el-switch__inner{align-items:center;display:flex;height:16px;justify-content:center;overflow:hidden;padding:0 4px 0 18px;transition:all var(--el-transition-duration);width:100%}.el-switch__core .el-switch__inner .is-icon,.el-switch__core .el-switch__inner .is-text{color:var(--el-color-white);font-size:12px;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-switch__core .el-switch__action{align-items:center;background-color:var(--el-color-white);border-radius:var(--el-border-radius-circle);color:var(--el-switch-off-color);display:flex;height:16px;justify-content:center;left:1px;position:absolute;transition:all var(--el-transition-duration);width:16px}.el-switch.is-checked .el-switch__core{background-color:var(--el-switch-on-color);border-color:var(--el-switch-border-color,var(--el-switch-on-color))}.el-switch.is-checked .el-switch__core .el-switch__action{color:var(--el-switch-on-color);left:calc(100% - 17px)}.el-switch.is-checked .el-switch__core .el-switch__inner{padding:0 18px 0 4px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter-from,.el-switch .label-fade-leave-active{opacity:0}.el-switch--large{font-size:14px;height:40px;line-height:24px}.el-switch--large .el-switch__label{font-size:14px;height:24px}.el-switch--large .el-switch__label *{font-size:14px}.el-switch--large .el-switch__core{border-radius:12px;height:24px;min-width:50px}.el-switch--large .el-switch__core .el-switch__inner{height:20px;padding:0 6px 0 22px}.el-switch--large .el-switch__core .el-switch__action{height:20px;width:20px}.el-switch--large.is-checked .el-switch__core .el-switch__action{left:calc(100% - 21px)}.el-switch--large.is-checked .el-switch__core .el-switch__inner{padding:0 22px 0 6px}.el-switch--small{font-size:12px;height:24px;line-height:16px}.el-switch--small .el-switch__label{font-size:12px;height:16px}.el-switch--small .el-switch__label *{font-size:12px}.el-switch--small .el-switch__core{border-radius:8px;height:16px;min-width:30px}.el-switch--small .el-switch__core .el-switch__inner{height:12px;padding:0 2px 0 14px}.el-switch--small .el-switch__core .el-switch__action{height:12px;width:12px}.el-switch--small.is-checked .el-switch__core .el-switch__action{left:calc(100% - 13px)}.el-switch--small.is-checked .el-switch__core .el-switch__inner{padding:0 14px 0 2px}.el-select-dropdown{border-radius:var(--el-border-radius-base);box-sizing:border-box;z-index:calc(var(--el-index-top) + 1)}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty,.el-select-dropdown__loading{color:var(--el-text-color-secondary);font-size:var(--el-select-font-size);margin:0;padding:10px 0;text-align:center}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{box-sizing:border-box;list-style:none;margin:0;padding:6px 0}.el-select-dropdown__list.el-vl__window{margin:6px 0;padding:0}.el-select-dropdown__header{border-bottom:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__footer{border-top:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__item{box-sizing:border-box;color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-base);height:34px;line-height:34px;overflow:hidden;padding:0 32px 0 20px;position:relative;text-overflow:ellipsis;white-space:nowrap}.el-select-dropdown__item.is-hovering{background-color:var(--el-fill-color-light)}.el-select-dropdown__item.is-selected{color:var(--el-color-primary);font-weight:700}.el-select-dropdown__item.is-disabled{background-color:unset;color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after{background-color:var(--el-color-primary);background-position:50%;background-repeat:no-repeat;border-right:none;border-top:none;content:"";height:12px;mask:url("data:image/svg+xml;utf8,%3Csvg class=%27icon%27 width=%27200%27 height=%27200%27 viewBox=%270 0 1024 1024%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath fill=%27currentColor%27 d=%27M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z%27%3E%3C/path%3E%3C/svg%3E") no-repeat;mask-size:100% 100%;-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class=%27icon%27 width=%27200%27 height=%27200%27 viewBox=%270 0 1024 1024%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath fill=%27currentColor%27 d=%27M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z%27%3E%3C/path%3E%3C/svg%3E") no-repeat;-webkit-mask-size:100% 100%;position:absolute;right:20px;top:50%;transform:translateY(-50%);width:12px}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-disabled:after{background-color:var(--el-text-color-placeholder)}.el-select-group{margin:0;padding:0}.el-select-group__wrap{list-style:none;margin:0;padding:0;position:relative}.el-select-group__title{box-sizing:border-box;color:var(--el-color-info);font-size:12px;line-height:34px;overflow:hidden;padding:0 20px;text-overflow:ellipsis;white-space:nowrap}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-color:var(--el-disabled-text-color);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px;--el-select-width:100%;display:inline-block;position:relative;vertical-align:middle;width:var(--el-select-width)}.el-select__wrapper{align-items:center;background-color:var(--el-fill-color-blank);border-radius:var(--el-border-radius-base);box-shadow:0 0 0 1px var(--el-border-color) inset;box-sizing:border-box;cursor:pointer;display:flex;font-size:14px;gap:6px;line-height:24px;min-height:32px;padding:4px 12px;position:relative;text-align:left;transform:translateZ(0);transition:var(--el-transition-duration)}.el-select__wrapper.is-filterable{cursor:text}.el-select__wrapper.is-focused{box-shadow:0 0 0 1px var(--el-color-primary) inset}.el-select__wrapper.is-hovering:not(.is-focused){box-shadow:0 0 0 1px var(--el-border-color-hover) inset}.el-select__wrapper.is-disabled{background-color:var(--el-fill-color-light);color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select__wrapper.is-disabled,.el-select__wrapper.is-disabled:hover{box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select__wrapper.is-disabled.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-select__wrapper.is-disabled .el-select__selected-item{color:var(--el-select-disabled-color)}.el-select__wrapper.is-disabled .el-select__caret,.el-select__wrapper.is-disabled .el-tag,.el-select__wrapper.is-disabled input{cursor:not-allowed}.el-select__wrapper.is-disabled .el-select__prefix,.el-select__wrapper.is-disabled .el-select__suffix{pointer-events:none}.el-select__prefix,.el-select__suffix{align-items:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));display:flex;flex-shrink:0;gap:6px}.el-select__caret{color:var(--el-select-input-color);cursor:pointer;font-size:var(--el-select-input-font-size);transform:rotate(0deg);transition:var(--el-transition-duration)}.el-select__caret.is-reverse{transform:rotate(180deg)}.el-select__clear{cursor:pointer}.el-select__clear:hover{color:var(--el-select-close-hover-color)}.el-select__selection{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:6px;min-width:0;position:relative}.el-select__selection.is-near{margin-left:-8px}.el-select__selection .el-tag{border-color:transparent;cursor:pointer}.el-select__selection .el-tag.el-tag--plain{border-color:var(--el-tag-border-color)}.el-select__selection .el-tag .el-tag__content{min-width:0}.el-select__selected-item{display:flex;flex-wrap:wrap;-webkit-user-select:none;user-select:none}.el-select__tags-text{line-height:normal}.el-select__placeholder,.el-select__tags-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-select__placeholder{color:var(--el-input-text-color,var(--el-text-color-regular));position:absolute;top:50%;transform:translateY(-50%);width:100%;z-index:-1}.el-select__placeholder.is-transparent{color:var(--el-text-color-placeholder);-webkit-user-select:none;user-select:none}.el-select__popper.el-popper{background:var(--el-bg-color-overlay);box-shadow:var(--el-box-shadow-light)}.el-select__popper.el-popper,.el-select__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-left-color:transparent;border-top-color:transparent}.el-select__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-select__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:transparent;border-left-color:transparent}.el-select__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-select__input-wrapper{flex:1}.el-select__input-wrapper.is-hidden{opacity:0;position:absolute;z-index:-1}.el-select__input{appearance:none;background-color:transparent;border:none;color:var(--el-select-multiple-input-color);font-family:inherit;font-size:inherit;height:24px;outline:none;padding:0;width:100%}.el-select__input-calculator{left:0;max-width:100%;overflow:hidden;position:absolute;top:0;visibility:hidden;white-space:pre}.el-select--large .el-select__wrapper{font-size:14px;gap:6px;line-height:24px;min-height:40px;padding:8px 16px}.el-select--large .el-select__selection{gap:6px}.el-select--large .el-select__selection.is-near{margin-left:-8px}.el-select--large .el-select__prefix,.el-select--large .el-select__suffix{gap:6px}.el-select--large .el-select__input{height:24px}.el-select--small .el-select__wrapper{font-size:12px;gap:4px;line-height:20px;min-height:24px;padding:2px 8px}.el-select--small .el-select__selection{gap:4px}.el-select--small .el-select__selection.is-near{margin-left:-6px}.el-select--small .el-select__prefix,.el-select--small .el-select__suffix{gap:4px}.el-select--small .el-select__input{height:20px}.el-checkbox{--el-checkbox-font-size:14px;--el-checkbox-font-weight:var(--el-font-weight-primary);--el-checkbox-text-color:var(--el-text-color-regular);--el-checkbox-input-height:14px;--el-checkbox-input-width:14px;--el-checkbox-border-radius:var(--el-border-radius-small);--el-checkbox-bg-color:var(--el-fill-color-blank);--el-checkbox-input-border:var(--el-border);--el-checkbox-disabled-border-color:var(--el-border-color);--el-checkbox-disabled-input-fill:var(--el-fill-color-light);--el-checkbox-disabled-icon-color:var(--el-text-color-placeholder);--el-checkbox-disabled-checked-input-fill:var(--el-border-color-extra-light);--el-checkbox-disabled-checked-input-border-color:var(--el-border-color);--el-checkbox-disabled-checked-icon-color:var(--el-text-color-placeholder);--el-checkbox-checked-text-color:var(--el-color-primary);--el-checkbox-checked-input-border-color:var(--el-color-primary);--el-checkbox-checked-bg-color:var(--el-color-primary);--el-checkbox-checked-icon-color:var(--el-color-white);--el-checkbox-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-checkbox-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-checkbox-font-weight);height:var(--el-checkbox-height,32px);margin-right:30px;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-checkbox.is-disabled{cursor:not-allowed}.el-checkbox.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-checkbox.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-checkbox.is-bordered.is-disabled{border-color:var(--el-border-color-lighter)}.el-checkbox.is-bordered.el-checkbox--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__label{font-size:var(--el-font-size-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:0 11px 0 7px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox input:focus-visible+.el-checkbox__inner{border-radius:var(--el-checkbox-border-radius);outline:2px solid var(--el-checkbox-input-border-color-hover);outline-offset:1px}.el-checkbox__input{cursor:pointer;display:inline-flex;outline:none;position:relative;white-space:nowrap}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:var(--el-checkbox-disabled-input-fill);border-color:var(--el-checkbox-disabled-border-color);cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-icon-color);cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-disabled-checked-icon-color);border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:var(--el-disabled-text-color);cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-checked-icon-color);transform:translate(-45%,-60%) rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--el-checkbox-checked-text-color)}.el-checkbox__input.is-focus:not(.is-checked) .el-checkbox__original:not(:focus-visible){border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-checked-icon-color);content:"";display:block;height:2px;left:0;position:absolute;right:0;top:5px;transform:scale(.5)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{background-color:var(--el-checkbox-bg-color);border:var(--el-checkbox-input-border);border-radius:var(--el-checkbox-border-radius);box-sizing:border-box;display:inline-block;height:var(--el-checkbox-input-height);position:relative;transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46),outline .25s cubic-bezier(.71,-.46,.29,1.46);width:var(--el-checkbox-input-width);z-index:var(--el-index-normal)}.el-checkbox__inner:hover{border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__inner:after{border:1px solid transparent;border-left:0;border-top:0;box-sizing:content-box;content:"";height:7px;left:50%;position:absolute;top:50%;transform:translate(-45%,-60%) rotate(45deg) scaleY(0);transform-origin:center;transition:transform .15s ease-in .05s;width:3px}.el-checkbox__original{height:0;margin:0;opacity:0;outline:none;position:absolute;width:0;z-index:-1}.el-checkbox__label{display:inline-block;font-size:var(--el-checkbox-font-size);line-height:1;padding-left:8px}.el-checkbox.el-checkbox--large{height:40px}.el-checkbox.el-checkbox--large .el-checkbox__label{font-size:14px}.el-checkbox.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.el-checkbox--small{height:24px}.el-checkbox.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.el-checkbox--small .el-checkbox__input.is-indeterminate .el-checkbox__inner:before{top:4px}.el-checkbox.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox:last-of-type{margin-right:0} \ No newline at end of file diff --git a/frontend-dist/css/740.a94dbb46.css.gz b/frontend-dist/css/740.a94dbb46.css.gz deleted file mode 100644 index 257345c088743fc03b9451207f70c043ba499602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5880 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 O-u@fllJc6Yng9Tf1ywKr diff --git a/frontend-dist/css/770.37d2e9e0.css b/frontend-dist/css/770.37d2e9e0.css deleted file mode 100644 index 4864747d..00000000 --- a/frontend-dist/css/770.37d2e9e0.css +++ /dev/null @@ -1 +0,0 @@ -.move-dialog-content[data-v-7aaa437c]{padding:0 10px}.move-path-input-container[data-v-7aaa437c]{display:flex;align-items:center;gap:10px}.move-path-input[data-v-7aaa437c]{flex:1}.directory-picker-trigger[data-v-7aaa437c]{flex-shrink:0}.move-dialog-hint[data-v-7aaa437c]{margin-top:12px;font-size:12px;color:var(--el-text-color-secondary)}.move-drawer-content[data-v-7aaa437c]{padding:16px}.move-path-section[data-v-7aaa437c]{margin-bottom:16px}.move-path-label[data-v-7aaa437c]{font-size:14px;font-weight:500;margin-bottom:8px;color:var(--el-text-color-primary)}.move-path-input-row[data-v-7aaa437c]{display:flex;align-items:center;gap:10px}.embedded-tree-section[data-v-7aaa437c]{margin-top:16px;border:1px solid var(--el-border-color-lighter);border-radius:8px;overflow:hidden}.tree-section-header[data-v-7aaa437c]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:var(--el-fill-color-light);border-bottom:1px solid var(--el-border-color-lighter)}.tree-section-title[data-v-7aaa437c]{font-size:14px;font-weight:500}.tree-container[data-v-7aaa437c]{min-height:200px;max-height:300px;overflow-y:auto;padding:8px}.directory-tree[data-v-7aaa437c]{background:transparent}.directory-tree[data-v-7aaa437c] .el-tree-node__content{height:44px;padding:0 8px;border-radius:8px}.tree-node[data-v-7aaa437c]{display:flex;align-items:center;gap:8px;padding:4px 0;width:100%}.tree-node.is-current[data-v-7aaa437c]{color:var(--el-color-primary);font-weight:500}.folder-icon[data-v-7aaa437c]{color:var(--el-color-warning);font-size:16px}.node-label[data-v-7aaa437c]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.error-state[data-v-7aaa437c]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px 20px;text-align:center}.error-icon[data-v-7aaa437c]{font-size:32px;color:var(--el-color-danger)}.error-text[data-v-7aaa437c]{color:var(--el-text-color-secondary);font-size:14px}.drawer-footer[data-v-7aaa437c]{display:flex;gap:12px;padding:0 16px 16px}.footer-btn[data-v-7aaa437c]{flex:1}.move-dialog .el-dialog__body{padding:20px}.move-drawer{border-radius:16px 16px 0 0!important}.move-drawer .el-drawer__header{margin-bottom:0;padding:16px 20px;border-bottom:1px solid var(--el-border-color-lighter)}.move-drawer .el-drawer__body,.move-drawer .el-drawer__footer{padding:0}.mobile-drawer-overlay[data-v-768efd1f]{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.4);z-index:2000;backdrop-filter:blur(4px)}.mobile-drawer[data-v-768efd1f]{position:absolute;top:22vh;left:8px;bottom:8px;width:280px;max-width:calc(85vw - 16px);background:var(--el-bg-color);border-radius:16px;box-shadow:0 8px 32px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1);display:flex;flex-direction:column;overflow:hidden}html.dark .mobile-drawer[data-v-768efd1f]{background:rgba(40,40,45,.98);box-shadow:0 8px 32px rgba(0,0,0,.4),0 2px 8px rgba(0,0,0,.3)}.mobile-drawer-header[data-v-768efd1f]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background:linear-gradient(135deg,rgba(56,189,248,.12),rgba(14,165,233,.08));border-bottom:1px solid var(--el-border-color-lighter)}.mobile-drawer-title[data-v-768efd1f]{font-size:15px;font-weight:600;color:#38bdf8;display:flex;align-items:center;gap:8px}.mobile-drawer-title[data-v-768efd1f]:before{content:"";display:inline-block;width:4px;height:16px;background:linear-gradient(180deg,#38bdf8,rgba(14,165,233,.5));border-radius:2px}.mobile-drawer-close[data-v-768efd1f]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;font-size:16px;color:var(--el-text-color-secondary);cursor:pointer;border-radius:8px;transition:all .2s ease;background:transparent}.mobile-drawer-close[data-v-768efd1f]:active{background:var(--el-fill-color);color:var(--el-text-color-primary)}.mobile-drawer-content[data-v-768efd1f]{flex:1;overflow-y:auto;padding:8px}.mobile-drawer-item[data-v-768efd1f]{display:flex;align-items:center;gap:12px;padding:14px 16px;margin:2px 0;cursor:pointer;transition:all .2s ease;color:var(--el-text-color-primary);border-radius:10px;font-size:14px}.mobile-drawer-item[data-v-768efd1f]:active{background:var(--el-fill-color-light);transform:scale(.98)}.mobile-drawer-item.active[data-v-768efd1f]{background:linear-gradient(135deg,rgba(56,189,248,.2),rgba(14,165,233,.12));color:#38bdf8;font-weight:600}.mobile-drawer-item-icon[data-v-768efd1f]{font-size:18px;width:24px;text-align:center;opacity:.7}.mobile-drawer-item.active .mobile-drawer-item-icon[data-v-768efd1f]{opacity:1;color:#38bdf8}.mobile-drawer-back[data-v-768efd1f]{display:flex;align-items:center;gap:12px;padding:14px 16px;margin:8px 8px;border-radius:10px;background:var(--el-fill-color-lighter);cursor:pointer;transition:all .2s ease;color:var(--el-text-color-secondary);font-size:14px}.mobile-drawer-back[data-v-768efd1f]:active{background:var(--el-fill-color);color:var(--el-text-color-primary);transform:scale(.98)}.drawer-slide-enter-active[data-v-768efd1f]{transition:opacity .3s ease}.drawer-slide-leave-active[data-v-768efd1f]{transition:opacity .2s ease}.drawer-slide-enter-active .mobile-drawer[data-v-768efd1f]{animation:slideInLeft-768efd1f .3s ease-out}.drawer-slide-leave-active .mobile-drawer[data-v-768efd1f]{animation:slideOutLeft-768efd1f .2s ease-in}.drawer-slide-enter-from[data-v-768efd1f],.drawer-slide-leave-to[data-v-768efd1f]{opacity:0}@keyframes slideInLeft-768efd1f{0%{transform:translateX(-100%)}to{transform:translateX(0)}}@keyframes slideOutLeft-768efd1f{0%{transform:translateX(0)}to{transform:translateX(-100%)}}.bottom-sheet-overlay[data-v-62bb601c]{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:9999;display:flex;align-items:flex-end;justify-content:center}.bottom-sheet[data-v-62bb601c]{width:100%;max-width:100%;background:var(--bottom-sheet-bg,hsla(0,0%,100%,.95));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-radius:20px 20px 0 0;max-height:70vh;overflow:hidden;box-shadow:0 -4px 30px rgba(0,0,0,.15);border-top:1px solid var(--bottom-sheet-border,rgba(0,0,0,.05))}html.dark .bottom-sheet[data-v-62bb601c]{--bottom-sheet-bg:rgba(40,44,52,.95);--bottom-sheet-border:hsla(0,0%,100%,.1);box-shadow:0 -4px 30px rgba(0,0,0,.4)}.bottom-sheet-header[data-v-62bb601c]{display:flex;flex-direction:column;align-items:center;gap:12px;padding:16px 20px 12px;border-bottom:1px solid var(--el-border-color-lighter)}.bottom-sheet-handle[data-v-62bb601c]{width:40px;height:4px;background:var(--el-border-color);border-radius:2px}.bottom-sheet-title[data-v-62bb601c]{font-size:16px;font-weight:600;color:var(--el-text-color-primary);text-align:center;max-width:80%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}html.dark .bottom-sheet-title[data-v-62bb601c]{color:#f0f0f0}.bottom-sheet-content[data-v-62bb601c]{padding:12px 16px;padding-bottom:calc(20px + env(safe-area-inset-bottom));display:flex;flex-direction:column;gap:8px}.bottom-sheet-item[data-v-62bb601c]{display:flex;align-items:center;gap:16px;padding:16px 20px;border-radius:14px;cursor:pointer;transition:all .2s ease;background:var(--bottom-sheet-item-bg,rgba(0,0,0,.04));color:var(--el-text-color-primary)}html.dark .bottom-sheet-item[data-v-62bb601c]{--bottom-sheet-item-bg:hsla(0,0%,100%,.08)}.bottom-sheet-item[data-v-62bb601c]:active{transform:scale(.98);background:var(--bottom-sheet-item-active-bg,rgba(0,0,0,.08))}html.dark .bottom-sheet-item[data-v-62bb601c]:active{--bottom-sheet-item-active-bg:hsla(0,0%,100%,.15)}.bottom-sheet-icon[data-v-62bb601c]{font-size:20px;width:28px;text-align:center;color:#38bdf8}.bottom-sheet-danger .bottom-sheet-icon[data-v-62bb601c],.bottom-sheet-danger[data-v-62bb601c]{color:var(--el-color-danger)}.bottom-sheet-enter-active[data-v-62bb601c]{transition:all .3s ease-out}.bottom-sheet-leave-active[data-v-62bb601c]{transition:all .2s ease-in}.bottom-sheet-enter-active .bottom-sheet[data-v-62bb601c]{animation:slideUp-62bb601c .3s ease-out}.bottom-sheet-leave-active .bottom-sheet[data-v-62bb601c]{animation:slideDown-62bb601c .2s ease-in}.bottom-sheet-enter-from[data-v-62bb601c],.bottom-sheet-leave-to[data-v-62bb601c]{opacity:0}.bottom-sheet-enter-from .bottom-sheet[data-v-62bb601c],.bottom-sheet-leave-to .bottom-sheet[data-v-62bb601c]{transform:translateY(100%)}@keyframes slideUp-62bb601c{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes slideDown-62bb601c{0%{transform:translateY(0)}to{transform:translateY(100%)}}.el-tabs{--el-tabs-header-height:40px;display:flex}.el-tabs__header{align-items:center;display:flex;justify-content:space-between;margin:0 0 15px;padding:0;position:relative}.el-tabs__header-vertical{flex-direction:column}.el-tabs__active-bar{background-color:var(--el-color-primary);bottom:0;height:2px;left:0;list-style:none;position:absolute;transition:width var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),transform var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);z-index:1}.el-tabs__active-bar.is-bottom{bottom:auto}.el-tabs__new-tab{align-items:center;border:1px solid var(--el-border-color);border-radius:3px;color:var(--el-text-color-primary);cursor:pointer;display:flex;flex-shrink:0;font-size:12px;height:20px;justify-content:center;line-height:20px;margin:10px 0 10px 10px;text-align:center;transition:all .15s;width:20px}.el-tabs__new-tab .is-icon-plus{height:inherit;transform:scale(.8);width:inherit}.el-tabs__new-tab .is-icon-plus svg{vertical-align:middle}.el-tabs__new-tab:hover{color:var(--el-color-primary)}.el-tabs__new-tab-vertical{margin-left:0}.el-tabs__nav-wrap{flex:1 auto;margin-bottom:-1px;overflow:hidden;position:relative}.el-tabs__nav-wrap:after{background-color:var(--el-border-color-light);bottom:0;content:"";height:2px;left:0;position:absolute;width:100%;z-index:var(--el-index-normal)}.el-tabs__nav-wrap.is-bottom:after{bottom:auto;top:0}.el-tabs__nav-wrap.is-scrollable{box-sizing:border-box;padding:0 20px}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{color:var(--el-text-color-secondary);cursor:pointer;font-size:12px;line-height:44px;position:absolute;text-align:center;width:20px}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{display:flex;float:left;position:relative;transition:transform var(--el-transition-duration);white-space:nowrap;z-index:calc(var(--el-index-normal) + 1)}.el-tabs__nav.is-stretch{display:flex;min-width:100%}.el-tabs__nav.is-stretch>*{flex:1;text-align:center}.el-tabs__item{align-items:center;box-sizing:border-box;color:var(--el-text-color-primary);display:flex;font-size:var(--el-font-size-base);font-weight:500;height:var(--el-tabs-header-height);justify-content:center;list-style:none;padding:0 20px;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:none}.el-tabs__item:focus-visible{border-radius:3px;box-shadow:0 0 2px 2px var(--el-color-primary) inset}.el-tabs__item .is-icon-close{border-radius:50%;margin-left:5px;text-align:center;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs__item .is-icon-close:before{display:inline-block;transform:scale(.9)}.el-tabs__item .is-icon-close:hover{background-color:var(--el-text-color-placeholder);color:#fff}.el-tabs__item.is-active,.el-tabs__item:hover{color:var(--el-color-primary)}.el-tabs__item:hover{cursor:pointer}.el-tabs__item.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-tabs__content{flex-grow:1;overflow:hidden;position:relative}.el-tabs--bottom>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:0}.el-tabs--bottom>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top>.el-tabs__header .el-tabs__item:last-child{padding-right:0}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--card>.el-tabs__header{border-bottom:1px solid var(--el-border-color-light);box-sizing:border-box;height:var(--el-tabs-header-height)}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid var(--el-border-color-light);border-bottom:none;border-radius:4px 4px 0 0;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .is-icon-close{font-size:12px;height:14px;overflow:hidden;position:relative;right:-2px;transform-origin:100% 50%;width:0}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid var(--el-border-color-light);margin-top:-1px;transition:color var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),padding var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .is-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:var(--el-bg-color)}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .is-icon-close{width:14px}.el-tabs--border-card{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:var(--el-fill-color-light);border-bottom:1px solid var(--el-border-color-light);margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{border:1px solid transparent;color:var(--el-text-color-secondary);margin-top:-1px;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{background-color:var(--el-bg-color-overlay);border-left-color:var(--el-border-color);border-right-color:var(--el-border-color);color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:var(--el-disabled-text-color)}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom{flex-direction:column}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid var(--el-border-color)}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-bottom:0;margin-top:-1px}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{bottom:auto;height:auto;top:0;width:2px}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{cursor:pointer;height:30px;line-height:30px;text-align:center;width:100%}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{bottom:0;right:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{bottom:auto;height:100%;top:0;width:2px}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{flex-direction:column}.el-tabs--left .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-left{justify-content:flex-end}.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-right{justify-content:flex-start}.el-tabs--left{flex-direction:row}.el-tabs--left .el-tabs__header.is-left{margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left:after{left:auto;right:0}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left{display:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-bottom:none;border-left:none;border-right:1px solid var(--el-border-color-light);border-top:1px solid var(--el-border-color-light);text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid var(--el-border-color-light);border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left:none;border-right:1px solid #fff}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-radius:4px 0 0 4px;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid var(--el-border-color)}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--left>.el-tabs__content+.el-tabs__header{order:-1}.el-tabs--right .el-tabs__header.is-right{margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid var(--el-border-color-light)}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid var(--el-border-color-light);border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left:1px solid #fff;border-right:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-left:none;border-radius:0 4px 4px 0}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid var(--el-border-color)}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.el-tabs--top{flex-direction:column}.el-tabs--top>.el-tabs__content+.el-tabs__header{order:-1}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{animation:slideInRight-enter var(--el-transition-duration)}.slideInRight-leave{animation:slideInRight-leave var(--el-transition-duration);left:0;position:absolute;right:0}.slideInLeft-enter{animation:slideInLeft-enter var(--el-transition-duration)}.slideInLeft-leave{animation:slideInLeft-leave var(--el-transition-duration);left:0;position:absolute;right:0}@keyframes slideInRight-enter{0%{opacity:0;transform:translateX(100%);transform-origin:0 0}to{opacity:1;transform:translateX(0);transform-origin:0 0}}@keyframes slideInRight-leave{0%{opacity:1;transform:translateX(0);transform-origin:0 0}to{opacity:0;transform:translateX(100%);transform-origin:0 0}}@keyframes slideInLeft-enter{0%{opacity:0;transform:translateX(-100%);transform-origin:0 0}to{opacity:1;transform:translateX(0);transform-origin:0 0}}@keyframes slideInLeft-leave{0%{opacity:1;transform:translateX(0);transform-origin:0 0}to{opacity:0;transform:translateX(-100%);transform-origin:0 0}}.el-alert{--el-alert-padding:8px 16px;--el-alert-border-radius-base:var(--el-border-radius-base);--el-alert-title-font-size:14px;--el-alert-title-with-description-font-size:16px;--el-alert-description-font-size:14px;--el-alert-close-font-size:16px;--el-alert-close-customed-font-size:14px;--el-alert-icon-size:16px;--el-alert-icon-large-size:28px;align-items:center;background-color:var(--el-color-white);border-radius:var(--el-alert-border-radius-base);box-sizing:border-box;display:flex;margin:0;opacity:1;overflow:hidden;padding:var(--el-alert-padding);position:relative;transition:opacity var(--el-transition-duration-fast);width:100%}.el-alert.is-light .el-alert__close-btn{color:var(--el-text-color-placeholder)}.el-alert.is-dark .el-alert__close-btn,.el-alert.is-dark .el-alert__description{color:var(--el-color-white)}.el-alert.is-center{justify-content:center}.el-alert--primary{--el-alert-bg-color:var(--el-color-primary-light-9)}.el-alert--primary.is-light{background-color:var(--el-alert-bg-color)}.el-alert--primary.is-light,.el-alert--primary.is-light .el-alert__description{color:var(--el-color-primary)}.el-alert--primary.is-dark{background-color:var(--el-color-primary);color:var(--el-color-white)}.el-alert--success{--el-alert-bg-color:var(--el-color-success-light-9)}.el-alert--success.is-light{background-color:var(--el-alert-bg-color)}.el-alert--success.is-light,.el-alert--success.is-light .el-alert__description{color:var(--el-color-success)}.el-alert--success.is-dark{background-color:var(--el-color-success);color:var(--el-color-white)}.el-alert--info{--el-alert-bg-color:var(--el-color-info-light-9)}.el-alert--info.is-light{background-color:var(--el-alert-bg-color)}.el-alert--info.is-light,.el-alert--info.is-light .el-alert__description{color:var(--el-color-info)}.el-alert--info.is-dark{background-color:var(--el-color-info);color:var(--el-color-white)}.el-alert--warning{--el-alert-bg-color:var(--el-color-warning-light-9)}.el-alert--warning.is-light{background-color:var(--el-alert-bg-color)}.el-alert--warning.is-light,.el-alert--warning.is-light .el-alert__description{color:var(--el-color-warning)}.el-alert--warning.is-dark{background-color:var(--el-color-warning);color:var(--el-color-white)}.el-alert--error{--el-alert-bg-color:var(--el-color-error-light-9)}.el-alert--error.is-light{background-color:var(--el-alert-bg-color)}.el-alert--error.is-light,.el-alert--error.is-light .el-alert__description{color:var(--el-color-error)}.el-alert--error.is-dark{background-color:var(--el-color-error);color:var(--el-color-white)}.el-alert__content{display:flex;flex-direction:column;gap:4px}.el-alert .el-alert__icon{font-size:var(--el-alert-icon-size);margin-right:8px;width:var(--el-alert-icon-size)}.el-alert .el-alert__icon.is-big{font-size:var(--el-alert-icon-large-size);margin-right:12px;width:var(--el-alert-icon-large-size)}.el-alert__title{font-size:var(--el-alert-title-font-size);line-height:24px}.el-alert__title.with-description{font-size:var(--el-alert-title-with-description-font-size)}.el-alert .el-alert__description{font-size:var(--el-alert-description-font-size);margin:0}.el-alert .el-alert__close-btn{cursor:pointer;font-size:var(--el-alert-close-font-size);opacity:1;position:absolute;right:16px;top:12px}.el-alert .el-alert__close-btn.is-customed{font-size:var(--el-alert-close-customed-font-size);font-style:normal;line-height:24px;top:8px}.el-alert-fade-enter-from,.el-alert-fade-leave-active{opacity:0}.batch-tag-container[data-v-ec3adcfc]{padding:0}.tab-content[data-v-ec3adcfc]{padding:20px}.tab-description[data-v-ec3adcfc]{margin:0 0 15px 0;color:#606266;font-size:14px}.input-section[data-v-ec3adcfc]{position:relative;margin-bottom:20px}.suggestions-panel[data-v-ec3adcfc]{position:absolute;top:100%;left:0;right:0;background:var(--admin-dashboard-tag-suggestion-bg-color);border:1px solid var(--admin-dashboard-tag-suggestion-border-color);border-radius:4px;box-shadow:var(--admin-dashboard-tag-suggestion-box-shadow);max-height:200px;overflow-y:auto;z-index:1000;margin-top:4px}.suggestion-item[data-v-ec3adcfc]{padding:8px 12px;cursor:pointer;transition:background-color .2s}.suggestion-item[data-v-ec3adcfc]:hover{background-color:var(--admin-dashboard-tag-suggestion-item-hover-bg-color)}.common-tags-section[data-v-ec3adcfc],.tags-to-add-section[data-v-ec3adcfc]{margin-bottom:20px}.common-tags-section h4[data-v-ec3adcfc],.tags-to-add-section h4[data-v-ec3adcfc]{margin:0 0 10px 0;font-size:14px;color:#606266}.tags-container[data-v-ec3adcfc]{display:flex;flex-wrap:wrap;gap:8px;min-height:40px}.tag-item[data-v-ec3adcfc]{cursor:default}.empty-message[data-v-ec3adcfc]{color:#909399;font-size:13px;padding:10px 0}.action-buttons[data-v-ec3adcfc]{margin-top:20px;display:flex;justify-content:flex-end}.tag-management-container[data-v-689f94e2]{padding:10px 0}.input-section[data-v-689f94e2]{position:relative;margin-bottom:20px}.suggestions-panel[data-v-689f94e2]{position:absolute;top:100%;left:0;right:0;background:var(--admin-dashboard-tag-suggestion-bg-color);border:1px solid var(--admin-dashboard-tag-suggestion-border-color);border-radius:4px;box-shadow:var(--admin-dashboard-tag-suggestion-box-shadow);max-height:200px;overflow-y:auto;z-index:1000;margin-top:4px}.suggestion-item[data-v-689f94e2]{padding:8px 12px;cursor:pointer;transition:background-color .2s}.suggestion-item[data-v-689f94e2]:hover{background-color:var(--admin-dashboard-tag-suggestion-item-hover-bg-color)}.current-tags-section[data-v-689f94e2],.popular-tags-section[data-v-689f94e2]{margin-bottom:20px}.current-tags-section h4[data-v-689f94e2],.popular-tags-section h4[data-v-689f94e2]{margin:0 0 10px 0;font-size:14px;color:#606266}.tags-container[data-v-689f94e2]{display:flex;flex-wrap:wrap;gap:8px;min-height:40px}.tag-item[data-v-689f94e2]{cursor:default}.tag-item.clickable[data-v-689f94e2]{cursor:pointer;transition:transform .2s}.tag-item.clickable[data-v-689f94e2]:hover{transform:translateY(-2px)}.empty-message[data-v-689f94e2]{color:#909399;font-size:13px;padding:10px 0}.dialog-footer[data-v-689f94e2]{display:flex;justify-content:flex-end}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{justify-content:flex-start;text-align:left}.el-form-item--label-right .el-form-item__label{justify-content:flex-end;text-align:right}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;padding-right:0;text-align:left;width:fit-content}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-select__wrapper,.el-form-item.is-error .el-form-item__content .el-select__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-textarea__inner,.el-form-item.is-error .el-form-item__content .el-textarea__inner.is-focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-form-item__content .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon{display:inline-flex}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;color:var(--el-text-color-primary);font-size:var(--el-font-size-base)}.el-descriptions__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;font-size:14px;line-height:23px;text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{background:var(--el-descriptions-item-bordered-label-background);color:var(--el-text-color-regular);font-weight:700}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}.el-image__error,.el-image__inner,.el-image__placeholder,.el-image__wrapper{height:100%;width:100%}.el-image{display:inline-block;overflow:hidden;position:relative}.el-image__inner{opacity:1;vertical-align:top}.el-image__inner.is-loading{opacity:0}.el-image__wrapper{left:0;position:absolute;top:0}.el-image__error,.el-image__placeholder{background:var(--el-fill-color-light)}.el-image__error{align-items:center;color:var(--el-text-color-placeholder);display:flex;font-size:14px;justify-content:center;vertical-align:middle}.el-image__preview{cursor:pointer}.el-image-viewer__wrapper{bottom:0;left:0;position:fixed;right:0;top:0}.el-image-viewer__wrapper:focus{outline:none!important}.el-image-viewer__btn{align-items:center;border-radius:50%;box-sizing:border-box;cursor:pointer;display:flex;justify-content:center;opacity:.8;position:absolute;-webkit-user-select:none;user-select:none;z-index:1}.el-image-viewer__btn .el-icon{cursor:pointer}.el-image-viewer__close{font-size:40px;height:40px;right:40px;top:40px;width:40px}.el-image-viewer__canvas{align-items:center;display:flex;height:100%;justify-content:center;position:static;-webkit-user-select:none;user-select:none;width:100%}.el-image-viewer__actions{background-color:var(--el-text-color-regular);border-color:#fff;border-radius:22px;bottom:30px;height:44px;left:50%;padding:0 23px;transform:translateX(-50%)}.el-image-viewer__actions__inner{align-items:center;color:#fff;cursor:default;display:flex;font-size:23px;gap:22px;height:100%;justify-content:space-around;padding:0 6px;width:100%}.el-image-viewer__actions__divider{margin:0 -6px}.el-image-viewer__progress{bottom:90px;color:#fff;cursor:default;left:50%;transform:translateX(-50%)}.el-image-viewer__prev{left:40px}.el-image-viewer__next,.el-image-viewer__prev{background-color:var(--el-text-color-regular);border-color:#fff;color:#fff;font-size:24px;height:44px;top:50%;transform:translateY(-50%);width:44px}.el-image-viewer__next{right:40px;text-indent:2px}.el-image-viewer__close{background-color:var(--el-text-color-regular);border-color:#fff;color:#fff;font-size:24px;height:44px;width:44px}.el-image-viewer__mask{background:#000;height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%}.el-image-viewer-parent--hidden{overflow:hidden}.viewer-fade-enter-active{animation:viewer-fade-in var(--el-transition-duration)}.viewer-fade-leave-active{animation:viewer-fade-out var(--el-transition-duration)}@keyframes viewer-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes viewer-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}.detail-actions[data-v-3f80812c]{display:flex;justify-content:right;margin-bottom:10px;flex-wrap:wrap;gap:8px}.detail-action[data-v-3f80812c]{margin-left:0!important}.video-preview[data-v-3f80812c]{max-height:300px;cursor:pointer;-o-object-fit:contain;object-fit:contain}.audio-preview[data-v-3f80812c],.video-preview[data-v-3f80812c]{width:100%;max-width:400px;border-radius:8px}.image-preview[data-v-3f80812c]{width:auto;height:auto;max-width:100%;max-height:300px;border-radius:8px;cursor:pointer}.image-preview[data-v-3f80812c] img{max-width:100%;max-height:300px;-o-object-fit:contain;object-fit:contain}.file-icon-detail[data-v-3f80812c]{font-size:64px;color:var(--el-text-color-secondary)}.preview-section[data-v-3f80812c]{display:flex;justify-content:center;margin-bottom:15px;padding:12px;background:var(--el-fill-color-light);border-radius:8px;min-height:60px}.preview-content[data-v-3f80812c]{display:flex;justify-content:center;align-items:center;width:100%}[data-v-3f80812c] .el-descriptions__content{word-break:break-all;word-wrap:break-word}[data-v-3f80812c] .el-descriptions__content .el-tag,[data-v-3f80812c] .el-descriptions__content .el-tag+span{vertical-align:middle}[data-v-3f80812c] .el-descriptions__label{width:120px!important;min-width:100px!important;max-width:120px!important}[data-v-3f80812c] .el-descriptions__body table{table-layout:fixed}@media (max-width:768px){.detail-actions[data-v-3f80812c]{justify-content:center}}.batch-floating-bar[data-v-7445695a]{position:fixed;left:50%;bottom:max(84px,calc(72px + env(safe-area-inset-bottom)));transform:translateX(-50%);z-index:1200;display:flex;align-items:center;gap:7px;max-width:min(720px,calc(100vw - 48px));padding:8px;border:1px solid var(--admin-batch-toolbar-border);border-radius:999px;background:var(--admin-batch-toolbar-bg);box-shadow:var(--admin-batch-toolbar-shadow);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px)}.batch-selection-summary[data-v-7445695a]{display:flex;align-items:center;flex:0 0 auto;padding:0 2px}.batch-selection-count[data-v-7445695a]{min-width:20px;height:28px;display:inline-flex;align-items:center;justify-content:center;padding:0 4px;color:var(--admin-container-color);font-size:15px;font-weight:650;line-height:1}.batch-toolbar-divider[data-v-7445695a]{width:1px;height:20px;flex:0 0 auto;border-radius:999px;background:var(--admin-batch-toolbar-border);opacity:.78}.batch-floating-actions[data-v-7445695a]{display:flex;align-items:center;gap:6px}.batch-floating-btn[data-v-7445695a]{width:38px;height:38px;min-width:38px;margin-left:0!important;padding:0;border:none;border-radius:50%;color:var(--admin-batch-clear-color);background:var(--admin-batch-action-bg);box-shadow:var(--admin-batch-action-shadow);transition:transform .22s ease,box-shadow .22s ease,background-color .22s ease,color .22s ease}.batch-floating-btn[data-v-7445695a]:hover{transform:translateY(-2px);background:var(--admin-batch-action-hover-bg);box-shadow:var(--admin-batch-action-hover-shadow)}.batch-floating-btn.copy[data-v-7445695a]{color:var(--admin-batch-copy-color)}.batch-floating-btn.danger[data-v-7445695a]{color:var(--admin-batch-delete-color)}.batch-floating-btn.download[data-v-7445695a]{color:var(--admin-batch-download-color)}.batch-floating-btn.move[data-v-7445695a]{color:var(--admin-batch-move-color)}.batch-floating-btn.tag[data-v-7445695a]{color:var(--admin-batch-tag-color)}.batch-floating-btn.ban[data-v-7445695a]{color:var(--admin-batch-ban-color)}.batch-floating-btn.white[data-v-7445695a]{color:var(--admin-batch-white-color)}.batch-floating-btn.ghost[data-v-7445695a]{color:var(--admin-batch-clear-color)}.batch-floating-icon[data-v-7445695a]{width:16px;margin-right:0}.batch-toolbar-enter-active[data-v-7445695a],.batch-toolbar-leave-active[data-v-7445695a]{transition:opacity .24s ease,transform .28s cubic-bezier(.22,1,.36,1)}.batch-toolbar-enter-from[data-v-7445695a],.batch-toolbar-leave-to[data-v-7445695a]{opacity:0;transform:translateX(-50%) translateY(16px) scale(.98)}.batch-toolbar-enter-to[data-v-7445695a],.batch-toolbar-leave-from[data-v-7445695a]{opacity:1;transform:translateX(-50%) translateY(0) scale(1)}@media (max-width:768px){.batch-floating-bar[data-v-7445695a]{left:50%;right:auto;bottom:max(76px,calc(64px + env(safe-area-inset-bottom)));transform:translateX(-50%);width:-moz-max-content;width:max-content;max-width:calc(100vw - 24px);gap:5px;padding:7px;border-radius:999px}.batch-selection-summary[data-v-7445695a]{padding:0 1px}.batch-selection-count[data-v-7445695a]{min-width:18px;height:24px;padding:0 3px;font-size:13px}.batch-toolbar-divider[data-v-7445695a]{height:18px}.batch-floating-actions[data-v-7445695a]{flex:1;min-width:0;gap:5px;overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none;padding:1px}.batch-floating-actions[data-v-7445695a]::-webkit-scrollbar{display:none}.batch-floating-btn[data-v-7445695a]{width:34px;height:34px;min-width:34px;padding:0;border-radius:50%}.batch-floating-icon[data-v-7445695a]{margin-right:0;width:14px}.batch-toolbar-enter-from[data-v-7445695a],.batch-toolbar-leave-to[data-v-7445695a]{transform:translateX(-50%) translateY(16px) scale(.98)}.batch-toolbar-enter-to[data-v-7445695a],.batch-toolbar-leave-from[data-v-7445695a]{transform:translateX(-50%) translateY(0) scale(1)}}.el-container{box-sizing:border-box;display:flex;flex:1;flex-basis:auto;flex-direction:row;min-width:0}.el-container.is-vertical{flex-direction:column}.el-aside{overflow:auto;width:var(--el-aside-width,300px)}.el-aside,.el-footer{box-sizing:border-box;flex-shrink:0}.el-footer{--el-footer-padding:0 20px;--el-footer-height:60px;height:var(--el-footer-height);padding:var(--el-footer-padding)}.el-header{--el-header-padding:0 20px;--el-header-height:60px;flex-shrink:0;height:var(--el-header-height);padding:var(--el-header-padding)}.el-header,.el-main{box-sizing:border-box}.el-main{--el-main-padding:20px;display:block;flex:1;flex-basis:auto;overflow:auto;padding:var(--el-main-padding)}.el-pagination{--el-pagination-font-size:14px;--el-pagination-bg-color:var(--el-fill-color-blank);--el-pagination-text-color:var(--el-text-color-primary);--el-pagination-border-radius:2px;--el-pagination-button-color:var(--el-text-color-primary);--el-pagination-button-width:32px;--el-pagination-button-height:32px;--el-pagination-button-disabled-color:var(--el-text-color-placeholder);--el-pagination-button-disabled-bg-color:var(--el-fill-color-blank);--el-pagination-button-bg-color:var(--el-fill-color);--el-pagination-hover-color:var(--el-color-primary);--el-pagination-font-size-small:12px;--el-pagination-button-width-small:24px;--el-pagination-button-height-small:24px;--el-pagination-button-width-large:40px;--el-pagination-button-height-large:40px;--el-pagination-item-gap:16px;align-items:center;color:var(--el-pagination-text-color);display:flex;font-size:var(--el-pagination-font-size);font-weight:400;white-space:nowrap}.el-pagination .el-input__inner{-moz-appearance:textfield;text-align:center}.el-pagination .el-select{width:128px}.el-pagination .btn-next,.el-pagination .btn-prev{align-items:center;background:var(--el-pagination-bg-color);border:none;border-radius:var(--el-pagination-border-radius);box-sizing:border-box;color:var(--el-pagination-button-color);cursor:pointer;display:flex;font-size:var(--el-pagination-font-size);height:var(--el-pagination-button-height);justify-content:center;line-height:var(--el-pagination-button-height);min-width:var(--el-pagination-button-width);padding:0 4px;text-align:center}.el-pagination .btn-next *,.el-pagination .btn-prev *{pointer-events:none}.el-pagination .btn-next:focus,.el-pagination .btn-prev:focus{outline:none}.el-pagination .btn-next:hover,.el-pagination .btn-prev:hover{color:var(--el-pagination-hover-color)}.el-pagination .btn-next.is-active,.el-pagination .btn-prev.is-active{color:var(--el-pagination-hover-color);cursor:default;font-weight:700}.el-pagination .btn-next.is-active.is-disabled,.el-pagination .btn-prev.is-active.is-disabled{color:var(--el-text-color-secondary);font-weight:700}.el-pagination .btn-next.is-disabled,.el-pagination .btn-next:disabled,.el-pagination .btn-prev.is-disabled,.el-pagination .btn-prev:disabled{background-color:var(--el-pagination-button-disabled-bg-color);color:var(--el-pagination-button-disabled-color);cursor:not-allowed}.el-pagination .btn-next:focus-visible,.el-pagination .btn-prev:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700;width:inherit}.el-pagination>.is-first{margin-left:0!important}.el-pagination>.is-last{margin-right:0!important}.el-pagination .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination__sizes,.el-pagination__total{color:var(--el-text-color-regular);font-weight:400;margin-left:var(--el-pagination-item-gap)}.el-pagination__total[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__jump{align-items:center;color:var(--el-text-color-regular);display:flex;font-weight:400;margin-left:var(--el-pagination-item-gap)}.el-pagination__jump[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__goto{margin-right:8px}.el-pagination__editor{box-sizing:border-box;text-align:center}.el-pagination__editor.el-input{width:56px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination__classifier{margin-left:8px}.el-pagination__rightwrapper{align-items:center;display:flex;flex:1;justify-content:flex-end}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{background-color:var(--el-pagination-button-bg-color);margin:0 4px}.el-pagination.is-background .btn-next.is-active,.el-pagination.is-background .btn-prev.is-active,.el-pagination.is-background .el-pager li.is-active{background-color:var(--el-color-primary);color:var(--el-color-white)}.el-pagination.is-background .btn-next.is-disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.is-disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.is-disabled,.el-pagination.is-background .el-pager li:disabled{background-color:var(--el-disabled-bg-color);color:var(--el-text-color-placeholder)}.el-pagination.is-background .btn-next.is-disabled.is-active,.el-pagination.is-background .btn-next:disabled.is-active,.el-pagination.is-background .btn-prev.is-disabled.is-active,.el-pagination.is-background .btn-prev:disabled.is-active,.el-pagination.is-background .el-pager li.is-disabled.is-active,.el-pagination.is-background .el-pager li:disabled.is-active{background-color:var(--el-fill-color-dark);color:var(--el-text-color-secondary)}.el-pagination.is-background .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li{font-size:var(--el-pagination-font-size-small);height:var(--el-pagination-button-height-small);line-height:var(--el-pagination-button-height-small);min-width:var(--el-pagination-button-width-small)}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){font-size:var(--el-pagination-font-size-small)}.el-pagination--small .el-select{width:100px}.el-pagination--large .btn-next,.el-pagination--large .btn-prev,.el-pagination--large .el-pager li{height:var(--el-pagination-button-height-large);line-height:var(--el-pagination-button-height-large);min-width:var(--el-pagination-button-width-large)}.el-pagination--large .el-select .el-input{width:160px}.el-pager{font-size:0;list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.el-pager,.el-pager li{align-items:center;display:flex}.el-pager li{background:var(--el-pagination-bg-color);border:none;border-radius:var(--el-pagination-border-radius);box-sizing:border-box;color:var(--el-pagination-button-color);cursor:pointer;font-size:var(--el-pagination-font-size);height:var(--el-pagination-button-height);justify-content:center;line-height:var(--el-pagination-button-height);min-width:var(--el-pagination-button-width);padding:0 4px;text-align:center}.el-pager li *{pointer-events:none}.el-pager li:focus{outline:none}.el-pager li.is-active,.el-pager li:hover{color:var(--el-pagination-hover-color)}.el-pager li.is-active{cursor:default;font-weight:700}.el-pager li.is-active.is-disabled{color:var(--el-text-color-secondary);font-weight:700}.el-pager li.is-disabled,.el-pager li:disabled{background-color:var(--el-pagination-button-disabled-bg-color);color:var(--el-pagination-button-disabled-color);cursor:not-allowed}.el-pager li:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.list-item[data-v-78d34f50]{display:grid;grid-template-columns:50px 60px minmax(180px,1fr) 130px 100px 110px 130px 80px 100px 120px;content-visibility:auto;contain:layout paint style;contain-intrinsic-size:65px;padding:12px 20px;align-items:center;transition:background .2s ease;border-bottom:1px solid var(--el-border-color-lighter);min-width:-moz-fit-content;min-width:fit-content}.list-item[data-v-78d34f50]:last-child{border-bottom:none}.list-item[data-v-78d34f50]:hover{background:var(--el-fill-color-light)}.list-col[data-v-78d34f50]{display:flex;align-items:center}.list-col-checkbox[data-v-78d34f50]{justify-content:center;min-width:40px}.list-col-preview[data-v-78d34f50]{justify-content:center;cursor:pointer}.list-col-name[data-v-78d34f50]{cursor:pointer;overflow:hidden;padding-right:16px;min-width:0}.list-col-name[data-v-78d34f50]:hover{color:#38bdf8}.filename-ellipsis[data-v-78d34f50]{display:flex;max-width:100%;overflow:hidden;align-items:center}.filename-start[data-v-78d34f50]{flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filename-end[data-v-78d34f50]{flex-shrink:0;white-space:nowrap}.list-col-channel-name[data-v-78d34f50],.list-col-channel[data-v-78d34f50],.list-col-date[data-v-78d34f50],.list-col-size[data-v-78d34f50]{font-size:13px;color:var(--el-text-color-secondary)}.list-col-address[data-v-78d34f50]{font-size:13px}.address-box[data-v-78d34f50],.channel-name-box[data-v-78d34f50]{background:var(--el-fill-color-light);border:1px solid var(--el-border-color-lighter);border-radius:4px;padding:4px 8px;font-size:12px;color:var(--el-text-color-secondary);max-width:100%;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:none;-ms-overflow-style:none}.address-box[data-v-78d34f50]{width:85px;font-family:Consolas,Monaco,monospace}.channel-name-box[data-v-78d34f50]{width:70px}.address-box[data-v-78d34f50]::-webkit-scrollbar,.channel-name-box[data-v-78d34f50]::-webkit-scrollbar{display:none}.list-col-tags[data-v-78d34f50]{display:flex;align-items:center;gap:4px;flex-wrap:nowrap;overflow:hidden}.custom-checkbox[data-v-78d34f50]{width:18px;height:18px;border:2px solid var(--el-border-color);border-radius:4px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;background:transparent}.custom-checkbox[data-v-78d34f50]:hover{border-color:#38bdf8}.custom-checkbox.checked[data-v-78d34f50]{background:linear-gradient(135deg,#0ea5e9,#38bdf8);border-color:#38bdf8}.custom-checkbox .check-icon[data-v-78d34f50]{font-size:10px;color:#fff}.color-tag[data-v-78d34f50]{padding:2px 8px;border-radius:10px;font-size:11px;color:#fff;white-space:nowrap;max-width:60px;overflow:hidden;text-overflow:ellipsis;text-shadow:0 1px 2px rgba(0,0,0,.2)}.color-tag-more[data-v-78d34f50]{min-width:30px;text-align:center}.list-empty[data-v-78d34f50]{color:var(--el-text-color-placeholder)}.list-col-actions[data-v-78d34f50]{display:flex;gap:8px;justify-content:flex-end}.list-preview-img[data-v-78d34f50]{width:40px;height:40px;-o-object-fit:cover;object-fit:cover;border-radius:6px}.list-folder-icon[data-v-78d34f50]{font-size:28px;color:var(--el-color-primary)}.list-file-icon[data-v-78d34f50]{font-size:24px;color:var(--el-text-color-secondary)}.list-action-btn[data-v-78d34f50]{width:32px;height:32px;border:none;border-radius:8px;background:var(--el-fill-color);color:var(--el-text-color-regular);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.list-action-btn[data-v-78d34f50]:hover{background:#38bdf8;color:#fff}.list-action-danger[data-v-78d34f50]:hover{background:var(--el-color-danger)}@media (max-width:768px){.list-item[data-v-78d34f50]{grid-template-columns:28px 40px 1fr auto;padding:10px 8px;gap:8px}.list-col-address[data-v-78d34f50],.list-col-channel-name[data-v-78d34f50],.list-col-channel[data-v-78d34f50],.list-col-date[data-v-78d34f50],.list-col-size[data-v-78d34f50],.list-col-tags[data-v-78d34f50]{display:none}.list-col-actions[data-v-78d34f50]{gap:4px}.list-action-btn[data-v-78d34f50]{width:28px;height:28px}.list-col-checkbox[data-v-78d34f50]{width:24px;min-width:24px}}.img-card[data-v-e367e94e]{width:100%;height:22vh;content-visibility:auto;contain:layout paint style;contain-intrinsic-size:260px;background:var(--admin-dashboard-imgcard-bg-color);border-radius:8px;box-shadow:var(--admin-dashboard-imgcard-shadow);overflow:hidden;position:relative;transition:transform .3s ease}.img-card[data-v-e367e94e] .el-card__body{padding:0;height:100%;overflow:hidden}.img-card[data-v-e367e94e] .el-checkbox{position:absolute;top:10px;right:10px;transform:scale(1.5);z-index:10}.img-card[data-v-e367e94e]:hover{transform:scale(1.05)}.image-preview[data-v-e367e94e],.video-preview[data-v-e367e94e]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .4s ease,opacity .3s ease;filter:var(--image-preview-filter)}.video-preview[data-v-e367e94e]{cursor:pointer}.img-card:hover .file-icon[data-v-e367e94e],.img-card:hover .image-preview[data-v-e367e94e],.img-card:hover .video-preview[data-v-e367e94e]{transform:scale(1.03)}.image-preview[data-v-e367e94e]:hover{opacity:.8}.file-short-info[data-v-e367e94e]{position:absolute;z-index:10;top:3px;left:3px;display:flex;gap:5px;align-items:start}.success-tag[data-v-e367e94e]{background-color:rgba(34,139,34,.6);border:1px solid rgba(34,139,34,.7);border-radius:6px}.fail-tag[data-v-e367e94e],.success-tag[data-v-e367e94e]{color:hsla(0,0%,100%,.95);padding:3px 8px;font-size:11px;font-weight:500;height:auto;line-height:1.2;text-shadow:0 1px 2px rgba(0,0,0,.3);backdrop-filter:blur(4px)}.fail-tag[data-v-e367e94e]{background-color:rgba(220,53,69,.6);border:1px solid rgba(220,53,69,.7);border-radius:6px}.primary-tag[data-v-e367e94e]{background-color:rgba(250,82,194,.6);color:hsla(0,0%,100%,.95);border:1px solid rgba(250,82,194,.7);padding:3px 8px;border-radius:6px;font-size:11px;font-weight:500;display:flex;align-items:center;height:auto;line-height:1.2;text-shadow:0 1px 2px rgba(0,0,0,.3);backdrop-filter:blur(4px)}.file-preview[data-v-e367e94e]{display:flex;justify-content:center;align-items:center;width:100%;height:100%}.file-icon[data-v-e367e94e]{opacity:.6;font-size:clamp(40px,4vw,64px);transition:transform .4s ease}.audio-icon[data-v-e367e94e]{color:var(--el-color-primary);opacity:.8}.audio-card-preview[data-v-e367e94e]{cursor:pointer}.card-bottom-overlay[data-v-e367e94e]{position:absolute;bottom:0;left:0;right:0;background:linear-gradient(transparent,rgba(0,0,0,.7));padding:clamp(15px,2.5vh,30px) clamp(6px,1vw,12px) clamp(5px,.8vh,10px);display:flex;flex-direction:column;gap:clamp(3px,.5vh,6px);z-index:10}.file-name-row[data-v-e367e94e]{display:flex;align-items:center;justify-content:center}.file-name[data-v-e367e94e]{color:#fff;font-size:clamp(10px,1.1vw,14px);text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;text-shadow:0 1px 3px rgba(0,0,0,.5)}.action-bar[data-v-e367e94e]{display:flex;justify-content:space-between;align-items:center;opacity:0;transform:translateY(4px);transition:all .25s cubic-bezier(.4,0,.2,1);pointer-events:none}.el-card:hover .action-bar[data-v-e367e94e]{opacity:1;transform:translateY(0);pointer-events:auto}.action-bar-left[data-v-e367e94e],.action-bar-right[data-v-e367e94e]{display:flex;align-items:center;gap:clamp(3px,.4vw,6px)}.action-btn[data-v-e367e94e]{width:clamp(24px,2.5vw,28px);height:clamp(24px,2.5vw,28px);border:none;border-radius:clamp(5px,.6vw,8px);background:hsla(0,0%,100%,.15);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;font-size:clamp(11px,1.1vw,14px)}.action-btn[data-v-e367e94e]:hover{background:hsla(0,0%,100%,.25);transform:scale(1.08)}.action-btn[data-v-e367e94e]:active{transform:scale(.95)}.action-btn-danger[data-v-e367e94e]:hover{background:rgba(239,68,68,.6)}@media (max-width:768px){.action-bar[data-v-e367e94e]{display:none!important}}@keyframes skeleton-shimmer-e367e94e{0%{background-position:-200% 0}to{background-position:200% 0}}.skeleton-wrapper[data-v-e367e94e]{width:100%;height:100%;background:linear-gradient(90deg,var(--skeleton-bg-color) 25%,color-mix(in srgb,var(--skeleton-bg-color) 70%,var(--skeleton-shimmer-color)) 50%,var(--skeleton-bg-color) 75%);background-size:200% 100%;animation:skeleton-shimmer-e367e94e 1.5s ease-in-out infinite}.error-wrapper[data-v-e367e94e]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--skeleton-bg-color);cursor:pointer;gap:8px}.error-icon[data-v-e367e94e]{font-size:32px;color:var(--el-color-warning);opacity:.7}.error-text[data-v-e367e94e]{font-size:12px;color:var(--el-text-color-secondary)}.img-card[data-v-5f22ef48]{width:100%;height:22vh;content-visibility:auto;contain:layout paint style;contain-intrinsic-size:260px;background:var(--admin-dashboard-imgcard-bg-color);border-radius:8px;box-shadow:var(--admin-dashboard-imgcard-shadow);overflow:hidden;position:relative;transition:transform .3s ease}.img-card[data-v-5f22ef48] .el-card__body{padding:0;height:100%;overflow:hidden}.img-card[data-v-5f22ef48] .el-checkbox{position:absolute;top:10px;right:10px;transform:scale(1.5);z-index:10}.img-card[data-v-5f22ef48]:hover{transform:scale(1.05)}.folder-card[data-v-5f22ef48]{cursor:pointer}.folder-icon[data-v-5f22ef48]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;color:var(--el-color-primary)}.folder-icon-svg[data-v-5f22ef48]{font-size:clamp(40px,4vw,64px);transition:transform .4s ease}.img-card:hover .folder-icon-svg[data-v-5f22ef48]{transform:scale(1.03)}.card-bottom-overlay[data-v-5f22ef48]{position:absolute;bottom:0;left:0;right:0;background:linear-gradient(transparent,rgba(0,0,0,.7));padding:clamp(15px,2.5vh,30px) clamp(6px,1vw,12px) clamp(5px,.8vh,10px);display:flex;flex-direction:column;gap:clamp(3px,.5vh,6px);z-index:10}.file-name-row[data-v-5f22ef48]{display:flex;align-items:center;justify-content:center}.file-name[data-v-5f22ef48]{color:#fff;font-size:clamp(10px,1.1vw,14px);text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;text-shadow:0 1px 3px rgba(0,0,0,.5)}.action-bar[data-v-5f22ef48]{display:flex;justify-content:space-between;align-items:center;opacity:0;transform:translateY(4px);transition:all .25s cubic-bezier(.4,0,.2,1);pointer-events:none}.el-card:hover .action-bar[data-v-5f22ef48]{opacity:1;transform:translateY(0);pointer-events:auto}.action-bar-left[data-v-5f22ef48],.action-bar-right[data-v-5f22ef48]{display:flex;align-items:center;gap:clamp(3px,.4vw,6px)}.action-btn[data-v-5f22ef48]{width:clamp(24px,2.5vw,28px);height:clamp(24px,2.5vw,28px);border:none;border-radius:clamp(5px,.6vw,8px);background:hsla(0,0%,100%,.15);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;font-size:clamp(11px,1.1vw,14px)}.action-btn[data-v-5f22ef48]:hover{background:hsla(0,0%,100%,.25);transform:scale(1.08)}.action-btn[data-v-5f22ef48]:active{transform:scale(.95)}.action-btn-danger[data-v-5f22ef48]:hover{background:rgba(239,68,68,.6)}@media (max-width:768px){.action-bar[data-v-5f22ef48]{display:none!important}}@keyframes skeleton-shimmer-5060702c{0%{background-position:-200% 0}to{background-position:200% 0}}@keyframes skeleton-pulse-5060702c{0%,to{opacity:.4}50%{opacity:.8}}.skeleton-card[data-v-5060702c]{width:100%;height:22vh;background:var(--admin-dashboard-imgcard-bg-color);border-radius:12px;box-shadow:var(--admin-dashboard-imgcard-shadow);overflow:hidden;position:relative}.skeleton-image[data-v-5060702c]{width:100%;height:100%;background:linear-gradient(90deg,var(--skeleton-bg-color) 25%,color-mix(in srgb,var(--skeleton-bg-color) 70%,var(--skeleton-shimmer-color)) 50%,var(--skeleton-bg-color) 75%);background-size:200% 100%;animation:skeleton-shimmer-5060702c 1.5s ease-in-out infinite}.skeleton-info[data-v-5060702c]{position:absolute;bottom:0;left:0;right:0;padding:15px;background:linear-gradient(transparent,rgba(0,0,0,.5))}.skeleton-text[data-v-5060702c]{height:14px;width:60%;margin:0 auto;border-radius:4px;background:linear-gradient(90deg,hsla(0,0%,100%,.1) 25%,hsla(0,0%,100%,.25) 50%,hsla(0,0%,100%,.1) 75%);background-size:200% 100%;animation:skeleton-shimmer-5060702c 1.5s ease-in-out infinite}.skeleton-list-item[data-v-5060702c]{animation:skeleton-pulse-5060702c 1.5s ease-in-out infinite}.skeleton-checkbox[data-v-5060702c]{width:18px;height:18px;border-radius:4px;background:var(--skeleton-bg-color)}.skeleton-preview[data-v-5060702c]{width:40px;height:40px;border-radius:6px;background:linear-gradient(90deg,var(--skeleton-bg-color) 25%,color-mix(in srgb,var(--skeleton-bg-color) 70%,var(--skeleton-shimmer-color)) 50%,var(--skeleton-bg-color) 75%);background-size:200% 100%;animation:skeleton-shimmer-5060702c 1.5s ease-in-out infinite}.skeleton-text-long[data-v-5060702c]{width:80%}.skeleton-text-long[data-v-5060702c],.skeleton-text-short[data-v-5060702c]{height:14px;border-radius:4px;background:linear-gradient(90deg,var(--skeleton-bg-color) 25%,color-mix(in srgb,var(--skeleton-bg-color) 70%,var(--skeleton-shimmer-color)) 50%,var(--skeleton-bg-color) 75%);background-size:200% 100%;animation:skeleton-shimmer-5060702c 1.5s ease-in-out infinite}.skeleton-text-short[data-v-5060702c]{width:60px}.skeleton-text-tiny[data-v-5060702c]{height:14px;width:40px;border-radius:4px}.skeleton-tag[data-v-5060702c],.skeleton-text-tiny[data-v-5060702c]{background:linear-gradient(90deg,var(--skeleton-bg-color) 25%,color-mix(in srgb,var(--skeleton-bg-color) 70%,var(--skeleton-shimmer-color)) 50%,var(--skeleton-bg-color) 75%);background-size:200% 100%;animation:skeleton-shimmer-5060702c 1.5s ease-in-out infinite}.skeleton-tag[data-v-5060702c]{height:20px;width:50px;border-radius:10px}.skeleton-actions[data-v-5060702c]{height:28px;width:80px;border-radius:6px;background:var(--skeleton-bg-color)}.list-item[data-v-5060702c]{display:grid;grid-template-columns:50px 60px minmax(180px,1fr) 130px 100px 110px 130px 80px 100px 120px;padding:12px 20px;align-items:center;border-bottom:1px solid var(--el-border-color-lighter)}.list-col[data-v-5060702c]{display:flex;align-items:center}.list-col-checkbox[data-v-5060702c],.list-col-preview[data-v-5060702c]{justify-content:center}@media (max-width:768px){.list-item[data-v-5060702c]{grid-template-columns:28px 40px 1fr auto;padding:10px 8px;gap:8px}.list-col-address[data-v-5060702c],.list-col-channel-name[data-v-5060702c],.list-col-channel[data-v-5060702c],.list-col-date[data-v-5060702c],.list-col-size[data-v-5060702c],.list-col-tags[data-v-5060702c]{display:none}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb:after,.el-breadcrumb:before{content:"";display:table}.el-breadcrumb:after{clear:both}.el-breadcrumb__separator{color:var(--el-text-color-placeholder);font-weight:700;margin:0 9px}.el-breadcrumb__separator.el-icon{font-weight:400;margin:0 6px}.el-breadcrumb__separator.el-icon svg{vertical-align:middle}.el-breadcrumb__item{align-items:center;display:inline-flex;float:left}.el-breadcrumb__inner{color:var(--el-text-color-regular)}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{color:var(--el-text-color-primary);font-weight:700;text-decoration:none;transition:var(--el-transition-color)}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:var(--el-color-primary);cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{color:var(--el-text-color-regular);cursor:text;font-weight:400}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.el-checkbox-group{font-size:0;line-height:0}.filter-dropdown[data-v-c3aeeea0]{flex-shrink:0}.filter-trigger[data-v-c3aeeea0]{cursor:pointer;display:flex;align-items:center}.header-icon[data-v-c3aeeea0]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-c3aeeea0]:hover{color:var(--admin-purple);transform:scale(1.2)}.filter-badge[data-v-c3aeeea0] .el-badge__content{background:linear-gradient(135deg,#0ea5e9,#38bdf8);border:none;font-size:10px;height:16px;line-height:16px;padding:0 5px}.filter-dropdown-menu[data-v-c3aeeea0]{padding:8px 0;min-width:180px;max-height:400px;overflow-y:auto}.filter-section[data-v-c3aeeea0]{padding:8px 12px;border-bottom:1px solid var(--el-border-color-lighter)}.filter-section[data-v-c3aeeea0]:last-of-type{border-bottom:none}.filter-title[data-v-c3aeeea0]{font-size:12px;font-weight:600;color:var(--el-text-color-secondary);margin-bottom:6px}.filter-options[data-v-c3aeeea0],.filter-options[data-v-c3aeeea0] .el-checkbox-group{display:flex;flex-direction:column;gap:2px}.filter-options[data-v-c3aeeea0] .el-checkbox{margin-right:0;height:26px;padding:0 6px;border-radius:4px;transition:all .2s ease}.filter-options[data-v-c3aeeea0] .el-checkbox:hover{background:var(--el-fill-color-light)}.filter-options[data-v-c3aeeea0] .el-checkbox__label{font-size:13px;color:var(--el-text-color-primary)}.filter-options[data-v-c3aeeea0] .el-checkbox__input.is-checked+.el-checkbox__label{color:#0ea5e9}.channel-group-title[data-v-c3aeeea0]{font-size:11px;font-weight:600;color:var(--el-text-color-secondary);text-transform:uppercase;letter-spacing:.5px;padding:4px 6px;margin-top:4px;margin-bottom:2px}.channel-divider[data-v-c3aeeea0]{height:1px;background:var(--el-border-color-lighter);margin:6px 0}.filter-options[data-v-c3aeeea0] .el-checkbox__input.is-checked .el-checkbox__inner{background-color:#0ea5e9;border-color:#0ea5e9}.filter-actions[data-v-c3aeeea0]{padding:10px 12px 6px;display:flex;justify-content:center}.filter-actions .el-button[data-v-c3aeeea0]{width:100%;background:var(--el-fill-color-light);border:1px solid var(--el-border-color);color:var(--el-text-color-regular);border-radius:6px;transition:all .2s ease}.filter-actions .el-button[data-v-c3aeeea0]:hover:not(:disabled){background:linear-gradient(135deg,#0ea5e9,#38bdf8);border-color:#38bdf8;color:#fff}.filter-actions .el-button[data-v-c3aeeea0]:disabled{opacity:.5;cursor:not-allowed}@media (max-width:768px){.filter-dropdown-menu[data-v-c3aeeea0]{min-width:160px;max-height:320px}.filter-section[data-v-c3aeeea0]{padding:6px 10px}.filter-title[data-v-c3aeeea0]{font-size:11px;margin-bottom:4px}.filter-options[data-v-c3aeeea0] .el-checkbox{height:24px;padding:0 4px}.filter-options[data-v-c3aeeea0] .el-checkbox__label{font-size:12px}.header-icon[data-v-c3aeeea0]{font-size:1.2em}}.language-switcher[data-v-08567d0a]{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:all .3s ease}.lang-icon[data-v-08567d0a]{font-size:var(--lang-icon-size,1.5em);color:var(--lang-icon-color,var(--theme-toggle-color))}#themeToggle[data-v-5c149ed5]{border:0;cursor:pointer;display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:.375rem;transition-property:background-color,border-color,color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.theme_toggle_circle1[data-v-5c149ed5]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-5c149ed5]{transition:all .5s ease-in-out;fill:var(--admin-theme-toggle-bg-color)}.theme_toggle_svg[data-v-5c149ed5]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--admin-theme-toggle-color)}.dark.theme_toggle_svg[data-v-5c149ed5]{transform:rotate(40deg)}.theme_toggle_g[data-v-5c149ed5]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-5c149ed5],.icon-fade-leave-active[data-v-5c149ed5]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-5c149ed5]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-5c149ed5]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-5c149ed5],.icon-fade-leave-from[data-v-5c149ed5]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-5c149ed5]{display:inline-block}.tabs[data-v-4e00471a]{display:flex;align-items:center;justify-content:center;gap:8px}.title[data-v-4e00471a]{display:flex;align-items:center;gap:8px;font-size:1.1em;font-weight:700;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);padding:5px 12px;border-radius:10px;background:linear-gradient(135deg,rgba(99,102,241,.08),rgba(139,92,246,.05));border:1px solid rgba(99,102,241,.15)}.title[data-v-4e00471a]:hover{background:linear-gradient(135deg,rgba(99,102,241,.15),rgba(139,92,246,.1));border-color:rgba(99,102,241,.25);transform:translateY(-1px)}.title .fa-images[data-v-4e00471a]{font-size:1em;color:var(--el-color-primary);background:linear-gradient(135deg,#6366f1,#8b5cf6);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.tabs-dropdown[data-v-4e00471a]{display:flex;align-items:center}.tabs-dropdown-link[data-v-4e00471a]{cursor:pointer;font-size:1.3em;transition:all .3s ease;color:var(--admin-container-color);padding:5px 8px;border-radius:8px;background:transparent}.tabs-dropdown-link.rotate-up[data-v-4e00471a],.tabs-dropdown-link[data-v-4e00471a]:hover{background:rgba(99,102,241,.1);color:var(--el-color-primary)}@media (max-width:768px){.tabs[data-v-4e00471a]{gap:6px}.title[data-v-4e00471a]{font-size:1em;padding:3px 8px;gap:5px}.tabs-dropdown-link[data-v-4e00471a]{font-size:1.1em;padding:3px 6px}.tabs-language-switcher[data-v-4e00471a]{--lang-icon-size:1.1em;padding:3px}}.tabs-language-switcher[data-v-4e00471a]{--lang-icon-size:1.3em;--lang-icon-color:var(--admin-theme-toggle-color);transition:color .3s ease;padding:5px}.el-dropdown__popper.el-popper.tabs-dropdown-popper{border-radius:12px;border:none;background-color:var(--tabs-dropdown-popper-bg-color);backdrop-filter:blur(10px);box-shadow:var(--tabs-dropdown-popper-shadow)}.el-dropdown__popper.el-popper.tabs-dropdown-popper .el-dropdown-menu{border:none;background:none}.el-dropdown__popper.el-popper.tabs-dropdown-popper .el-dropdown-menu__item{border:none;background:none;font-size:16px;font-weight:700;transition:font-size .3s ease}.el-dropdown__popper.el-popper.tabs-dropdown-popper .el-dropdown-menu__item:hover{font-size:18px}.container[data-v-437b7a30]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0}[data-v-437b7a30] .el-container,[data-v-437b7a30] .el-main{overflow:visible}[data-v-437b7a30] .el-dialog{border-radius:12px;background-color:var(--dialog-bg-color);backdrop-filter:blur(10px);box-shadow:var(--dialog-box-shadow)}.header-content[data-v-437b7a30]{display:flex;justify-content:space-between;align-items:center;padding:10px 24px;background:hsla(0,0%,100%,.72);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border:1px solid hsla(0,0%,100%,.3);border-top:1px solid hsla(0,0%,100%,.5);box-shadow:0 4px 30px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.05),inset 0 1px 0 hsla(0,0%,100%,.4);transition:all .4s cubic-bezier(.4,0,.2,1);border-radius:16px;position:fixed;top:8px;left:50%;transform:translateX(-50%);width:calc(95% - 16px);z-index:2001;min-height:45px}html.dark .header-content[data-v-437b7a30]{background:rgba(30,30,30,.75);border:1px solid hsla(0,0%,100%,.08);border-top:1px solid hsla(0,0%,100%,.12);box-shadow:0 4px 30px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.2),inset 0 1px 0 hsla(0,0%,100%,.05)}@media (max-width:768px){.header-content[data-v-437b7a30]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-437b7a30]{font-size:.95em}.header-content .actions[data-v-437b7a30]{gap:10px}.search-card[data-v-437b7a30] .el-input__inner{height:28px;font-size:.85em;width:50vw}.search-card[data-v-437b7a30] .el-input__wrapper{padding:0 10px}.search-card[data-v-437b7a30] .el-input__inner:focus{width:65vw}}.header-content[data-v-437b7a30]:hover{background:hsla(0,0%,100%,.82);box-shadow:0 8px 40px rgba(0,0,0,.12),0 2px 6px rgba(0,0,0,.08),inset 0 1px 0 hsla(0,0%,100%,.5);transform:translateX(-50%) translateY(-1px)}html.dark .header-content[data-v-437b7a30]:hover{background:rgba(35,35,35,.85);box-shadow:0 8px 40px rgba(0,0,0,.4),0 2px 6px rgba(0,0,0,.3),inset 0 1px 0 hsla(0,0%,100%,.08)}.header-icon[data-v-437b7a30]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-437b7a30]:hover{color:var(--admin-purple);transform:scale(1.2)}.breadcrumb-container[data-v-437b7a30]{display:flex;align-items:center;justify-content:flex-start;gap:12px;padding:0 10px;margin-top:12px;margin-bottom:4px}.breadcrumb-select-button[data-v-437b7a30]{width:32px;height:32px;box-sizing:border-box;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;padding:0;border:1px solid var(--el-border-color-lighter);border-radius:6px;color:#38bdf8;background:var(--el-fill-color-light);box-shadow:var(--admin-dashboard-stats-shadow);cursor:pointer;transition:transform .2s ease,color .2s ease,background-color .2s ease,box-shadow .2s ease}.breadcrumb-select-button[data-v-437b7a30]:hover{color:var(--admin-purple);transform:translateY(-1px);box-shadow:var(--admin-dashboard-stats-hover-shadow)}.breadcrumb-select-icon[data-v-437b7a30]{font-size:14px}@media (max-width:768px){.breadcrumb-container[data-v-437b7a30]{flex-direction:row;align-items:center;gap:8px;padding:0 5px;margin-top:8px;margin-bottom:2px}.breadcrumb-select-button[data-v-437b7a30]{width:28px;height:28px;box-sizing:border-box;border-radius:8px}.breadcrumb-select-icon[data-v-437b7a30]{font-size:12px}}.stats-badge[data-v-437b7a30]{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:var(--el-text-color-secondary);background:var(--el-fill-color-light);padding:4px 10px;border-radius:12px;border:1px solid var(--el-border-color-lighter);transition:all .2s ease;white-space:nowrap;flex-shrink:0;margin-left:auto}.stats-badge[data-v-437b7a30]:hover{background:var(--el-fill-color);color:var(--admin-purple);border-color:var(--admin-purple)}.stats-badge-icon[data-v-437b7a30]{font-size:11px;opacity:.8}@media (max-width:768px){.stats-badge[data-v-437b7a30]{font-size:10px;padding:2px 6px;border-radius:8px}.stats-badge-icon[data-v-437b7a30]{font-size:9px}}.header-content .actions[data-v-437b7a30]{display:flex;align-items:center;gap:15px}@media (max-width:768px){.header-content .actions[data-v-437b7a30]{margin-top:10px}}.header-content .actions i[data-v-437b7a30]{font-size:1.5em;cursor:pointer;transition:color .3s,transform .3s;color:var(--admin-container-color)}.header-content .actions i[data-v-437b7a30]:hover{color:var(--admin-purple);transform:scale(1.2)}.header-content .actions .el-dropdown-link i[data-v-437b7a30]{color:var(--admin-container-color)}.header-content .actions .el-dropdown-link i[data-v-437b7a30]:hover{color:var(--admin-purple)}.header-content .actions .disabled[data-v-437b7a30]{color:#bbb;pointer-events:none}.header-content .actions .enabled[data-v-437b7a30]{color:var(--admin-purple)}.search-area[data-v-437b7a30]{margin-left:auto;margin-right:20px;display:flex;align-items:center;gap:8px}@media (max-width:768px){.search-area[data-v-437b7a30]{margin-right:0;margin-left:0;margin-top:10px;gap:6px}}.search-card[data-v-437b7a30]{display:flex;align-items:center}.search-card[data-v-437b7a30] .el-input__wrapper{border-radius:20px;background:var(--admin-dashboard-search-card-bg-color);box-shadow:var(--admin-dashboard-search-card-box-shadow);transition:background-color .3s}.search-card[data-v-437b7a30] .el-input__inner{width:280px;height:40px;font-size:1.2em;border:none;transition:width .3s;background:none}.search-card[data-v-437b7a30] .el-input__inner::-moz-placeholder{color:var(--el-text-color-placeholder);font-style:italic;font-weight:400;font-size:14px;opacity:.6;letter-spacing:.5px;-moz-transition:all .3s ease;transition:all .3s ease}.search-card[data-v-437b7a30] .el-input__inner::placeholder{color:var(--el-text-color-placeholder);font-style:italic;font-weight:400;font-size:14px;opacity:.6;letter-spacing:.5px;transition:all .3s ease}.search-card[data-v-437b7a30] .el-input__inner:focus::-moz-placeholder{opacity:.4;transform:translateX(5px)}.search-card[data-v-437b7a30] .el-input__inner:focus::placeholder{opacity:.4;transform:translateX(5px)}@media (max-width:768px){.search-card[data-v-437b7a30] .el-input__inner{width:45vw;height:32px;font-size:1em}}.search-card[data-v-437b7a30] .el-input__inner:focus{width:350px}@media (max-width:768px){.search-card[data-v-437b7a30] .el-input__inner:focus{width:55vw}}.search-icon[data-v-437b7a30]{cursor:pointer;color:var(--admin-container-color);transition:all .3s ease;font-size:1.3em;opacity:0;transform:scale(.8);pointer-events:none}.search-card:focus-within .search-icon[data-v-437b7a30]{opacity:1;transform:scale(1);pointer-events:auto}.search-card:focus-within .search-icon[data-v-437b7a30]:hover{color:var(--admin-purple);transform:scale(1.2)}.search-card[data-v-437b7a30] .el-input__suffix{display:flex;align-items:center;right:10px}.main-container[data-v-437b7a30]{display:flex;flex-direction:column;padding:20px 60px;min-height:calc(100vh - 80px);transition:padding-bottom .24s ease}.main-container.has-batch-toolbar[data-v-437b7a30]{padding-bottom:72px}@media (max-width:768px){.main-container[data-v-437b7a30]{margin-top:12vh}.main-container.has-batch-toolbar[data-v-437b7a30]{padding-bottom:86px}}.content[data-v-437b7a30]{display:grid;grid-template-columns:repeat(5,1fr);grid-template-rows:repeat(3,1fr);gap:20px;padding:10px;padding-bottom:0;flex-grow:1;min-height:80vh}.content.is-drag-selecting[data-v-437b7a30],.list-view.is-drag-selecting[data-v-437b7a30]{cursor:crosshair}.content.is-drag-selecting[data-v-437b7a30] .img-card:hover,.content.is-drag-selecting[data-v-437b7a30] .img-card:hover .file-icon,.content.is-drag-selecting[data-v-437b7a30] .img-card:hover .folder-icon-svg,.content.is-drag-selecting[data-v-437b7a30] .img-card:hover .image-preview,.content.is-drag-selecting[data-v-437b7a30] .img-card:hover .video-preview{transform:none}.content.is-drag-selecting[data-v-437b7a30] .image-preview:hover{opacity:1}.content.is-drag-selecting[data-v-437b7a30] .action-btn:hover{transform:none;background:hsla(0,0%,100%,.15)}.list-view.is-drag-selecting[data-v-437b7a30] .list-item:hover{background:transparent}.list-view.is-drag-selecting[data-v-437b7a30] .list-action-btn:hover{color:var(--el-text-color-regular);background:var(--el-fill-color)}.list-view.is-drag-selecting[data-v-437b7a30] .list-action-danger:hover{background:var(--el-fill-color)}.empty-state[data-v-437b7a30]{grid-column:1/-1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;color:var(--admin-container-color);opacity:.6}.empty-icon[data-v-437b7a30]{font-size:64px;margin-bottom:20px;color:var(--admin-container-color);opacity:.3}.empty-text[data-v-437b7a30]{font-size:18px;font-weight:500;margin:0 0 8px 0}.empty-hint[data-v-437b7a30]{font-size:14px;margin:0;opacity:.7}.list-empty[data-v-437b7a30]{padding:80px 20px}@media (max-width:768px){.content[data-v-437b7a30]{grid-template-columns:1fr;grid-template-rows:none}}.list-view[data-v-437b7a30]{display:flex;flex-direction:column;gap:0;background:var(--admin-dashboard-imgcard-bg-color);border-radius:12px;overflow-x:auto;overflow-y:visible;box-shadow:var(--admin-dashboard-imgcard-shadow);margin-top:15px}.list-header[data-v-437b7a30]{display:grid;grid-template-columns:50px 60px minmax(180px,1fr) 130px 100px 110px 130px 80px 100px 120px;padding:12px 20px;background:var(--admin-dashboard-stats-bg);font-weight:600;font-size:13px;color:var(--el-text-color-secondary);border-bottom:1px solid var(--el-border-color-lighter);min-width:-moz-fit-content;min-width:fit-content}.list-col[data-v-437b7a30]{display:flex;align-items:center}.list-col-checkbox[data-v-437b7a30]{justify-content:center;min-width:40px}.custom-checkbox[data-v-437b7a30]{width:18px;height:18px;border:2px solid var(--el-border-color);border-radius:4px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;background:transparent}.custom-checkbox[data-v-437b7a30]:hover{border-color:#38bdf8}.custom-checkbox.checked[data-v-437b7a30],.custom-checkbox.indeterminate[data-v-437b7a30]{background:linear-gradient(135deg,#0ea5e9,#38bdf8);border-color:#38bdf8}.custom-checkbox .check-icon[data-v-437b7a30]{font-size:10px;color:#fff}@media (max-width:768px){.list-header[data-v-437b7a30]{display:none}}.pagination-container[data-v-437b7a30]{display:flex;justify-content:center;align-items:center;margin-top:20px;padding-bottom:20px;gap:15px;position:relative}.pagination-center[data-v-437b7a30]{display:flex;align-items:center;gap:10px}.pagination-container[data-v-437b7a30] .el-pagination{--el-pagination-button-bg-color:var(--admin-dashboard-btn-bg-color);--el-pagination-hover-color:var(--admin-purple)}.pagination-container[data-v-437b7a30] .el-pager li{background:var(--admin-dashboard-btn-bg-color);border-radius:10px;margin:0 4px;min-width:36px;height:36px;line-height:36px;font-weight:500;border:none;box-shadow:var(--admin-dashboard-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1)}.pagination-container[data-v-437b7a30] .el-pager li:hover{color:#38bdf8;transform:translateY(-2px);box-shadow:var(--admin-dashboard-btn-hover-shadow)}.pagination-container[data-v-437b7a30] .el-pager li.is-active{background:linear-gradient(135deg,#0ea5e9,#38bdf8)!important;color:#fff!important;border-radius:10px;box-shadow:var(--admin-dashboard-btn-shadow),0 4px 12px rgba(56,189,248,.3),inset 0 1px 0 hsla(0,0%,100%,.2);transition:all .3s cubic-bezier(.4,0,.2,1)}.pagination-container[data-v-437b7a30] .el-pager li.is-active:hover{transform:translateY(-2px)!important;box-shadow:var(--admin-dashboard-btn-hover-shadow),0 6px 16px rgba(56,189,248,.4),inset 0 1px 0 hsla(0,0%,100%,.2)!important}.pagination-container[data-v-437b7a30] .btn-next,.pagination-container[data-v-437b7a30] .btn-prev{background:var(--admin-dashboard-btn-bg-color)!important;border-radius:10px!important;min-width:36px;height:36px;border:none;box-shadow:var(--admin-dashboard-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1)}.pagination-container[data-v-437b7a30] .btn-next:hover,.pagination-container[data-v-437b7a30] .btn-prev:hover{color:#38bdf8;transform:translateY(-2px);box-shadow:var(--admin-dashboard-btn-hover-shadow)}.pagination-right[data-v-437b7a30]{display:flex;align-items:center;gap:10px;position:absolute;right:0}.page-total[data-v-437b7a30]{font-size:13px;color:var(--el-text-color-secondary);white-space:nowrap}.page-jump[data-v-437b7a30]{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--el-text-color-secondary)}.page-jump .jump-input[data-v-437b7a30]{width:50px}.page-jump .jump-input[data-v-437b7a30] .el-input__wrapper{background:var(--admin-dashboard-btn-bg-color);box-shadow:var(--admin-dashboard-btn-shadow);border-radius:8px;padding:0 8px;height:28px}.page-jump .jump-input[data-v-437b7a30] .el-input__inner{text-align:center;color:var(--el-text-color-primary);height:28px;line-height:28px}.page-jump .jump-btn[data-v-437b7a30]{background:linear-gradient(135deg,#0ea5e9,#38bdf8);border:none;border-radius:8px;padding:0 12px;height:28px;font-size:12px;font-weight:600;color:#fff;box-shadow:0 2px 8px rgba(56,189,248,.3);transition:all .3s ease}.page-jump .jump-btn[data-v-437b7a30]:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(56,189,248,.4)}@media (max-width:768px){.pagination-container[data-v-437b7a30]{flex-direction:column;gap:12px;padding-bottom:15px}.pagination-center[data-v-437b7a30]{order:0}.pagination-right[data-v-437b7a30]{position:static;width:100%;justify-content:center;order:1}.page-jump .jump-input[data-v-437b7a30]{width:45px}}.refresh-btn[data-v-437b7a30]{cursor:pointer;background:var(--admin-dashboard-btn-bg-color);box-shadow:var(--admin-dashboard-btn-shadow);color:#38bdf8;border:none;border-radius:10px;width:36px;height:36px;min-width:36px;padding:0;display:flex;align-items:center;justify-content:center;font-size:14px;transition:all .3s cubic-bezier(.4,0,.2,1)}.refresh-btn[data-v-437b7a30]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-btn-hover-shadow);background:linear-gradient(135deg,#0ea5e9,#38bdf8);color:#fff}.load-more[data-v-437b7a30]{cursor:pointer;background:linear-gradient(135deg,#0ea5e9,#38bdf8);box-shadow:0 4px 15px rgba(56,189,248,.3);color:#fff;border:none;border-radius:10px;height:36px;padding:0 16px;font-weight:500;transition:all .3s cubic-bezier(.4,0,.2,1)}.load-more[data-v-437b7a30]:hover{transform:translateY(-2px);box-shadow:0 6px 20px rgba(56,189,248,.5)}[data-v-437b7a30] .btn-prev{left:8px}[data-v-437b7a30] .btn-next,[data-v-437b7a30] .btn-prev{border-radius:100%;position:fixed;top:50%;scale:1;color:var(--admin-dashboard-btn-color)}[data-v-437b7a30] .btn-next{right:8px}@media (min-width:768px){[data-v-437b7a30] .el-pagination.is-background .btn-next,[data-v-437b7a30] .el-pagination.is-background .btn-prev{background-color:var(--admin-dashboard-btn-bg-color);backdrop-filter:blur(10px);box-shadow:var(--admin-dashboard-btn-shadow);transition:all .3s ease}[data-v-437b7a30] .el-pagination.is-background .btn-next:hover,[data-v-437b7a30] .el-pagination.is-background .btn-prev:hover{transform:translateY(-10%);box-shadow:var(--admin-dashboard-btn-hover-shadow)}}.question-icon[data-v-437b7a30]{margin:0 3px}.breadcrumb[data-v-437b7a30]{height:32px;box-sizing:border-box;display:flex;align-items:center;padding:0 12px;background-color:var(--el-fill-color-light);border-radius:6px;font-size:.95em;box-shadow:var(--admin-dashboard-stats-shadow);transition:all .3s ease}.breadcrumb[data-v-437b7a30]:hover{transform:translateY(-1px);box-shadow:var(--admin-dashboard-stats-hover-shadow)}.breadcrumb-home-icon[data-v-437b7a30]{font-size:14px;color:#38bdf8;transition:color .2s ease}.breadcrumb-home-icon[data-v-437b7a30]:hover{color:var(--admin-purple)}[data-v-437b7a30] .el-breadcrumb__item{cursor:pointer}[data-v-437b7a30] .el-breadcrumb,[data-v-437b7a30] .el-breadcrumb__inner,[data-v-437b7a30] .el-breadcrumb__item,[data-v-437b7a30] .el-breadcrumb__separator{display:inline-flex;align-items:center;height:100%;line-height:32px}[data-v-437b7a30] .el-breadcrumb__inner:hover{color:var(--el-color-primary)}.mobile-directory-trigger[data-v-437b7a30]{display:none;align-items:center;height:28px;box-sizing:border-box;gap:6px;padding:0 10px;background:var(--el-fill-color-light);border-radius:8px;border:1px solid var(--el-border-color-lighter);cursor:pointer;transition:all .2s ease}.mobile-directory-trigger[data-v-437b7a30]:active{background:var(--el-fill-color)}.mobile-directory-icon[data-v-437b7a30]{font-size:12px;color:#38bdf8}.mobile-directory-path[data-v-437b7a30]{display:inline-flex;align-items:center;height:100%;font-size:12px;font-weight:500;line-height:1;color:var(--el-text-color-primary);max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mobile-directory-arrow[data-v-437b7a30]{font-size:8px;color:var(--el-text-color-secondary)}.desktop-only[data-v-437b7a30]{display:block}@media (max-width:768px){.mobile-directory-trigger[data-v-437b7a30]{display:flex}.desktop-only[data-v-437b7a30]{display:none!important}.breadcrumb-container[data-v-437b7a30]{padding:0;margin-left:0}}.drag-select-overlay[data-v-437b7a30]{position:fixed;background:rgba(24,144,255,.1);border:1px solid rgba(24,144,255,.6);pointer-events:none;z-index:9999;border-radius:2px} \ No newline at end of file diff --git a/frontend-dist/css/770.37d2e9e0.css.gz b/frontend-dist/css/770.37d2e9e0.css.gz deleted file mode 100644 index 3f1e1f86c730a4d0791971dee9677fc675007c2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14165 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.el-icon{font-size:12px}.el-table__expanded-cell{background-color:var(--el-table-expanded-cell-bg-color)}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-bottom:0;border-right:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--fit .el-table__inner-wrapper:before{width:100%}.el-table thead{color:var(--el-table-header-text-color)}.el-table thead th{font-weight:600}.el-table thead.is-group th.el-table__cell{background:var(--el-fill-color-light)}.el-table .el-table__cell{box-sizing:border-box;min-width:0;padding:8px 0;position:relative;text-align:left;text-overflow:ellipsis;vertical-align:middle;z-index:var(--el-table-index)}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{border-bottom-width:0;border-right-width:0;padding:0;width:15px}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table .cell{box-sizing:border-box;line-height:23px;overflow:hidden;overflow-wrap:break-word;padding:0 12px;text-overflow:ellipsis;white-space:normal}.el-table .cell.el-tooltip{min-width:50px;white-space:nowrap}.el-table--large{font-size:var(--el-font-size-base)}.el-table--large .el-table__cell{padding:12px 0}.el-table--large .cell{padding:0 16px}.el-table--default{font-size:var(--el-font-size-base)}.el-table--default .el-table__cell{padding:8px 0}.el-table--default .cell{padding:0 12px}.el-table--small{font-size:var(--el-font-size-extra-small)}.el-table--small .el-table__cell{padding:4px 0}.el-table--small .cell{padding:0 8px}.el-table tr{background-color:var(--el-table-tr-bg-color)}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:var(--el-table-border)}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{background-color:var(--el-table-header-bg-color)}.el-table th.el-table__cell>.cell.highlight{color:var(--el-color-primary)}.el-table th.el-table__cell.required>div:before{background:#ff4d51;border-radius:50%;content:"";display:inline-block;height:8px;margin-right:5px;vertical-align:middle;width:8px}.el-table td.el-table__cell div{box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table--border .el-table__inner-wrapper:after,.el-table--border:after,.el-table--border:before,.el-table__inner-wrapper:before{background-color:var(--el-table-border-color);content:"";position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table--border .el-table__inner-wrapper:after{height:1px;left:0;top:0;width:100%;z-index:calc(var(--el-table-index) + 2)}.el-table--border:before{height:100%;left:0;top:-1px;width:1px}.el-table--border:after{height:100%;right:0;top:-1px;width:1px}.el-table--border .el-table__inner-wrapper{border-bottom:none;border-right:none}.el-table--border .el-table__footer-wrapper{flex-shrink:0;position:relative}.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:var(--el-table-border);border-bottom-width:1px}.el-table--border th.el-table__cell{border-bottom:var(--el-table-border)}.el-table--hidden{visibility:hidden}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__body-wrapper tr td.el-table-fixed-column--left,.el-table__body-wrapper tr td.el-table-fixed-column--right,.el-table__body-wrapper tr th.el-table-fixed-column--left,.el-table__body-wrapper tr th.el-table-fixed-column--right,.el-table__footer-wrapper tr td.el-table-fixed-column--left,.el-table__footer-wrapper tr td.el-table-fixed-column--right,.el-table__footer-wrapper tr th.el-table-fixed-column--left,.el-table__footer-wrapper tr th.el-table-fixed-column--right,.el-table__header-wrapper tr td.el-table-fixed-column--left,.el-table__header-wrapper tr td.el-table-fixed-column--right,.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background:inherit;position:sticky!important;z-index:calc(var(--el-table-index) + 1)}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{bottom:-1px;box-shadow:none;content:"";overflow-x:hidden;overflow-y:hidden;pointer-events:none;position:absolute;top:0;touch-action:none;width:10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before{left:-10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{right:-10px}.el-table__body-wrapper tr td.el-table__fixed-right-patch,.el-table__body-wrapper tr th.el-table__fixed-right-patch,.el-table__footer-wrapper tr td.el-table__fixed-right-patch,.el-table__footer-wrapper tr th.el-table__fixed-right-patch,.el-table__header-wrapper tr td.el-table__fixed-right-patch,.el-table__header-wrapper tr th.el-table__fixed-right-patch{background:#fff;position:sticky!important;right:0;z-index:calc(var(--el-table-index) + 1)}.el-table__header-wrapper{flex-shrink:0}.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body,.el-table__footer,.el-table__header{border-collapse:separate;table-layout:fixed}.el-table__header-wrapper{overflow:hidden}.el-table__header-wrapper tbody td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__footer-wrapper{flex-shrink:0;overflow:hidden}.el-table__footer-wrapper tfoot td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__body-wrapper .el-table-column--selection>.cell,.el-table__header-wrapper .el-table-column--selection>.cell{align-items:center;display:inline-flex;height:23px}.el-table__body-wrapper .el-table-column--selection .el-checkbox,.el-table__header-wrapper .el-table-column--selection .el-checkbox{height:unset}.el-table.is-scrolling-left .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-left.el-table--border .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:var(--el-table-border)}.el-table.is-scrolling-left th.el-table-fixed-column--left{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-right th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-middle .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-none .el-table-fixed-column--left.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--left.is-last-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-last-column:before{box-shadow:none}.el-table.is-scrolling-none th.el-table-fixed-column--left,.el-table.is-scrolling-none th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body-wrapper{flex:1;overflow:hidden;position:relative}.el-table__body-wrapper .el-scrollbar__bar{z-index:calc(var(--el-table-index) + 2)}.el-table .caret-wrapper{align-items:center;appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-flex;flex-direction:column;height:14px;margin:0;outline:none;overflow:initial;padding:0;position:relative;transition:transform var(--el-transition-duration-fast) ease-in-out;vertical-align:middle;width:24px}.el-table .caret-wrapper:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table .sort-caret{border:5px solid transparent;height:0;left:7px;position:absolute;width:0}.el-table .sort-caret.ascending{border-bottom-color:var(--el-text-color-placeholder);top:-5px}.el-table .sort-caret.descending{border-top-color:var(--el-text-color-placeholder);bottom:-3px}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--el-color-primary)}.el-table .descending .sort-caret.descending{border-top-color:var(--el-color-primary)}.el-table .hidden-columns{position:absolute;visibility:hidden;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:var(--el-fill-color-lighter)}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell,.el-table__body tr>td.hover-cell{background-color:var(--el-table-row-hover-bg-color)}.el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table.el-table--scrollable-y .el-table__body-header{position:sticky;top:0;z-index:calc(var(--el-table-index) + 2)}.el-table.el-table--scrollable-y .el-table__body-footer{bottom:0;position:sticky;z-index:calc(var(--el-table-index) + 2)}.el-table__column-resize-proxy{border-left:var(--el-table-border);bottom:0;left:200px;position:absolute;top:0;width:0;z-index:calc(var(--el-table-index) + 9)}.el-table__column-filter-trigger{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-block;margin:0;outline:none;padding:0;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table__column-filter-trigger:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table__column-filter-trigger i{color:var(--el-color-info);font-size:14px;vertical-align:middle}.el-table__border-left-patch{height:100%;top:0;width:1px}.el-table__border-bottom-patch,.el-table__border-left-patch{background-color:var(--el-table-border-color);left:0;position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table__border-bottom-patch{height:1px}.el-table__border-right-patch{background-color:var(--el-table-border-color);height:100%;position:absolute;top:0;width:1px;z-index:calc(var(--el-table-index) + 2)}.el-table--enable-row-transition .el-table__body td.el-table__cell{transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;text-align:center;width:20px}.el-table .el-table.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table:not(.el-table--border) .el-table__cell{border-right:none}.el-table:not(.el-table--border)>.el-table__inner-wrapper:after{content:none}.el-image__error,.el-image__inner,.el-image__placeholder,.el-image__wrapper{height:100%;width:100%}.el-image{display:inline-block;overflow:hidden;position:relative}.el-image__inner{opacity:1;vertical-align:top}.el-image__inner.is-loading{opacity:0}.el-image__wrapper{left:0;position:absolute;top:0}.el-image__error,.el-image__placeholder{background:var(--el-fill-color-light)}.el-image__error{align-items:center;color:var(--el-text-color-placeholder);display:flex;font-size:14px;justify-content:center;vertical-align:middle}.el-image__preview{cursor:pointer}.el-image-viewer__wrapper{bottom:0;left:0;position:fixed;right:0;top:0}.el-image-viewer__wrapper:focus{outline:none!important}.el-image-viewer__btn{align-items:center;border-radius:50%;box-sizing:border-box;cursor:pointer;display:flex;justify-content:center;opacity:.8;position:absolute;-webkit-user-select:none;user-select:none;z-index:1}.el-image-viewer__btn .el-icon{cursor:pointer}.el-image-viewer__close{font-size:40px;height:40px;right:40px;top:40px;width:40px}.el-image-viewer__canvas{align-items:center;display:flex;height:100%;justify-content:center;position:static;-webkit-user-select:none;user-select:none;width:100%}.el-image-viewer__actions{background-color:var(--el-text-color-regular);border-color:#fff;border-radius:22px;bottom:30px;height:44px;left:50%;padding:0 23px;transform:translateX(-50%)}.el-image-viewer__actions__inner{align-items:center;color:#fff;cursor:default;display:flex;font-size:23px;gap:22px;height:100%;justify-content:space-around;padding:0 6px;width:100%}.el-image-viewer__actions__divider{margin:0 -6px}.el-image-viewer__progress{bottom:90px;color:#fff;cursor:default;left:50%;transform:translateX(-50%)}.el-image-viewer__prev{left:40px}.el-image-viewer__next,.el-image-viewer__prev{background-color:var(--el-text-color-regular);border-color:#fff;color:#fff;font-size:24px;height:44px;top:50%;transform:translateY(-50%);width:44px}.el-image-viewer__next{right:40px;text-indent:2px}.el-image-viewer__close{background-color:var(--el-text-color-regular);border-color:#fff;color:#fff;font-size:24px;height:44px;width:44px}.el-image-viewer__mask{background:#000;height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%}.el-image-viewer-parent--hidden{overflow:hidden}.viewer-fade-enter-active{animation:viewer-fade-in var(--el-transition-duration)}.viewer-fade-leave-active{animation:viewer-fade-out var(--el-transition-duration)}@keyframes viewer-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes viewer-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}.tabs[data-v-4e00471a]{display:flex;align-items:center;justify-content:center;gap:8px}.title[data-v-4e00471a]{display:flex;align-items:center;gap:8px;font-size:1.1em;font-weight:700;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);padding:5px 12px;border-radius:10px;background:linear-gradient(135deg,rgba(99,102,241,.08),rgba(139,92,246,.05));border:1px solid rgba(99,102,241,.15)}.title[data-v-4e00471a]:hover{background:linear-gradient(135deg,rgba(99,102,241,.15),rgba(139,92,246,.1));border-color:rgba(99,102,241,.25);transform:translateY(-1px)}.title .fa-images[data-v-4e00471a]{font-size:1em;color:var(--el-color-primary);background:linear-gradient(135deg,#6366f1,#8b5cf6);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.tabs-dropdown[data-v-4e00471a]{display:flex;align-items:center}.tabs-dropdown-link[data-v-4e00471a]{cursor:pointer;font-size:1.3em;transition:all .3s ease;color:var(--admin-container-color);padding:5px 8px;border-radius:8px;background:transparent}.tabs-dropdown-link.rotate-up[data-v-4e00471a],.tabs-dropdown-link[data-v-4e00471a]:hover{background:rgba(99,102,241,.1);color:var(--el-color-primary)}@media (max-width:768px){.tabs[data-v-4e00471a]{gap:6px}.title[data-v-4e00471a]{font-size:1em;padding:3px 8px;gap:5px}.tabs-dropdown-link[data-v-4e00471a]{font-size:1.1em;padding:3px 6px}.tabs-language-switcher[data-v-4e00471a]{--lang-icon-size:1.1em;padding:3px}}.tabs-language-switcher[data-v-4e00471a]{--lang-icon-size:1.3em;--lang-icon-color:var(--admin-theme-toggle-color);transition:color .3s ease;padding:5px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{background-color:#fff;border:1px solid var(--el-border-color-lighter);border-radius:2px;box-shadow:var(--el-box-shadow-light);box-sizing:border-box}.el-table-filter__list{list-style:none;margin:0;min-width:100px;outline:none;padding:5px 0}.el-table-filter__list-item{cursor:pointer;font-size:var(--el-font-size-base);line-height:36px;outline:none;padding:0 10px}.el-table-filter__list-item:focus,.el-table-filter__list-item:hover{background-color:var(--el-color-primary-light-9);color:var(--el-color-primary)}.el-table-filter__list-item.is-active{background-color:var(--el-color-primary);color:#fff}.el-table-filter__multiple{outline:none}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid var(--el-border-color-lighter);padding:8px}.el-table-filter__bottom button{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-small);margin:0;outline:none;padding:0 3px;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table-filter__bottom button:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table-filter__bottom button:hover{color:var(--el-color-primary)}.el-table-filter__bottom button.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{align-items:center;display:flex;height:unset;margin-bottom:12px;margin-left:5px;margin-right:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-dropdown__popper.el-popper.tabs-dropdown-popper{border-radius:12px;border:none;background-color:var(--tabs-dropdown-popper-bg-color);backdrop-filter:blur(10px);box-shadow:var(--tabs-dropdown-popper-shadow)}.el-dropdown__popper.el-popper.tabs-dropdown-popper .el-dropdown-menu{border:none;background:none}.el-dropdown__popper.el-popper.tabs-dropdown-popper .el-dropdown-menu__item{border:none;background:none;font-size:16px;font-weight:700;transition:font-size .3s ease}.el-dropdown__popper.el-popper.tabs-dropdown-popper .el-dropdown-menu__item:hover{font-size:18px} \ No newline at end of file diff --git a/frontend-dist/css/833.95983fa6.css.gz b/frontend-dist/css/833.95983fa6.css.gz deleted file mode 100644 index 74901a976f04ed35fc71ae18b9f66669532af851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4320 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 O0sk+*1GSY?WB>qDd~tmM diff --git a/frontend-dist/css/915.52b943c1.css b/frontend-dist/css/915.52b943c1.css new file mode 100644 index 00000000..5536d9dd --- /dev/null +++ b/frontend-dist/css/915.52b943c1.css @@ -0,0 +1 @@ +.el-header{--el-header-padding:0 20px;--el-header-height:60px;box-sizing:border-box;flex-shrink:0;height:var(--el-header-height);padding:var(--el-header-padding)}.language-switcher[data-v-08567d0a]{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:all .3s ease}.lang-icon[data-v-08567d0a]{font-size:var(--lang-icon-size,1.5em);color:var(--lang-icon-color,var(--theme-toggle-color))}.el-table{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-bg-color);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-bg-color);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px rgba(0,0,0,.15);--el-table-fixed-right-column:inset -10px 0 10px -10px rgba(0,0,0,.15);--el-table-index:var(--el-index-normal);background-color:var(--el-table-bg-color);box-sizing:border-box;color:var(--el-table-text-color);font-size:var(--el-font-size-base);height:fit-content;max-width:100%;overflow:hidden;position:relative;width:100%}.el-table__inner-wrapper{display:flex;flex-direction:column;height:100%;position:relative}.el-table__inner-wrapper:before{bottom:0;height:1px;left:0}.el-table tbody:focus-visible{outline:none}.el-table.has-footer.el-table--fluid-height tr:last-child td.el-table__cell,.el-table.has-footer.el-table--scrollable-y tr:last-child td.el-table__cell{border-bottom-color:transparent}.el-table__empty-block{align-items:center;display:flex;justify-content:center;left:0;min-height:60px;position:sticky;text-align:center;width:100%}.el-table__empty-text{color:var(--el-text-color-secondary);line-height:60px;width:50%}.el-table__expand-column .cell{padding:0;text-align:center;-webkit-user-select:none;user-select:none}.el-table__expand-icon{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);color:var(--el-text-color-regular);cursor:pointer;font-size:12px;height:23px;line-height:12px;margin:0;outline:none;padding:0;transition:transform var(--el-transition-duration-fast) ease-in-out;width:min(23px,100%)}.el-table__expand-icon:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:-2px}.el-table__expand-icon--expanded{transform:rotate(90deg)}.el-table__expand-icon>.el-icon{font-size:12px}.el-table__expanded-cell{background-color:var(--el-table-expanded-cell-bg-color)}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-bottom:0;border-right:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--fit .el-table__inner-wrapper:before{width:100%}.el-table thead{color:var(--el-table-header-text-color)}.el-table thead th{font-weight:600}.el-table thead.is-group th.el-table__cell{background:var(--el-fill-color-light)}.el-table .el-table__cell{box-sizing:border-box;min-width:0;padding:8px 0;position:relative;text-align:left;text-overflow:ellipsis;vertical-align:middle;z-index:var(--el-table-index)}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{border-bottom-width:0;border-right-width:0;padding:0;width:15px}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table .cell{box-sizing:border-box;line-height:23px;overflow:hidden;overflow-wrap:break-word;padding:0 12px;text-overflow:ellipsis;white-space:normal}.el-table .cell.el-tooltip{min-width:50px;white-space:nowrap}.el-table--large{font-size:var(--el-font-size-base)}.el-table--large .el-table__cell{padding:12px 0}.el-table--large .cell{padding:0 16px}.el-table--default{font-size:var(--el-font-size-base)}.el-table--default .el-table__cell{padding:8px 0}.el-table--default .cell{padding:0 12px}.el-table--small{font-size:var(--el-font-size-extra-small)}.el-table--small .el-table__cell{padding:4px 0}.el-table--small .cell{padding:0 8px}.el-table tr{background-color:var(--el-table-tr-bg-color)}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:var(--el-table-border)}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{background-color:var(--el-table-header-bg-color)}.el-table th.el-table__cell>.cell.highlight{color:var(--el-color-primary)}.el-table th.el-table__cell.required>div:before{background:#ff4d51;border-radius:50%;content:"";display:inline-block;height:8px;margin-right:5px;vertical-align:middle;width:8px}.el-table td.el-table__cell div{box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table--border .el-table__inner-wrapper:after,.el-table--border:after,.el-table--border:before,.el-table__inner-wrapper:before{background-color:var(--el-table-border-color);content:"";position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table--border .el-table__inner-wrapper:after{height:1px;left:0;top:0;width:100%;z-index:calc(var(--el-table-index) + 2)}.el-table--border:before{height:100%;left:0;top:-1px;width:1px}.el-table--border:after{height:100%;right:0;top:-1px;width:1px}.el-table--border .el-table__inner-wrapper{border-bottom:none;border-right:none}.el-table--border .el-table__footer-wrapper{flex-shrink:0;position:relative}.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:var(--el-table-border);border-bottom-width:1px}.el-table--border th.el-table__cell{border-bottom:var(--el-table-border)}.el-table--hidden{visibility:hidden}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__body-wrapper tr td.el-table-fixed-column--left,.el-table__body-wrapper tr td.el-table-fixed-column--right,.el-table__body-wrapper tr th.el-table-fixed-column--left,.el-table__body-wrapper tr th.el-table-fixed-column--right,.el-table__footer-wrapper tr td.el-table-fixed-column--left,.el-table__footer-wrapper tr td.el-table-fixed-column--right,.el-table__footer-wrapper tr th.el-table-fixed-column--left,.el-table__footer-wrapper tr th.el-table-fixed-column--right,.el-table__header-wrapper tr td.el-table-fixed-column--left,.el-table__header-wrapper tr td.el-table-fixed-column--right,.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background:inherit;position:sticky!important;z-index:calc(var(--el-table-index) + 1)}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{bottom:-1px;box-shadow:none;content:"";overflow-x:hidden;overflow-y:hidden;pointer-events:none;position:absolute;top:0;touch-action:none;width:10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before{left:-10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{right:-10px}.el-table__body-wrapper tr td.el-table__fixed-right-patch,.el-table__body-wrapper tr th.el-table__fixed-right-patch,.el-table__footer-wrapper tr td.el-table__fixed-right-patch,.el-table__footer-wrapper tr th.el-table__fixed-right-patch,.el-table__header-wrapper tr td.el-table__fixed-right-patch,.el-table__header-wrapper tr th.el-table__fixed-right-patch{background:#fff;position:sticky!important;right:0;z-index:calc(var(--el-table-index) + 1)}.el-table__header-wrapper{flex-shrink:0}.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body,.el-table__footer,.el-table__header{border-collapse:separate;table-layout:fixed}.el-table__header-wrapper{overflow:hidden}.el-table__header-wrapper tbody td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__footer-wrapper{flex-shrink:0;overflow:hidden}.el-table__footer-wrapper tfoot td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__body-wrapper .el-table-column--selection>.cell,.el-table__header-wrapper .el-table-column--selection>.cell{align-items:center;display:inline-flex;height:23px}.el-table__body-wrapper .el-table-column--selection .el-checkbox,.el-table__header-wrapper .el-table-column--selection .el-checkbox{height:unset}.el-table.is-scrolling-left .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-left.el-table--border .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:var(--el-table-border)}.el-table.is-scrolling-left th.el-table-fixed-column--left{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-right th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-middle .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-none .el-table-fixed-column--left.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--left.is-last-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-last-column:before{box-shadow:none}.el-table.is-scrolling-none th.el-table-fixed-column--left,.el-table.is-scrolling-none th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body-wrapper{flex:1;overflow:hidden;position:relative}.el-table__body-wrapper .el-scrollbar__bar{z-index:calc(var(--el-table-index) + 2)}.el-table .caret-wrapper{align-items:center;appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-flex;flex-direction:column;height:14px;margin:0;outline:none;overflow:initial;padding:0;position:relative;transition:transform var(--el-transition-duration-fast) ease-in-out;vertical-align:middle;width:24px}.el-table .caret-wrapper:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table .sort-caret{border:5px solid transparent;height:0;left:7px;position:absolute;width:0}.el-table .sort-caret.ascending{border-bottom-color:var(--el-text-color-placeholder);top:-5px}.el-table .sort-caret.descending{border-top-color:var(--el-text-color-placeholder);bottom:-3px}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--el-color-primary)}.el-table .descending .sort-caret.descending{border-top-color:var(--el-color-primary)}.el-table .hidden-columns{position:absolute;visibility:hidden;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:var(--el-fill-color-lighter)}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell,.el-table__body tr>td.hover-cell{background-color:var(--el-table-row-hover-bg-color)}.el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table.el-table--scrollable-y .el-table__body-header{position:sticky;top:0;z-index:calc(var(--el-table-index) + 2)}.el-table.el-table--scrollable-y .el-table__body-footer{bottom:0;position:sticky;z-index:calc(var(--el-table-index) + 2)}.el-table__column-resize-proxy{border-left:var(--el-table-border);bottom:0;left:200px;position:absolute;top:0;width:0;z-index:calc(var(--el-table-index) + 9)}.el-table__column-filter-trigger{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-block;margin:0;outline:none;padding:0;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table__column-filter-trigger:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table__column-filter-trigger i{color:var(--el-color-info);font-size:14px;vertical-align:middle}.el-table__border-left-patch{height:100%;top:0;width:1px}.el-table__border-bottom-patch,.el-table__border-left-patch{background-color:var(--el-table-border-color);left:0;position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table__border-bottom-patch{height:1px}.el-table__border-right-patch{background-color:var(--el-table-border-color);height:100%;position:absolute;top:0;width:1px;z-index:calc(var(--el-table-index) + 2)}.el-table--enable-row-transition .el-table__body td.el-table__cell{transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;text-align:center;width:20px}.el-table .el-table.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table:not(.el-table--border) .el-table__cell{border-right:none}.el-table:not(.el-table--border)>.el-table__inner-wrapper:after{content:none}.el-image__error,.el-image__inner,.el-image__placeholder,.el-image__wrapper{height:100%;width:100%}.el-image{display:inline-block;overflow:hidden;position:relative}.el-image__inner{opacity:1;vertical-align:top}.el-image__inner.is-loading{opacity:0}.el-image__wrapper{left:0;position:absolute;top:0}.el-image__error,.el-image__placeholder{background:var(--el-fill-color-light)}.el-image__error{align-items:center;color:var(--el-text-color-placeholder);display:flex;font-size:14px;justify-content:center;vertical-align:middle}.el-image__preview{cursor:pointer}.el-image-viewer__wrapper{bottom:0;left:0;position:fixed;right:0;top:0}.el-image-viewer__wrapper:focus{outline:none!important}.el-image-viewer__btn{align-items:center;border-radius:50%;box-sizing:border-box;cursor:pointer;display:flex;justify-content:center;opacity:.8;position:absolute;-webkit-user-select:none;user-select:none;z-index:1}.el-image-viewer__btn .el-icon{cursor:pointer}.el-image-viewer__close{font-size:40px;height:40px;right:40px;top:40px;width:40px}.el-image-viewer__canvas{align-items:center;display:flex;height:100%;justify-content:center;position:static;-webkit-user-select:none;user-select:none;width:100%}.el-image-viewer__actions{background-color:var(--el-text-color-regular);border-color:#fff;border-radius:22px;bottom:30px;height:44px;left:50%;padding:0 23px;transform:translateX(-50%)}.el-image-viewer__actions__inner{align-items:center;color:#fff;cursor:default;display:flex;font-size:23px;gap:22px;height:100%;justify-content:space-around;padding:0 6px;width:100%}.el-image-viewer__actions__divider{margin:0 -6px}.el-image-viewer__progress{bottom:90px;color:#fff;cursor:default;left:50%;transform:translateX(-50%)}.el-image-viewer__prev{left:40px}.el-image-viewer__next,.el-image-viewer__prev{background-color:var(--el-text-color-regular);border-color:#fff;color:#fff;font-size:24px;height:44px;top:50%;transform:translateY(-50%);width:44px}.el-image-viewer__next{right:40px;text-indent:2px}.el-image-viewer__close{background-color:var(--el-text-color-regular);border-color:#fff;color:#fff;font-size:24px;height:44px;width:44px}.el-image-viewer__mask{background:#000;height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%}.el-image-viewer-parent--hidden{overflow:hidden}.viewer-fade-enter-active{animation:viewer-fade-in var(--el-transition-duration)}.viewer-fade-leave-active{animation:viewer-fade-out var(--el-transition-duration)}@keyframes viewer-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes viewer-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}#themeToggle[data-v-5c149ed5]{border:0;cursor:pointer;display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:.375rem;transition-property:background-color,border-color,color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.theme_toggle_circle1[data-v-5c149ed5]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-5c149ed5]{transition:all .5s ease-in-out;fill:var(--admin-theme-toggle-bg-color)}.theme_toggle_svg[data-v-5c149ed5]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--admin-theme-toggle-color)}.dark.theme_toggle_svg[data-v-5c149ed5]{transform:rotate(40deg)}.theme_toggle_g[data-v-5c149ed5]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-5c149ed5],.icon-fade-leave-active[data-v-5c149ed5]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-5c149ed5]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-5c149ed5]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-5c149ed5],.icon-fade-leave-from[data-v-5c149ed5]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-5c149ed5]{display:inline-block}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{background-color:#fff;border:1px solid var(--el-border-color-lighter);border-radius:2px;box-shadow:var(--el-box-shadow-light);box-sizing:border-box}.el-table-filter__list{list-style:none;margin:0;min-width:100px;outline:none;padding:5px 0}.el-table-filter__list-item{cursor:pointer;font-size:var(--el-font-size-base);line-height:36px;outline:none;padding:0 10px}.el-table-filter__list-item:focus,.el-table-filter__list-item:hover{background-color:var(--el-color-primary-light-9);color:var(--el-color-primary)}.el-table-filter__list-item.is-active{background-color:var(--el-color-primary);color:#fff}.el-table-filter__multiple{outline:none}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid var(--el-border-color-lighter);padding:8px}.el-table-filter__bottom button{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-small);margin:0;outline:none;padding:0 3px;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table-filter__bottom button:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table-filter__bottom button:hover{color:var(--el-color-primary)}.el-table-filter__bottom button.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{align-items:center;display:flex;height:unset;margin-bottom:12px;margin-left:5px;margin-right:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.tabs[data-v-74e008d5]{display:flex;align-items:center;justify-content:center;gap:8px}.page-switcher[data-v-74e008d5]{position:relative;display:flex;align-items:center}.title[data-v-74e008d5]{display:flex;align-items:center;gap:8px;font-size:1.1em;font-weight:700;cursor:pointer;transition:background-color .24s ease,border-color .24s ease,transform .24s ease;color:var(--admin-container-color);padding:9px 14px;border-radius:10px;background-color:transparent;border:1px solid transparent;font-family:inherit}.page-switcher.is-open .title[data-v-74e008d5],.title[data-v-74e008d5]:hover{background-color:var(--tabs-switcher-hover-bg);border-color:var(--tabs-switcher-hover-border-color);transform:translateY(-1px)}.title .fa-images[data-v-74e008d5]{font-size:1em;color:var(--el-color-primary)}.page-switcher-trigger[data-v-74e008d5]{-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;white-space:nowrap}.page-switcher-title[data-v-74e008d5]{line-height:1}.page-switcher-arrow[data-v-74e008d5]{font-size:.75em;color:var(--el-color-primary);transition:transform .22s ease}.page-switcher.is-open .page-switcher-arrow[data-v-74e008d5]{transform:rotate(180deg)}.page-options[data-v-74e008d5]{position:absolute;top:calc(100% + 8px);left:0;z-index:1200;display:flex;flex-direction:column;align-items:stretch;gap:3px;min-width:168px;padding:6px;border:1px solid var(--tabs-switcher-border-color);border-radius:14px;background:var(--tabs-dropdown-popper-bg-color);box-shadow:var(--tabs-dropdown-popper-shadow);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);opacity:0;visibility:hidden;transform:translateY(-4px) scale(.98);transform-origin:top left;pointer-events:none;transition:opacity .18s ease,transform .22s ease,visibility .18s ease}.page-options[data-v-74e008d5]:before{content:"";position:absolute;left:0;right:0;top:-8px;height:8px}.page-switcher.is-open .page-options[data-v-74e008d5]{opacity:1;visibility:visible;transform:translateY(0) scale(1);pointer-events:auto}@media (hover:hover) and (pointer:fine){.page-switcher:hover .page-switcher-arrow[data-v-74e008d5]{transform:rotate(180deg)}.page-switcher:hover .page-options[data-v-74e008d5]{opacity:1;visibility:visible;transform:translateY(0) scale(1);pointer-events:auto}}.page-option[data-v-74e008d5]{display:inline-flex;align-items:center;gap:7px;width:100%;height:34px;padding:0 12px;border:none;border-radius:10px;color:var(--admin-container-color);background:transparent;font-size:14px;font-weight:600;font-family:inherit;white-space:nowrap;cursor:pointer;transition:background-color .18s ease,color .18s ease}.page-option.is-active[data-v-74e008d5],.page-option[data-v-74e008d5]:hover{color:var(--el-color-primary);background-color:var(--tabs-switcher-hover-bg)}.page-option-icon[data-v-74e008d5]{width:15px;color:var(--el-color-primary)}@media (max-width:768px){.tabs[data-v-74e008d5]{gap:6px}.title[data-v-74e008d5]{font-size:1em;padding:7px 10px;gap:5px}.page-switcher-title[data-v-74e008d5]{max-width:6em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page-options[data-v-74e008d5]{top:calc(100% + 6px);left:50%;width:min(220px,calc(100vw - 24px));min-width:0;max-width:calc(100vw - 24px);gap:3px;padding:6px;transform:translate(-50%,-4px) scale(.98);transform-origin:top center}.page-options[data-v-74e008d5]:before{top:-6px;height:6px}.page-switcher.is-open .page-options[data-v-74e008d5]{transform:translate(-50%) scale(1)}.page-option[data-v-74e008d5]{justify-content:flex-start;height:32px;padding:0 10px;font-size:12px;gap:6px}.tabs-language-switcher[data-v-74e008d5]{--lang-icon-size:1.1em;padding:3px}}.tabs-language-switcher[data-v-74e008d5]{--lang-icon-size:1.3em;--lang-icon-color:var(--admin-theme-toggle-color);transition:color .3s ease;padding:5px} \ No newline at end of file diff --git a/frontend-dist/css/915.52b943c1.css.gz b/frontend-dist/css/915.52b943c1.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..93571e43f938aa6e05ee58ec54f683f972b0825a GIT binary patch literal 4609 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 literal 0 HcmV?d00001 diff --git a/frontend-dist/css/997.87fa4059.css b/frontend-dist/css/997.87fa4059.css new file mode 100644 index 00000000..860bf7eb --- /dev/null +++ b/frontend-dist/css/997.87fa4059.css @@ -0,0 +1 @@ +.move-dialog-content[data-v-7aaa437c]{padding:0 10px}.move-path-input-container[data-v-7aaa437c]{display:flex;align-items:center;gap:10px}.move-path-input[data-v-7aaa437c]{flex:1}.directory-picker-trigger[data-v-7aaa437c]{flex-shrink:0}.move-dialog-hint[data-v-7aaa437c]{margin-top:12px;font-size:12px;color:var(--el-text-color-secondary)}.move-drawer-content[data-v-7aaa437c]{padding:16px}.move-path-section[data-v-7aaa437c]{margin-bottom:16px}.move-path-label[data-v-7aaa437c]{font-size:14px;font-weight:500;margin-bottom:8px;color:var(--el-text-color-primary)}.move-path-input-row[data-v-7aaa437c]{display:flex;align-items:center;gap:10px}.embedded-tree-section[data-v-7aaa437c]{margin-top:16px;border:1px solid var(--el-border-color-lighter);border-radius:8px;overflow:hidden}.tree-section-header[data-v-7aaa437c]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:var(--el-fill-color-light);border-bottom:1px solid var(--el-border-color-lighter)}.tree-section-title[data-v-7aaa437c]{font-size:14px;font-weight:500}.tree-container[data-v-7aaa437c]{min-height:200px;max-height:300px;overflow-y:auto;padding:8px}.directory-tree[data-v-7aaa437c]{background:transparent}.directory-tree[data-v-7aaa437c] .el-tree-node__content{height:44px;padding:0 8px;border-radius:8px}.tree-node[data-v-7aaa437c]{display:flex;align-items:center;gap:8px;padding:4px 0;width:100%}.tree-node.is-current[data-v-7aaa437c]{color:var(--el-color-primary);font-weight:500}.folder-icon[data-v-7aaa437c]{color:var(--el-color-warning);font-size:16px}.node-label[data-v-7aaa437c]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.error-state[data-v-7aaa437c]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px 20px;text-align:center}.error-icon[data-v-7aaa437c]{font-size:32px;color:var(--el-color-danger)}.error-text[data-v-7aaa437c]{color:var(--el-text-color-secondary);font-size:14px}.drawer-footer[data-v-7aaa437c]{display:flex;gap:12px;padding:0 16px 16px}.footer-btn[data-v-7aaa437c]{flex:1}.move-dialog .el-dialog__body{padding:20px}.move-drawer{border-radius:16px 16px 0 0!important}.move-drawer .el-drawer__header{margin-bottom:0;padding:16px 20px;border-bottom:1px solid var(--el-border-color-lighter)}.move-drawer .el-drawer__body,.move-drawer .el-drawer__footer{padding:0}.mobile-drawer-overlay[data-v-768efd1f]{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.4);z-index:2000;backdrop-filter:blur(4px)}.mobile-drawer[data-v-768efd1f]{position:absolute;top:22vh;left:8px;bottom:8px;width:280px;max-width:calc(85vw - 16px);background:var(--el-bg-color);border-radius:16px;box-shadow:0 8px 32px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1);display:flex;flex-direction:column;overflow:hidden}html.dark .mobile-drawer[data-v-768efd1f]{background:rgba(40,40,45,.98);box-shadow:0 8px 32px rgba(0,0,0,.4),0 2px 8px rgba(0,0,0,.3)}.mobile-drawer-header[data-v-768efd1f]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background:linear-gradient(135deg,rgba(56,189,248,.12),rgba(14,165,233,.08));border-bottom:1px solid var(--el-border-color-lighter)}.mobile-drawer-title[data-v-768efd1f]{font-size:15px;font-weight:600;color:#38bdf8;display:flex;align-items:center;gap:8px}.mobile-drawer-title[data-v-768efd1f]:before{content:"";display:inline-block;width:4px;height:16px;background:linear-gradient(180deg,#38bdf8,rgba(14,165,233,.5));border-radius:2px}.mobile-drawer-close[data-v-768efd1f]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;font-size:16px;color:var(--el-text-color-secondary);cursor:pointer;border-radius:8px;transition:all .2s ease;background:transparent}.mobile-drawer-close[data-v-768efd1f]:active{background:var(--el-fill-color);color:var(--el-text-color-primary)}.mobile-drawer-content[data-v-768efd1f]{flex:1;overflow-y:auto;padding:8px}.mobile-drawer-item[data-v-768efd1f]{display:flex;align-items:center;gap:12px;padding:14px 16px;margin:2px 0;cursor:pointer;transition:all .2s ease;color:var(--el-text-color-primary);border-radius:10px;font-size:14px}.mobile-drawer-item[data-v-768efd1f]:active{background:var(--el-fill-color-light);transform:scale(.98)}.mobile-drawer-item.active[data-v-768efd1f]{background:linear-gradient(135deg,rgba(56,189,248,.2),rgba(14,165,233,.12));color:#38bdf8;font-weight:600}.mobile-drawer-item-icon[data-v-768efd1f]{font-size:18px;width:24px;text-align:center;opacity:.7}.mobile-drawer-item.active .mobile-drawer-item-icon[data-v-768efd1f]{opacity:1;color:#38bdf8}.mobile-drawer-back[data-v-768efd1f]{display:flex;align-items:center;gap:12px;padding:14px 16px;margin:8px 8px;border-radius:10px;background:var(--el-fill-color-lighter);cursor:pointer;transition:all .2s ease;color:var(--el-text-color-secondary);font-size:14px}.mobile-drawer-back[data-v-768efd1f]:active{background:var(--el-fill-color);color:var(--el-text-color-primary);transform:scale(.98)}.drawer-slide-enter-active[data-v-768efd1f]{transition:opacity .3s ease}.drawer-slide-leave-active[data-v-768efd1f]{transition:opacity .2s ease}.drawer-slide-enter-active .mobile-drawer[data-v-768efd1f]{animation:slideInLeft-768efd1f .3s ease-out}.drawer-slide-leave-active .mobile-drawer[data-v-768efd1f]{animation:slideOutLeft-768efd1f .2s ease-in}.drawer-slide-enter-from[data-v-768efd1f],.drawer-slide-leave-to[data-v-768efd1f]{opacity:0}@keyframes slideInLeft-768efd1f{0%{transform:translateX(-100%)}to{transform:translateX(0)}}@keyframes slideOutLeft-768efd1f{0%{transform:translateX(0)}to{transform:translateX(-100%)}}.bottom-sheet-overlay[data-v-62bb601c]{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:9999;display:flex;align-items:flex-end;justify-content:center}.bottom-sheet[data-v-62bb601c]{width:100%;max-width:100%;background:var(--bottom-sheet-bg,hsla(0,0%,100%,.95));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-radius:20px 20px 0 0;max-height:70vh;overflow:hidden;box-shadow:0 -4px 30px rgba(0,0,0,.15);border-top:1px solid var(--bottom-sheet-border,rgba(0,0,0,.05))}html.dark .bottom-sheet[data-v-62bb601c]{--bottom-sheet-bg:rgba(40,44,52,.95);--bottom-sheet-border:hsla(0,0%,100%,.1);box-shadow:0 -4px 30px rgba(0,0,0,.4)}.bottom-sheet-header[data-v-62bb601c]{display:flex;flex-direction:column;align-items:center;gap:12px;padding:16px 20px 12px;border-bottom:1px solid var(--el-border-color-lighter)}.bottom-sheet-handle[data-v-62bb601c]{width:40px;height:4px;background:var(--el-border-color);border-radius:2px}.bottom-sheet-title[data-v-62bb601c]{font-size:16px;font-weight:600;color:var(--el-text-color-primary);text-align:center;max-width:80%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}html.dark .bottom-sheet-title[data-v-62bb601c]{color:#f0f0f0}.bottom-sheet-content[data-v-62bb601c]{padding:12px 16px;padding-bottom:calc(20px + env(safe-area-inset-bottom));display:flex;flex-direction:column;gap:8px}.bottom-sheet-item[data-v-62bb601c]{display:flex;align-items:center;gap:16px;padding:16px 20px;border-radius:14px;cursor:pointer;transition:all .2s ease;background:var(--bottom-sheet-item-bg,rgba(0,0,0,.04));color:var(--el-text-color-primary)}html.dark .bottom-sheet-item[data-v-62bb601c]{--bottom-sheet-item-bg:hsla(0,0%,100%,.08)}.bottom-sheet-item[data-v-62bb601c]:active{transform:scale(.98);background:var(--bottom-sheet-item-active-bg,rgba(0,0,0,.08))}html.dark .bottom-sheet-item[data-v-62bb601c]:active{--bottom-sheet-item-active-bg:hsla(0,0%,100%,.15)}.bottom-sheet-icon[data-v-62bb601c]{font-size:20px;width:28px;text-align:center;color:#38bdf8}.bottom-sheet-danger .bottom-sheet-icon[data-v-62bb601c],.bottom-sheet-danger[data-v-62bb601c]{color:var(--el-color-danger)}.bottom-sheet-enter-active[data-v-62bb601c]{transition:all .3s ease-out}.bottom-sheet-leave-active[data-v-62bb601c]{transition:all .2s ease-in}.bottom-sheet-enter-active .bottom-sheet[data-v-62bb601c]{animation:slideUp-62bb601c .3s ease-out}.bottom-sheet-leave-active .bottom-sheet[data-v-62bb601c]{animation:slideDown-62bb601c .2s ease-in}.bottom-sheet-enter-from[data-v-62bb601c],.bottom-sheet-leave-to[data-v-62bb601c]{opacity:0}.bottom-sheet-enter-from .bottom-sheet[data-v-62bb601c],.bottom-sheet-leave-to .bottom-sheet[data-v-62bb601c]{transform:translateY(100%)}@keyframes slideUp-62bb601c{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes slideDown-62bb601c{0%{transform:translateY(0)}to{transform:translateY(100%)}}.el-tabs{--el-tabs-header-height:40px;display:flex}.el-tabs__header{align-items:center;display:flex;justify-content:space-between;margin:0 0 15px;padding:0;position:relative}.el-tabs__header-vertical{flex-direction:column}.el-tabs__active-bar{background-color:var(--el-color-primary);bottom:0;height:2px;left:0;list-style:none;position:absolute;transition:width var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),transform var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);z-index:1}.el-tabs__active-bar.is-bottom{bottom:auto}.el-tabs__new-tab{align-items:center;border:1px solid var(--el-border-color);border-radius:3px;color:var(--el-text-color-primary);cursor:pointer;display:flex;flex-shrink:0;font-size:12px;height:20px;justify-content:center;line-height:20px;margin:10px 0 10px 10px;text-align:center;transition:all .15s;width:20px}.el-tabs__new-tab .is-icon-plus{height:inherit;transform:scale(.8);width:inherit}.el-tabs__new-tab .is-icon-plus svg{vertical-align:middle}.el-tabs__new-tab:hover{color:var(--el-color-primary)}.el-tabs__new-tab-vertical{margin-left:0}.el-tabs__nav-wrap{flex:1 auto;margin-bottom:-1px;overflow:hidden;position:relative}.el-tabs__nav-wrap:after{background-color:var(--el-border-color-light);bottom:0;content:"";height:2px;left:0;position:absolute;width:100%;z-index:var(--el-index-normal)}.el-tabs__nav-wrap.is-bottom:after{bottom:auto;top:0}.el-tabs__nav-wrap.is-scrollable{box-sizing:border-box;padding:0 20px}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{color:var(--el-text-color-secondary);cursor:pointer;font-size:12px;line-height:44px;position:absolute;text-align:center;width:20px}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{display:flex;float:left;position:relative;transition:transform var(--el-transition-duration);white-space:nowrap;z-index:calc(var(--el-index-normal) + 1)}.el-tabs__nav.is-stretch{display:flex;min-width:100%}.el-tabs__nav.is-stretch>*{flex:1;text-align:center}.el-tabs__item{align-items:center;box-sizing:border-box;color:var(--el-text-color-primary);display:flex;font-size:var(--el-font-size-base);font-weight:500;height:var(--el-tabs-header-height);justify-content:center;list-style:none;padding:0 20px;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:none}.el-tabs__item:focus-visible{border-radius:3px;box-shadow:0 0 2px 2px var(--el-color-primary) inset}.el-tabs__item .is-icon-close{border-radius:50%;margin-left:5px;text-align:center;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs__item .is-icon-close:before{display:inline-block;transform:scale(.9)}.el-tabs__item .is-icon-close:hover{background-color:var(--el-text-color-placeholder);color:#fff}.el-tabs__item.is-active,.el-tabs__item:hover{color:var(--el-color-primary)}.el-tabs__item:hover{cursor:pointer}.el-tabs__item.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-tabs__content{flex-grow:1;overflow:hidden;position:relative}.el-tabs--bottom>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:0}.el-tabs--bottom>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top>.el-tabs__header .el-tabs__item:last-child{padding-right:0}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--card>.el-tabs__header{border-bottom:1px solid var(--el-border-color-light);box-sizing:border-box;height:var(--el-tabs-header-height)}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid var(--el-border-color-light);border-bottom:none;border-radius:4px 4px 0 0;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .is-icon-close{font-size:12px;height:14px;overflow:hidden;position:relative;right:-2px;transform-origin:100% 50%;width:0}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid var(--el-border-color-light);margin-top:-1px;transition:color var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),padding var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .is-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:var(--el-bg-color)}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .is-icon-close{width:14px}.el-tabs--border-card{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:var(--el-fill-color-light);border-bottom:1px solid var(--el-border-color-light);margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{border:1px solid transparent;color:var(--el-text-color-secondary);margin-top:-1px;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{background-color:var(--el-bg-color-overlay);border-left-color:var(--el-border-color);border-right-color:var(--el-border-color);color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:var(--el-disabled-text-color)}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom{flex-direction:column}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid var(--el-border-color)}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-bottom:0;margin-top:-1px}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{bottom:auto;height:auto;top:0;width:2px}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{cursor:pointer;height:30px;line-height:30px;text-align:center;width:100%}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{bottom:0;right:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{bottom:auto;height:100%;top:0;width:2px}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{flex-direction:column}.el-tabs--left .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-left{justify-content:flex-end}.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-right{justify-content:flex-start}.el-tabs--left{flex-direction:row}.el-tabs--left .el-tabs__header.is-left{margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left:after{left:auto;right:0}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left{display:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-bottom:none;border-left:none;border-right:1px solid var(--el-border-color-light);border-top:1px solid var(--el-border-color-light);text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid var(--el-border-color-light);border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left:none;border-right:1px solid #fff}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-radius:4px 0 0 4px;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid var(--el-border-color)}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--left>.el-tabs__content+.el-tabs__header{order:-1}.el-tabs--right .el-tabs__header.is-right{margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid var(--el-border-color-light)}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid var(--el-border-color-light);border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left:1px solid #fff;border-right:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-left:none;border-radius:0 4px 4px 0}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid var(--el-border-color)}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.el-tabs--top{flex-direction:column}.el-tabs--top>.el-tabs__content+.el-tabs__header{order:-1}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{animation:slideInRight-enter var(--el-transition-duration)}.slideInRight-leave{animation:slideInRight-leave var(--el-transition-duration);left:0;position:absolute;right:0}.slideInLeft-enter{animation:slideInLeft-enter var(--el-transition-duration)}.slideInLeft-leave{animation:slideInLeft-leave var(--el-transition-duration);left:0;position:absolute;right:0}@keyframes slideInRight-enter{0%{opacity:0;transform:translateX(100%);transform-origin:0 0}to{opacity:1;transform:translateX(0);transform-origin:0 0}}@keyframes slideInRight-leave{0%{opacity:1;transform:translateX(0);transform-origin:0 0}to{opacity:0;transform:translateX(100%);transform-origin:0 0}}@keyframes slideInLeft-enter{0%{opacity:0;transform:translateX(-100%);transform-origin:0 0}to{opacity:1;transform:translateX(0);transform-origin:0 0}}@keyframes slideInLeft-leave{0%{opacity:1;transform:translateX(0);transform-origin:0 0}to{opacity:0;transform:translateX(-100%);transform-origin:0 0}}.el-alert{--el-alert-padding:8px 16px;--el-alert-border-radius-base:var(--el-border-radius-base);--el-alert-title-font-size:14px;--el-alert-title-with-description-font-size:16px;--el-alert-description-font-size:14px;--el-alert-close-font-size:16px;--el-alert-close-customed-font-size:14px;--el-alert-icon-size:16px;--el-alert-icon-large-size:28px;align-items:center;background-color:var(--el-color-white);border-radius:var(--el-alert-border-radius-base);box-sizing:border-box;display:flex;margin:0;opacity:1;overflow:hidden;padding:var(--el-alert-padding);position:relative;transition:opacity var(--el-transition-duration-fast);width:100%}.el-alert.is-light .el-alert__close-btn{color:var(--el-text-color-placeholder)}.el-alert.is-dark .el-alert__close-btn,.el-alert.is-dark .el-alert__description{color:var(--el-color-white)}.el-alert.is-center{justify-content:center}.el-alert--primary{--el-alert-bg-color:var(--el-color-primary-light-9)}.el-alert--primary.is-light{background-color:var(--el-alert-bg-color)}.el-alert--primary.is-light,.el-alert--primary.is-light .el-alert__description{color:var(--el-color-primary)}.el-alert--primary.is-dark{background-color:var(--el-color-primary);color:var(--el-color-white)}.el-alert--success{--el-alert-bg-color:var(--el-color-success-light-9)}.el-alert--success.is-light{background-color:var(--el-alert-bg-color)}.el-alert--success.is-light,.el-alert--success.is-light .el-alert__description{color:var(--el-color-success)}.el-alert--success.is-dark{background-color:var(--el-color-success);color:var(--el-color-white)}.el-alert--info{--el-alert-bg-color:var(--el-color-info-light-9)}.el-alert--info.is-light{background-color:var(--el-alert-bg-color)}.el-alert--info.is-light,.el-alert--info.is-light .el-alert__description{color:var(--el-color-info)}.el-alert--info.is-dark{background-color:var(--el-color-info);color:var(--el-color-white)}.el-alert--warning{--el-alert-bg-color:var(--el-color-warning-light-9)}.el-alert--warning.is-light{background-color:var(--el-alert-bg-color)}.el-alert--warning.is-light,.el-alert--warning.is-light .el-alert__description{color:var(--el-color-warning)}.el-alert--warning.is-dark{background-color:var(--el-color-warning);color:var(--el-color-white)}.el-alert--error{--el-alert-bg-color:var(--el-color-error-light-9)}.el-alert--error.is-light{background-color:var(--el-alert-bg-color)}.el-alert--error.is-light,.el-alert--error.is-light .el-alert__description{color:var(--el-color-error)}.el-alert--error.is-dark{background-color:var(--el-color-error);color:var(--el-color-white)}.el-alert__content{display:flex;flex-direction:column;gap:4px}.el-alert .el-alert__icon{font-size:var(--el-alert-icon-size);margin-right:8px;width:var(--el-alert-icon-size)}.el-alert .el-alert__icon.is-big{font-size:var(--el-alert-icon-large-size);margin-right:12px;width:var(--el-alert-icon-large-size)}.el-alert__title{font-size:var(--el-alert-title-font-size);line-height:24px}.el-alert__title.with-description{font-size:var(--el-alert-title-with-description-font-size)}.el-alert .el-alert__description{font-size:var(--el-alert-description-font-size);margin:0}.el-alert .el-alert__close-btn{cursor:pointer;font-size:var(--el-alert-close-font-size);opacity:1;position:absolute;right:16px;top:12px}.el-alert .el-alert__close-btn.is-customed{font-size:var(--el-alert-close-customed-font-size);font-style:normal;line-height:24px;top:8px}.el-alert-fade-enter-from,.el-alert-fade-leave-active{opacity:0}.batch-tag-container[data-v-ec3adcfc]{padding:0}.tab-content[data-v-ec3adcfc]{padding:20px}.tab-description[data-v-ec3adcfc]{margin:0 0 15px 0;color:#606266;font-size:14px}.input-section[data-v-ec3adcfc]{position:relative;margin-bottom:20px}.suggestions-panel[data-v-ec3adcfc]{position:absolute;top:100%;left:0;right:0;background:var(--admin-dashboard-tag-suggestion-bg-color);border:1px solid var(--admin-dashboard-tag-suggestion-border-color);border-radius:4px;box-shadow:var(--admin-dashboard-tag-suggestion-box-shadow);max-height:200px;overflow-y:auto;z-index:1000;margin-top:4px}.suggestion-item[data-v-ec3adcfc]{padding:8px 12px;cursor:pointer;transition:background-color .2s}.suggestion-item[data-v-ec3adcfc]:hover{background-color:var(--admin-dashboard-tag-suggestion-item-hover-bg-color)}.common-tags-section[data-v-ec3adcfc],.tags-to-add-section[data-v-ec3adcfc]{margin-bottom:20px}.common-tags-section h4[data-v-ec3adcfc],.tags-to-add-section h4[data-v-ec3adcfc]{margin:0 0 10px 0;font-size:14px;color:#606266}.tags-container[data-v-ec3adcfc]{display:flex;flex-wrap:wrap;gap:8px;min-height:40px}.tag-item[data-v-ec3adcfc]{cursor:default}.empty-message[data-v-ec3adcfc]{color:#909399;font-size:13px;padding:10px 0}.action-buttons[data-v-ec3adcfc]{margin-top:20px;display:flex;justify-content:flex-end}.tag-management-container[data-v-689f94e2]{padding:10px 0}.input-section[data-v-689f94e2]{position:relative;margin-bottom:20px}.suggestions-panel[data-v-689f94e2]{position:absolute;top:100%;left:0;right:0;background:var(--admin-dashboard-tag-suggestion-bg-color);border:1px solid var(--admin-dashboard-tag-suggestion-border-color);border-radius:4px;box-shadow:var(--admin-dashboard-tag-suggestion-box-shadow);max-height:200px;overflow-y:auto;z-index:1000;margin-top:4px}.suggestion-item[data-v-689f94e2]{padding:8px 12px;cursor:pointer;transition:background-color .2s}.suggestion-item[data-v-689f94e2]:hover{background-color:var(--admin-dashboard-tag-suggestion-item-hover-bg-color)}.current-tags-section[data-v-689f94e2],.popular-tags-section[data-v-689f94e2]{margin-bottom:20px}.current-tags-section h4[data-v-689f94e2],.popular-tags-section h4[data-v-689f94e2]{margin:0 0 10px 0;font-size:14px;color:#606266}.tags-container[data-v-689f94e2]{display:flex;flex-wrap:wrap;gap:8px;min-height:40px}.tag-item[data-v-689f94e2]{cursor:default}.tag-item.clickable[data-v-689f94e2]{cursor:pointer;transition:transform .2s}.tag-item.clickable[data-v-689f94e2]:hover{transform:translateY(-2px)}.empty-message[data-v-689f94e2]{color:#909399;font-size:13px;padding:10px 0}.dialog-footer[data-v-689f94e2]{display:flex;justify-content:flex-end}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{justify-content:flex-start;text-align:left}.el-form-item--label-right .el-form-item__label{justify-content:flex-end;text-align:right}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;padding-right:0;text-align:left;width:fit-content}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-select__wrapper,.el-form-item.is-error .el-form-item__content .el-select__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-textarea__inner,.el-form-item.is-error .el-form-item__content .el-textarea__inner.is-focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-form-item__content .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon{display:inline-flex}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;color:var(--el-text-color-primary);font-size:var(--el-font-size-base)}.el-descriptions__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;font-size:14px;line-height:23px;text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{background:var(--el-descriptions-item-bordered-label-background);color:var(--el-text-color-regular);font-weight:700}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}.el-image__error,.el-image__inner,.el-image__placeholder,.el-image__wrapper{height:100%;width:100%}.el-image{display:inline-block;overflow:hidden;position:relative}.el-image__inner{opacity:1;vertical-align:top}.el-image__inner.is-loading{opacity:0}.el-image__wrapper{left:0;position:absolute;top:0}.el-image__error,.el-image__placeholder{background:var(--el-fill-color-light)}.el-image__error{align-items:center;color:var(--el-text-color-placeholder);display:flex;font-size:14px;justify-content:center;vertical-align:middle}.el-image__preview{cursor:pointer}.el-image-viewer__wrapper{bottom:0;left:0;position:fixed;right:0;top:0}.el-image-viewer__wrapper:focus{outline:none!important}.el-image-viewer__btn{align-items:center;border-radius:50%;box-sizing:border-box;cursor:pointer;display:flex;justify-content:center;opacity:.8;position:absolute;-webkit-user-select:none;user-select:none;z-index:1}.el-image-viewer__btn .el-icon{cursor:pointer}.el-image-viewer__close{font-size:40px;height:40px;right:40px;top:40px;width:40px}.el-image-viewer__canvas{align-items:center;display:flex;height:100%;justify-content:center;position:static;-webkit-user-select:none;user-select:none;width:100%}.el-image-viewer__actions{background-color:var(--el-text-color-regular);border-color:#fff;border-radius:22px;bottom:30px;height:44px;left:50%;padding:0 23px;transform:translateX(-50%)}.el-image-viewer__actions__inner{align-items:center;color:#fff;cursor:default;display:flex;font-size:23px;gap:22px;height:100%;justify-content:space-around;padding:0 6px;width:100%}.el-image-viewer__actions__divider{margin:0 -6px}.el-image-viewer__progress{bottom:90px;color:#fff;cursor:default;left:50%;transform:translateX(-50%)}.el-image-viewer__prev{left:40px}.el-image-viewer__next,.el-image-viewer__prev{background-color:var(--el-text-color-regular);border-color:#fff;color:#fff;font-size:24px;height:44px;top:50%;transform:translateY(-50%);width:44px}.el-image-viewer__next{right:40px;text-indent:2px}.el-image-viewer__close{background-color:var(--el-text-color-regular);border-color:#fff;color:#fff;font-size:24px;height:44px;width:44px}.el-image-viewer__mask{background:#000;height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%}.el-image-viewer-parent--hidden{overflow:hidden}.viewer-fade-enter-active{animation:viewer-fade-in var(--el-transition-duration)}.viewer-fade-leave-active{animation:viewer-fade-out var(--el-transition-duration)}@keyframes viewer-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes viewer-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}.detail-actions[data-v-3f80812c]{display:flex;justify-content:right;margin-bottom:10px;flex-wrap:wrap;gap:8px}.detail-action[data-v-3f80812c]{margin-left:0!important}.video-preview[data-v-3f80812c]{max-height:300px;cursor:pointer;-o-object-fit:contain;object-fit:contain}.audio-preview[data-v-3f80812c],.video-preview[data-v-3f80812c]{width:100%;max-width:400px;border-radius:8px}.image-preview[data-v-3f80812c]{width:auto;height:auto;max-width:100%;max-height:300px;border-radius:8px;cursor:pointer}.image-preview[data-v-3f80812c] img{max-width:100%;max-height:300px;-o-object-fit:contain;object-fit:contain}.file-icon-detail[data-v-3f80812c]{font-size:64px;color:var(--el-text-color-secondary)}.preview-section[data-v-3f80812c]{display:flex;justify-content:center;margin-bottom:15px;padding:12px;background:var(--el-fill-color-light);border-radius:8px;min-height:60px}.preview-content[data-v-3f80812c]{display:flex;justify-content:center;align-items:center;width:100%}[data-v-3f80812c] .el-descriptions__content{word-break:break-all;word-wrap:break-word}[data-v-3f80812c] .el-descriptions__content .el-tag,[data-v-3f80812c] .el-descriptions__content .el-tag+span{vertical-align:middle}[data-v-3f80812c] .el-descriptions__label{width:120px!important;min-width:100px!important;max-width:120px!important}[data-v-3f80812c] .el-descriptions__body table{table-layout:fixed}@media (max-width:768px){.detail-actions[data-v-3f80812c]{justify-content:center}}.batch-floating-bar[data-v-4937e2f0]{position:fixed;left:50%;bottom:max(84px,calc(72px + env(safe-area-inset-bottom)));transform:translateX(-50%);z-index:1200;display:flex;align-items:center;gap:6px;max-width:min(720px,calc(100vw - 48px));padding:6px;border:1px solid var(--admin-batch-toolbar-border);border-radius:999px;background:var(--admin-batch-toolbar-bg);box-shadow:var(--admin-batch-toolbar-shadow);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}.batch-selection-summary[data-v-4937e2f0]{display:flex;align-items:center;flex:0 0 auto;padding:0 2px}.batch-selection-count[data-v-4937e2f0]{min-width:18px;height:26px;display:inline-flex;align-items:center;justify-content:center;padding:0 4px;color:var(--admin-batch-clear-color);font-size:14px;font-weight:600;line-height:1}.batch-toolbar-divider[data-v-4937e2f0]{width:1px;height:16px;flex:0 0 auto;border-radius:999px;background:var(--admin-batch-toolbar-border);opacity:.58}.batch-floating-actions[data-v-4937e2f0]{display:flex;align-items:center;gap:4px}.batch-floating-btn[data-v-4937e2f0]{width:36px;height:36px;min-width:36px;margin-left:0!important;padding:0;border:none;border-radius:50%;color:var(--admin-batch-clear-color);background:var(--admin-batch-action-bg);box-shadow:var(--admin-batch-action-shadow);transition:transform .22s ease,box-shadow .22s ease,background-color .22s ease,color .22s ease}.batch-floating-btn[data-v-4937e2f0]:hover{transform:none;background:var(--admin-batch-action-hover-bg);box-shadow:var(--admin-batch-action-hover-shadow)}.batch-floating-btn.danger[data-v-4937e2f0]{color:var(--admin-batch-delete-color)}.batch-floating-btn.ban[data-v-4937e2f0],.batch-floating-btn.tag[data-v-4937e2f0],.batch-floating-btn.white[data-v-4937e2f0]{color:var(--admin-batch-tag-color)}.batch-floating-btn.ghost[data-v-4937e2f0]{color:var(--admin-batch-clear-color)}.batch-floating-icon[data-v-4937e2f0]{width:15px;margin-right:0}.batch-toolbar-enter-active[data-v-4937e2f0],.batch-toolbar-leave-active[data-v-4937e2f0]{transition:opacity .24s ease,transform .28s cubic-bezier(.22,1,.36,1)}.batch-toolbar-enter-from[data-v-4937e2f0],.batch-toolbar-leave-to[data-v-4937e2f0]{opacity:0;transform:translateX(-50%) translateY(12px) scale(.99)}.batch-toolbar-enter-to[data-v-4937e2f0],.batch-toolbar-leave-from[data-v-4937e2f0]{opacity:1;transform:translateX(-50%) translateY(0) scale(1)}@media (max-width:768px){.batch-floating-bar[data-v-4937e2f0]{left:50%;right:auto;bottom:max(76px,calc(64px + env(safe-area-inset-bottom)));transform:translateX(-50%);width:-moz-max-content;width:max-content;max-width:calc(100vw - 24px);gap:4px;padding:5px;border-radius:999px}.batch-selection-summary[data-v-4937e2f0]{padding:0 1px}.batch-selection-count[data-v-4937e2f0]{min-width:16px;height:22px;padding:0 3px;font-size:12px}.batch-toolbar-divider[data-v-4937e2f0]{height:14px}.batch-floating-actions[data-v-4937e2f0]{flex:1;min-width:0;gap:3px;overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none;padding:1px}.batch-floating-actions[data-v-4937e2f0]::-webkit-scrollbar{display:none}.batch-floating-btn[data-v-4937e2f0]{width:32px;height:32px;min-width:32px;padding:0;border-radius:50%}.batch-floating-icon[data-v-4937e2f0]{margin-right:0;width:13px}.batch-toolbar-enter-from[data-v-4937e2f0],.batch-toolbar-leave-to[data-v-4937e2f0]{transform:translateX(-50%) translateY(12px) scale(.99)}.batch-toolbar-enter-to[data-v-4937e2f0],.batch-toolbar-leave-from[data-v-4937e2f0]{transform:translateX(-50%) translateY(0) scale(1)}}.el-container{box-sizing:border-box;display:flex;flex:1;flex-basis:auto;flex-direction:row;min-width:0}.el-container.is-vertical{flex-direction:column}.el-aside{overflow:auto;width:var(--el-aside-width,300px)}.el-aside,.el-footer{box-sizing:border-box;flex-shrink:0}.el-footer{--el-footer-padding:0 20px;--el-footer-height:60px;height:var(--el-footer-height);padding:var(--el-footer-padding)}.el-header{--el-header-padding:0 20px;--el-header-height:60px;flex-shrink:0;height:var(--el-header-height);padding:var(--el-header-padding)}.el-header,.el-main{box-sizing:border-box}.el-main{--el-main-padding:20px;display:block;flex:1;flex-basis:auto;overflow:auto;padding:var(--el-main-padding)}.el-pagination{--el-pagination-font-size:14px;--el-pagination-bg-color:var(--el-fill-color-blank);--el-pagination-text-color:var(--el-text-color-primary);--el-pagination-border-radius:2px;--el-pagination-button-color:var(--el-text-color-primary);--el-pagination-button-width:32px;--el-pagination-button-height:32px;--el-pagination-button-disabled-color:var(--el-text-color-placeholder);--el-pagination-button-disabled-bg-color:var(--el-fill-color-blank);--el-pagination-button-bg-color:var(--el-fill-color);--el-pagination-hover-color:var(--el-color-primary);--el-pagination-font-size-small:12px;--el-pagination-button-width-small:24px;--el-pagination-button-height-small:24px;--el-pagination-button-width-large:40px;--el-pagination-button-height-large:40px;--el-pagination-item-gap:16px;align-items:center;color:var(--el-pagination-text-color);display:flex;font-size:var(--el-pagination-font-size);font-weight:400;white-space:nowrap}.el-pagination .el-input__inner{-moz-appearance:textfield;text-align:center}.el-pagination .el-select{width:128px}.el-pagination .btn-next,.el-pagination .btn-prev{align-items:center;background:var(--el-pagination-bg-color);border:none;border-radius:var(--el-pagination-border-radius);box-sizing:border-box;color:var(--el-pagination-button-color);cursor:pointer;display:flex;font-size:var(--el-pagination-font-size);height:var(--el-pagination-button-height);justify-content:center;line-height:var(--el-pagination-button-height);min-width:var(--el-pagination-button-width);padding:0 4px;text-align:center}.el-pagination .btn-next *,.el-pagination .btn-prev *{pointer-events:none}.el-pagination .btn-next:focus,.el-pagination .btn-prev:focus{outline:none}.el-pagination .btn-next:hover,.el-pagination .btn-prev:hover{color:var(--el-pagination-hover-color)}.el-pagination .btn-next.is-active,.el-pagination .btn-prev.is-active{color:var(--el-pagination-hover-color);cursor:default;font-weight:700}.el-pagination .btn-next.is-active.is-disabled,.el-pagination .btn-prev.is-active.is-disabled{color:var(--el-text-color-secondary);font-weight:700}.el-pagination .btn-next.is-disabled,.el-pagination .btn-next:disabled,.el-pagination .btn-prev.is-disabled,.el-pagination .btn-prev:disabled{background-color:var(--el-pagination-button-disabled-bg-color);color:var(--el-pagination-button-disabled-color);cursor:not-allowed}.el-pagination .btn-next:focus-visible,.el-pagination .btn-prev:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700;width:inherit}.el-pagination>.is-first{margin-left:0!important}.el-pagination>.is-last{margin-right:0!important}.el-pagination .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination__sizes,.el-pagination__total{color:var(--el-text-color-regular);font-weight:400;margin-left:var(--el-pagination-item-gap)}.el-pagination__total[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__jump{align-items:center;color:var(--el-text-color-regular);display:flex;font-weight:400;margin-left:var(--el-pagination-item-gap)}.el-pagination__jump[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__goto{margin-right:8px}.el-pagination__editor{box-sizing:border-box;text-align:center}.el-pagination__editor.el-input{width:56px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination__classifier{margin-left:8px}.el-pagination__rightwrapper{align-items:center;display:flex;flex:1;justify-content:flex-end}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{background-color:var(--el-pagination-button-bg-color);margin:0 4px}.el-pagination.is-background .btn-next.is-active,.el-pagination.is-background .btn-prev.is-active,.el-pagination.is-background .el-pager li.is-active{background-color:var(--el-color-primary);color:var(--el-color-white)}.el-pagination.is-background .btn-next.is-disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.is-disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.is-disabled,.el-pagination.is-background .el-pager li:disabled{background-color:var(--el-disabled-bg-color);color:var(--el-text-color-placeholder)}.el-pagination.is-background .btn-next.is-disabled.is-active,.el-pagination.is-background .btn-next:disabled.is-active,.el-pagination.is-background .btn-prev.is-disabled.is-active,.el-pagination.is-background .btn-prev:disabled.is-active,.el-pagination.is-background .el-pager li.is-disabled.is-active,.el-pagination.is-background .el-pager li:disabled.is-active{background-color:var(--el-fill-color-dark);color:var(--el-text-color-secondary)}.el-pagination.is-background .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li{font-size:var(--el-pagination-font-size-small);height:var(--el-pagination-button-height-small);line-height:var(--el-pagination-button-height-small);min-width:var(--el-pagination-button-width-small)}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){font-size:var(--el-pagination-font-size-small)}.el-pagination--small .el-select{width:100px}.el-pagination--large .btn-next,.el-pagination--large .btn-prev,.el-pagination--large .el-pager li{height:var(--el-pagination-button-height-large);line-height:var(--el-pagination-button-height-large);min-width:var(--el-pagination-button-width-large)}.el-pagination--large .el-select .el-input{width:160px}.el-pager{font-size:0;list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.el-pager,.el-pager li{align-items:center;display:flex}.el-pager li{background:var(--el-pagination-bg-color);border:none;border-radius:var(--el-pagination-border-radius);box-sizing:border-box;color:var(--el-pagination-button-color);cursor:pointer;font-size:var(--el-pagination-font-size);height:var(--el-pagination-button-height);justify-content:center;line-height:var(--el-pagination-button-height);min-width:var(--el-pagination-button-width);padding:0 4px;text-align:center}.el-pager li *{pointer-events:none}.el-pager li:focus{outline:none}.el-pager li.is-active,.el-pager li:hover{color:var(--el-pagination-hover-color)}.el-pager li.is-active{cursor:default;font-weight:700}.el-pager li.is-active.is-disabled{color:var(--el-text-color-secondary);font-weight:700}.el-pager li.is-disabled,.el-pager li:disabled{background-color:var(--el-pagination-button-disabled-bg-color);color:var(--el-pagination-button-disabled-color);cursor:not-allowed}.el-pager li:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.list-item[data-v-78d34f50]{display:grid;grid-template-columns:50px 60px minmax(180px,1fr) 130px 100px 110px 130px 80px 100px 120px;content-visibility:auto;contain:layout paint style;contain-intrinsic-size:65px;padding:12px 20px;align-items:center;transition:background .2s ease;border-bottom:1px solid var(--el-border-color-lighter);min-width:-moz-fit-content;min-width:fit-content}.list-item[data-v-78d34f50]:last-child{border-bottom:none}.list-item[data-v-78d34f50]:hover{background:var(--el-fill-color-light)}.list-col[data-v-78d34f50]{display:flex;align-items:center}.list-col-checkbox[data-v-78d34f50]{justify-content:center;min-width:40px}.list-col-preview[data-v-78d34f50]{justify-content:center;cursor:pointer}.list-col-name[data-v-78d34f50]{cursor:pointer;overflow:hidden;padding-right:16px;min-width:0}.list-col-name[data-v-78d34f50]:hover{color:#38bdf8}.filename-ellipsis[data-v-78d34f50]{display:flex;max-width:100%;overflow:hidden;align-items:center}.filename-start[data-v-78d34f50]{flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filename-end[data-v-78d34f50]{flex-shrink:0;white-space:nowrap}.list-col-channel-name[data-v-78d34f50],.list-col-channel[data-v-78d34f50],.list-col-date[data-v-78d34f50],.list-col-size[data-v-78d34f50]{font-size:13px;color:var(--el-text-color-secondary)}.list-col-address[data-v-78d34f50]{font-size:13px}.address-box[data-v-78d34f50],.channel-name-box[data-v-78d34f50]{background:var(--el-fill-color-light);border:1px solid var(--el-border-color-lighter);border-radius:4px;padding:4px 8px;font-size:12px;color:var(--el-text-color-secondary);max-width:100%;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:none;-ms-overflow-style:none}.address-box[data-v-78d34f50]{width:85px;font-family:Consolas,Monaco,monospace}.channel-name-box[data-v-78d34f50]{width:70px}.address-box[data-v-78d34f50]::-webkit-scrollbar,.channel-name-box[data-v-78d34f50]::-webkit-scrollbar{display:none}.list-col-tags[data-v-78d34f50]{display:flex;align-items:center;gap:4px;flex-wrap:nowrap;overflow:hidden}.custom-checkbox[data-v-78d34f50]{width:18px;height:18px;border:2px solid var(--el-border-color);border-radius:4px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;background:transparent}.custom-checkbox[data-v-78d34f50]:hover{border-color:#38bdf8}.custom-checkbox.checked[data-v-78d34f50]{background:linear-gradient(135deg,#0ea5e9,#38bdf8);border-color:#38bdf8}.custom-checkbox .check-icon[data-v-78d34f50]{font-size:10px;color:#fff}.color-tag[data-v-78d34f50]{padding:2px 8px;border-radius:10px;font-size:11px;color:#fff;white-space:nowrap;max-width:60px;overflow:hidden;text-overflow:ellipsis;text-shadow:0 1px 2px rgba(0,0,0,.2)}.color-tag-more[data-v-78d34f50]{min-width:30px;text-align:center}.list-empty[data-v-78d34f50]{color:var(--el-text-color-placeholder)}.list-col-actions[data-v-78d34f50]{display:flex;gap:8px;justify-content:flex-end}.list-preview-img[data-v-78d34f50]{width:40px;height:40px;-o-object-fit:cover;object-fit:cover;border-radius:6px}.list-folder-icon[data-v-78d34f50]{font-size:28px;color:var(--el-color-primary)}.list-file-icon[data-v-78d34f50]{font-size:24px;color:var(--el-text-color-secondary)}.list-action-btn[data-v-78d34f50]{width:32px;height:32px;border:none;border-radius:8px;background:var(--el-fill-color);color:var(--el-text-color-regular);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.list-action-btn[data-v-78d34f50]:hover{background:#38bdf8;color:#fff}.list-action-danger[data-v-78d34f50]:hover{background:var(--el-color-danger)}@media (max-width:768px){.list-item[data-v-78d34f50]{grid-template-columns:28px 40px 1fr auto;padding:10px 8px;gap:8px}.list-col-address[data-v-78d34f50],.list-col-channel-name[data-v-78d34f50],.list-col-channel[data-v-78d34f50],.list-col-date[data-v-78d34f50],.list-col-size[data-v-78d34f50],.list-col-tags[data-v-78d34f50]{display:none}.list-col-actions[data-v-78d34f50]{gap:4px}.list-action-btn[data-v-78d34f50]{width:28px;height:28px}.list-col-checkbox[data-v-78d34f50]{width:24px;min-width:24px}}.img-card[data-v-e367e94e]{width:100%;height:22vh;content-visibility:auto;contain:layout paint style;contain-intrinsic-size:260px;background:var(--admin-dashboard-imgcard-bg-color);border-radius:8px;box-shadow:var(--admin-dashboard-imgcard-shadow);overflow:hidden;position:relative;transition:transform .3s ease}.img-card[data-v-e367e94e] .el-card__body{padding:0;height:100%;overflow:hidden}.img-card[data-v-e367e94e] .el-checkbox{position:absolute;top:10px;right:10px;transform:scale(1.5);z-index:10}.img-card[data-v-e367e94e]:hover{transform:scale(1.05)}.image-preview[data-v-e367e94e],.video-preview[data-v-e367e94e]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .4s ease,opacity .3s ease;filter:var(--image-preview-filter)}.video-preview[data-v-e367e94e]{cursor:pointer}.img-card:hover .file-icon[data-v-e367e94e],.img-card:hover .image-preview[data-v-e367e94e],.img-card:hover .video-preview[data-v-e367e94e]{transform:scale(1.03)}.image-preview[data-v-e367e94e]:hover{opacity:.8}.file-short-info[data-v-e367e94e]{position:absolute;z-index:10;top:3px;left:3px;display:flex;gap:5px;align-items:start}.success-tag[data-v-e367e94e]{background-color:rgba(34,139,34,.6);border:1px solid rgba(34,139,34,.7);border-radius:6px}.fail-tag[data-v-e367e94e],.success-tag[data-v-e367e94e]{color:hsla(0,0%,100%,.95);padding:3px 8px;font-size:11px;font-weight:500;height:auto;line-height:1.2;text-shadow:0 1px 2px rgba(0,0,0,.3);backdrop-filter:blur(4px)}.fail-tag[data-v-e367e94e]{background-color:rgba(220,53,69,.6);border:1px solid rgba(220,53,69,.7);border-radius:6px}.primary-tag[data-v-e367e94e]{background-color:rgba(250,82,194,.6);color:hsla(0,0%,100%,.95);border:1px solid rgba(250,82,194,.7);padding:3px 8px;border-radius:6px;font-size:11px;font-weight:500;display:flex;align-items:center;height:auto;line-height:1.2;text-shadow:0 1px 2px rgba(0,0,0,.3);backdrop-filter:blur(4px)}.file-preview[data-v-e367e94e]{display:flex;justify-content:center;align-items:center;width:100%;height:100%}.file-icon[data-v-e367e94e]{opacity:.6;font-size:clamp(40px,4vw,64px);transition:transform .4s ease}.audio-icon[data-v-e367e94e]{color:var(--el-color-primary);opacity:.8}.audio-card-preview[data-v-e367e94e]{cursor:pointer}.card-bottom-overlay[data-v-e367e94e]{position:absolute;bottom:0;left:0;right:0;background:linear-gradient(transparent,rgba(0,0,0,.7));padding:clamp(15px,2.5vh,30px) clamp(6px,1vw,12px) clamp(5px,.8vh,10px);display:flex;flex-direction:column;gap:clamp(3px,.5vh,6px);z-index:10}.file-name-row[data-v-e367e94e]{display:flex;align-items:center;justify-content:center}.file-name[data-v-e367e94e]{color:#fff;font-size:clamp(10px,1.1vw,14px);text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;text-shadow:0 1px 3px rgba(0,0,0,.5)}.action-bar[data-v-e367e94e]{display:flex;justify-content:space-between;align-items:center;opacity:0;transform:translateY(4px);transition:all .25s cubic-bezier(.4,0,.2,1);pointer-events:none}.el-card:hover .action-bar[data-v-e367e94e]{opacity:1;transform:translateY(0);pointer-events:auto}.action-bar-left[data-v-e367e94e],.action-bar-right[data-v-e367e94e]{display:flex;align-items:center;gap:clamp(3px,.4vw,6px)}.action-btn[data-v-e367e94e]{width:clamp(24px,2.5vw,28px);height:clamp(24px,2.5vw,28px);border:none;border-radius:clamp(5px,.6vw,8px);background:hsla(0,0%,100%,.15);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;font-size:clamp(11px,1.1vw,14px)}.action-btn[data-v-e367e94e]:hover{background:hsla(0,0%,100%,.25);transform:scale(1.08)}.action-btn[data-v-e367e94e]:active{transform:scale(.95)}.action-btn-danger[data-v-e367e94e]:hover{background:rgba(239,68,68,.6)}@media (max-width:768px){.action-bar[data-v-e367e94e]{display:none!important}}@keyframes skeleton-shimmer-e367e94e{0%{background-position:-200% 0}to{background-position:200% 0}}.skeleton-wrapper[data-v-e367e94e]{width:100%;height:100%;background:linear-gradient(90deg,var(--skeleton-bg-color) 25%,color-mix(in srgb,var(--skeleton-bg-color) 70%,var(--skeleton-shimmer-color)) 50%,var(--skeleton-bg-color) 75%);background-size:200% 100%;animation:skeleton-shimmer-e367e94e 1.5s ease-in-out infinite}.error-wrapper[data-v-e367e94e]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--skeleton-bg-color);cursor:pointer;gap:8px}.error-icon[data-v-e367e94e]{font-size:32px;color:var(--el-color-warning);opacity:.7}.error-text[data-v-e367e94e]{font-size:12px;color:var(--el-text-color-secondary)}.img-card[data-v-5f22ef48]{width:100%;height:22vh;content-visibility:auto;contain:layout paint style;contain-intrinsic-size:260px;background:var(--admin-dashboard-imgcard-bg-color);border-radius:8px;box-shadow:var(--admin-dashboard-imgcard-shadow);overflow:hidden;position:relative;transition:transform .3s ease}.img-card[data-v-5f22ef48] .el-card__body{padding:0;height:100%;overflow:hidden}.img-card[data-v-5f22ef48] .el-checkbox{position:absolute;top:10px;right:10px;transform:scale(1.5);z-index:10}.img-card[data-v-5f22ef48]:hover{transform:scale(1.05)}.folder-card[data-v-5f22ef48]{cursor:pointer}.folder-icon[data-v-5f22ef48]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;color:var(--el-color-primary)}.folder-icon-svg[data-v-5f22ef48]{font-size:clamp(40px,4vw,64px);transition:transform .4s ease}.img-card:hover .folder-icon-svg[data-v-5f22ef48]{transform:scale(1.03)}.card-bottom-overlay[data-v-5f22ef48]{position:absolute;bottom:0;left:0;right:0;background:linear-gradient(transparent,rgba(0,0,0,.7));padding:clamp(15px,2.5vh,30px) clamp(6px,1vw,12px) clamp(5px,.8vh,10px);display:flex;flex-direction:column;gap:clamp(3px,.5vh,6px);z-index:10}.file-name-row[data-v-5f22ef48]{display:flex;align-items:center;justify-content:center}.file-name[data-v-5f22ef48]{color:#fff;font-size:clamp(10px,1.1vw,14px);text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;text-shadow:0 1px 3px rgba(0,0,0,.5)}.action-bar[data-v-5f22ef48]{display:flex;justify-content:space-between;align-items:center;opacity:0;transform:translateY(4px);transition:all .25s cubic-bezier(.4,0,.2,1);pointer-events:none}.el-card:hover .action-bar[data-v-5f22ef48]{opacity:1;transform:translateY(0);pointer-events:auto}.action-bar-left[data-v-5f22ef48],.action-bar-right[data-v-5f22ef48]{display:flex;align-items:center;gap:clamp(3px,.4vw,6px)}.action-btn[data-v-5f22ef48]{width:clamp(24px,2.5vw,28px);height:clamp(24px,2.5vw,28px);border:none;border-radius:clamp(5px,.6vw,8px);background:hsla(0,0%,100%,.15);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;font-size:clamp(11px,1.1vw,14px)}.action-btn[data-v-5f22ef48]:hover{background:hsla(0,0%,100%,.25);transform:scale(1.08)}.action-btn[data-v-5f22ef48]:active{transform:scale(.95)}.action-btn-danger[data-v-5f22ef48]:hover{background:rgba(239,68,68,.6)}@media (max-width:768px){.action-bar[data-v-5f22ef48]{display:none!important}}@keyframes skeleton-shimmer-5060702c{0%{background-position:-200% 0}to{background-position:200% 0}}@keyframes skeleton-pulse-5060702c{0%,to{opacity:.4}50%{opacity:.8}}.skeleton-card[data-v-5060702c]{width:100%;height:22vh;background:var(--admin-dashboard-imgcard-bg-color);border-radius:12px;box-shadow:var(--admin-dashboard-imgcard-shadow);overflow:hidden;position:relative}.skeleton-image[data-v-5060702c]{width:100%;height:100%;background:linear-gradient(90deg,var(--skeleton-bg-color) 25%,color-mix(in srgb,var(--skeleton-bg-color) 70%,var(--skeleton-shimmer-color)) 50%,var(--skeleton-bg-color) 75%);background-size:200% 100%;animation:skeleton-shimmer-5060702c 1.5s ease-in-out infinite}.skeleton-info[data-v-5060702c]{position:absolute;bottom:0;left:0;right:0;padding:15px;background:linear-gradient(transparent,rgba(0,0,0,.5))}.skeleton-text[data-v-5060702c]{height:14px;width:60%;margin:0 auto;border-radius:4px;background:linear-gradient(90deg,hsla(0,0%,100%,.1) 25%,hsla(0,0%,100%,.25) 50%,hsla(0,0%,100%,.1) 75%);background-size:200% 100%;animation:skeleton-shimmer-5060702c 1.5s ease-in-out infinite}.skeleton-list-item[data-v-5060702c]{animation:skeleton-pulse-5060702c 1.5s ease-in-out infinite}.skeleton-checkbox[data-v-5060702c]{width:18px;height:18px;border-radius:4px;background:var(--skeleton-bg-color)}.skeleton-preview[data-v-5060702c]{width:40px;height:40px;border-radius:6px;background:linear-gradient(90deg,var(--skeleton-bg-color) 25%,color-mix(in srgb,var(--skeleton-bg-color) 70%,var(--skeleton-shimmer-color)) 50%,var(--skeleton-bg-color) 75%);background-size:200% 100%;animation:skeleton-shimmer-5060702c 1.5s ease-in-out infinite}.skeleton-text-long[data-v-5060702c]{width:80%}.skeleton-text-long[data-v-5060702c],.skeleton-text-short[data-v-5060702c]{height:14px;border-radius:4px;background:linear-gradient(90deg,var(--skeleton-bg-color) 25%,color-mix(in srgb,var(--skeleton-bg-color) 70%,var(--skeleton-shimmer-color)) 50%,var(--skeleton-bg-color) 75%);background-size:200% 100%;animation:skeleton-shimmer-5060702c 1.5s ease-in-out infinite}.skeleton-text-short[data-v-5060702c]{width:60px}.skeleton-text-tiny[data-v-5060702c]{height:14px;width:40px;border-radius:4px}.skeleton-tag[data-v-5060702c],.skeleton-text-tiny[data-v-5060702c]{background:linear-gradient(90deg,var(--skeleton-bg-color) 25%,color-mix(in srgb,var(--skeleton-bg-color) 70%,var(--skeleton-shimmer-color)) 50%,var(--skeleton-bg-color) 75%);background-size:200% 100%;animation:skeleton-shimmer-5060702c 1.5s ease-in-out infinite}.skeleton-tag[data-v-5060702c]{height:20px;width:50px;border-radius:10px}.skeleton-actions[data-v-5060702c]{height:28px;width:80px;border-radius:6px;background:var(--skeleton-bg-color)}.list-item[data-v-5060702c]{display:grid;grid-template-columns:50px 60px minmax(180px,1fr) 130px 100px 110px 130px 80px 100px 120px;padding:12px 20px;align-items:center;border-bottom:1px solid var(--el-border-color-lighter)}.list-col[data-v-5060702c]{display:flex;align-items:center}.list-col-checkbox[data-v-5060702c],.list-col-preview[data-v-5060702c]{justify-content:center}@media (max-width:768px){.list-item[data-v-5060702c]{grid-template-columns:28px 40px 1fr auto;padding:10px 8px;gap:8px}.list-col-address[data-v-5060702c],.list-col-channel-name[data-v-5060702c],.list-col-channel[data-v-5060702c],.list-col-date[data-v-5060702c],.list-col-size[data-v-5060702c],.list-col-tags[data-v-5060702c]{display:none}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb:after,.el-breadcrumb:before{content:"";display:table}.el-breadcrumb:after{clear:both}.el-breadcrumb__separator{color:var(--el-text-color-placeholder);font-weight:700;margin:0 9px}.el-breadcrumb__separator.el-icon{font-weight:400;margin:0 6px}.el-breadcrumb__separator.el-icon svg{vertical-align:middle}.el-breadcrumb__item{align-items:center;display:inline-flex;float:left}.el-breadcrumb__inner{color:var(--el-text-color-regular)}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{color:var(--el-text-color-primary);font-weight:700;text-decoration:none;transition:var(--el-transition-color)}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:var(--el-color-primary);cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{color:var(--el-text-color-regular);cursor:text;font-weight:400}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.el-checkbox-group{font-size:0;line-height:0}.filter-dropdown[data-v-c3aeeea0]{flex-shrink:0}.filter-trigger[data-v-c3aeeea0]{cursor:pointer;display:flex;align-items:center}.header-icon[data-v-c3aeeea0]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-c3aeeea0]:hover{color:var(--admin-purple);transform:scale(1.2)}.filter-badge[data-v-c3aeeea0] .el-badge__content{background:linear-gradient(135deg,#0ea5e9,#38bdf8);border:none;font-size:10px;height:16px;line-height:16px;padding:0 5px}.filter-dropdown-menu[data-v-c3aeeea0]{padding:8px 0;min-width:180px;max-height:400px;overflow-y:auto}.filter-section[data-v-c3aeeea0]{padding:8px 12px;border-bottom:1px solid var(--el-border-color-lighter)}.filter-section[data-v-c3aeeea0]:last-of-type{border-bottom:none}.filter-title[data-v-c3aeeea0]{font-size:12px;font-weight:600;color:var(--el-text-color-secondary);margin-bottom:6px}.filter-options[data-v-c3aeeea0],.filter-options[data-v-c3aeeea0] .el-checkbox-group{display:flex;flex-direction:column;gap:2px}.filter-options[data-v-c3aeeea0] .el-checkbox{margin-right:0;height:26px;padding:0 6px;border-radius:4px;transition:all .2s ease}.filter-options[data-v-c3aeeea0] .el-checkbox:hover{background:var(--el-fill-color-light)}.filter-options[data-v-c3aeeea0] .el-checkbox__label{font-size:13px;color:var(--el-text-color-primary)}.filter-options[data-v-c3aeeea0] .el-checkbox__input.is-checked+.el-checkbox__label{color:#0ea5e9}.channel-group-title[data-v-c3aeeea0]{font-size:11px;font-weight:600;color:var(--el-text-color-secondary);text-transform:uppercase;letter-spacing:.5px;padding:4px 6px;margin-top:4px;margin-bottom:2px}.channel-divider[data-v-c3aeeea0]{height:1px;background:var(--el-border-color-lighter);margin:6px 0}.filter-options[data-v-c3aeeea0] .el-checkbox__input.is-checked .el-checkbox__inner{background-color:#0ea5e9;border-color:#0ea5e9}.filter-actions[data-v-c3aeeea0]{padding:10px 12px 6px;display:flex;justify-content:center}.filter-actions .el-button[data-v-c3aeeea0]{width:100%;background:var(--el-fill-color-light);border:1px solid var(--el-border-color);color:var(--el-text-color-regular);border-radius:6px;transition:all .2s ease}.filter-actions .el-button[data-v-c3aeeea0]:hover:not(:disabled){background:linear-gradient(135deg,#0ea5e9,#38bdf8);border-color:#38bdf8;color:#fff}.filter-actions .el-button[data-v-c3aeeea0]:disabled{opacity:.5;cursor:not-allowed}@media (max-width:768px){.filter-dropdown-menu[data-v-c3aeeea0]{min-width:160px;max-height:320px}.filter-section[data-v-c3aeeea0]{padding:6px 10px}.filter-title[data-v-c3aeeea0]{font-size:11px;margin-bottom:4px}.filter-options[data-v-c3aeeea0] .el-checkbox{height:24px;padding:0 4px}.filter-options[data-v-c3aeeea0] .el-checkbox__label{font-size:12px}.header-icon[data-v-c3aeeea0]{font-size:1.2em}}.language-switcher[data-v-08567d0a]{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:all .3s ease}.lang-icon[data-v-08567d0a]{font-size:var(--lang-icon-size,1.5em);color:var(--lang-icon-color,var(--theme-toggle-color))}#themeToggle[data-v-5c149ed5]{border:0;cursor:pointer;display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:.375rem;transition-property:background-color,border-color,color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.theme_toggle_circle1[data-v-5c149ed5]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-5c149ed5]{transition:all .5s ease-in-out;fill:var(--admin-theme-toggle-bg-color)}.theme_toggle_svg[data-v-5c149ed5]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--admin-theme-toggle-color)}.dark.theme_toggle_svg[data-v-5c149ed5]{transform:rotate(40deg)}.theme_toggle_g[data-v-5c149ed5]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-5c149ed5],.icon-fade-leave-active[data-v-5c149ed5]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-5c149ed5]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-5c149ed5]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-5c149ed5],.icon-fade-leave-from[data-v-5c149ed5]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-5c149ed5]{display:inline-block}.tabs[data-v-74e008d5]{display:flex;align-items:center;justify-content:center;gap:8px}.page-switcher[data-v-74e008d5]{position:relative;display:flex;align-items:center}.title[data-v-74e008d5]{display:flex;align-items:center;gap:8px;font-size:1.1em;font-weight:700;cursor:pointer;transition:background-color .24s ease,border-color .24s ease,transform .24s ease;color:var(--admin-container-color);padding:9px 14px;border-radius:10px;background-color:transparent;border:1px solid transparent;font-family:inherit}.page-switcher.is-open .title[data-v-74e008d5],.title[data-v-74e008d5]:hover{background-color:var(--tabs-switcher-hover-bg);border-color:var(--tabs-switcher-hover-border-color);transform:translateY(-1px)}.title .fa-images[data-v-74e008d5]{font-size:1em;color:var(--el-color-primary)}.page-switcher-trigger[data-v-74e008d5]{-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;white-space:nowrap}.page-switcher-title[data-v-74e008d5]{line-height:1}.page-switcher-arrow[data-v-74e008d5]{font-size:.75em;color:var(--el-color-primary);transition:transform .22s ease}.page-switcher.is-open .page-switcher-arrow[data-v-74e008d5]{transform:rotate(180deg)}.page-options[data-v-74e008d5]{position:absolute;top:calc(100% + 8px);left:0;z-index:1200;display:flex;flex-direction:column;align-items:stretch;gap:3px;min-width:168px;padding:6px;border:1px solid var(--tabs-switcher-border-color);border-radius:14px;background:var(--tabs-dropdown-popper-bg-color);box-shadow:var(--tabs-dropdown-popper-shadow);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);opacity:0;visibility:hidden;transform:translateY(-4px) scale(.98);transform-origin:top left;pointer-events:none;transition:opacity .18s ease,transform .22s ease,visibility .18s ease}.page-options[data-v-74e008d5]:before{content:"";position:absolute;left:0;right:0;top:-8px;height:8px}.page-switcher.is-open .page-options[data-v-74e008d5]{opacity:1;visibility:visible;transform:translateY(0) scale(1);pointer-events:auto}@media (hover:hover) and (pointer:fine){.page-switcher:hover .page-switcher-arrow[data-v-74e008d5]{transform:rotate(180deg)}.page-switcher:hover .page-options[data-v-74e008d5]{opacity:1;visibility:visible;transform:translateY(0) scale(1);pointer-events:auto}}.page-option[data-v-74e008d5]{display:inline-flex;align-items:center;gap:7px;width:100%;height:34px;padding:0 12px;border:none;border-radius:10px;color:var(--admin-container-color);background:transparent;font-size:14px;font-weight:600;font-family:inherit;white-space:nowrap;cursor:pointer;transition:background-color .18s ease,color .18s ease}.page-option.is-active[data-v-74e008d5],.page-option[data-v-74e008d5]:hover{color:var(--el-color-primary);background-color:var(--tabs-switcher-hover-bg)}.page-option-icon[data-v-74e008d5]{width:15px;color:var(--el-color-primary)}@media (max-width:768px){.tabs[data-v-74e008d5]{gap:6px}.title[data-v-74e008d5]{font-size:1em;padding:7px 10px;gap:5px}.page-switcher-title[data-v-74e008d5]{max-width:6em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page-options[data-v-74e008d5]{top:calc(100% + 6px);left:50%;width:min(220px,calc(100vw - 24px));min-width:0;max-width:calc(100vw - 24px);gap:3px;padding:6px;transform:translate(-50%,-4px) scale(.98);transform-origin:top center}.page-options[data-v-74e008d5]:before{top:-6px;height:6px}.page-switcher.is-open .page-options[data-v-74e008d5]{transform:translate(-50%) scale(1)}.page-option[data-v-74e008d5]{justify-content:flex-start;height:32px;padding:0 10px;font-size:12px;gap:6px}.tabs-language-switcher[data-v-74e008d5]{--lang-icon-size:1.1em;padding:3px}}.tabs-language-switcher[data-v-74e008d5]{--lang-icon-size:1.3em;--lang-icon-color:var(--admin-theme-toggle-color);transition:color .3s ease;padding:5px}.container[data-v-437b7a30]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0}[data-v-437b7a30] .el-container,[data-v-437b7a30] .el-main{overflow:visible}[data-v-437b7a30] .el-dialog{border-radius:12px;background-color:var(--dialog-bg-color);backdrop-filter:blur(10px);box-shadow:var(--dialog-box-shadow)}.header-content[data-v-437b7a30]{display:flex;justify-content:space-between;align-items:center;padding:10px 24px;background:hsla(0,0%,100%,.72);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border:1px solid hsla(0,0%,100%,.3);border-top:1px solid hsla(0,0%,100%,.5);box-shadow:0 4px 30px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.05),inset 0 1px 0 hsla(0,0%,100%,.4);transition:all .4s cubic-bezier(.4,0,.2,1);border-radius:16px;position:fixed;top:8px;left:50%;transform:translateX(-50%);width:calc(95% - 16px);z-index:2001;min-height:45px}html.dark .header-content[data-v-437b7a30]{background:rgba(30,30,30,.75);border:1px solid hsla(0,0%,100%,.08);border-top:1px solid hsla(0,0%,100%,.12);box-shadow:0 4px 30px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.2),inset 0 1px 0 hsla(0,0%,100%,.05)}@media (max-width:768px){.header-content[data-v-437b7a30]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-437b7a30]{font-size:.95em}.header-content .actions[data-v-437b7a30]{gap:10px}.search-card[data-v-437b7a30] .el-input__inner{height:28px;font-size:.85em;width:50vw}.search-card[data-v-437b7a30] .el-input__wrapper{padding:0 10px}.search-card[data-v-437b7a30] .el-input__inner:focus{width:65vw}}.header-content[data-v-437b7a30]:hover{background:hsla(0,0%,100%,.82);box-shadow:0 8px 40px rgba(0,0,0,.12),0 2px 6px rgba(0,0,0,.08),inset 0 1px 0 hsla(0,0%,100%,.5);transform:translateX(-50%) translateY(-1px)}html.dark .header-content[data-v-437b7a30]:hover{background:rgba(35,35,35,.85);box-shadow:0 8px 40px rgba(0,0,0,.4),0 2px 6px rgba(0,0,0,.3),inset 0 1px 0 hsla(0,0%,100%,.08)}.header-icon[data-v-437b7a30]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-437b7a30]:hover{color:var(--admin-purple);transform:scale(1.2)}.breadcrumb-container[data-v-437b7a30]{display:flex;align-items:center;justify-content:flex-start;gap:12px;padding:0 10px;margin-top:12px;margin-bottom:4px}.breadcrumb-select-button[data-v-437b7a30]{width:32px;height:32px;box-sizing:border-box;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;padding:0;border:1px solid var(--el-border-color-lighter);border-radius:6px;color:#38bdf8;background:var(--el-fill-color-light);box-shadow:var(--admin-dashboard-stats-shadow);cursor:pointer;transition:transform .2s ease,color .2s ease,background-color .2s ease,box-shadow .2s ease}.breadcrumb-select-button[data-v-437b7a30]:hover{color:var(--admin-purple);transform:translateY(-1px);box-shadow:var(--admin-dashboard-stats-hover-shadow)}.breadcrumb-select-icon[data-v-437b7a30]{font-size:14px}@media (max-width:768px){.breadcrumb-container[data-v-437b7a30]{flex-direction:row;align-items:center;gap:8px;padding:0 5px;margin-top:8px;margin-bottom:2px}.breadcrumb-select-button[data-v-437b7a30]{width:28px;height:28px;box-sizing:border-box;border-radius:8px}.breadcrumb-select-icon[data-v-437b7a30]{font-size:12px}}.stats-badge[data-v-437b7a30]{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:var(--el-text-color-secondary);background:var(--el-fill-color-light);padding:4px 10px;border-radius:12px;border:1px solid var(--el-border-color-lighter);transition:all .2s ease;white-space:nowrap;flex-shrink:0;margin-left:auto}.stats-badge[data-v-437b7a30]:hover{background:var(--el-fill-color);color:var(--admin-purple);border-color:var(--admin-purple)}.stats-badge-icon[data-v-437b7a30]{font-size:11px;opacity:.8}@media (max-width:768px){.stats-badge[data-v-437b7a30]{font-size:10px;padding:2px 6px;border-radius:8px}.stats-badge-icon[data-v-437b7a30]{font-size:9px}}.header-content .actions[data-v-437b7a30]{display:flex;align-items:center;gap:15px}@media (max-width:768px){.header-content .actions[data-v-437b7a30]{margin-top:10px}}.header-content .actions i[data-v-437b7a30]{font-size:1.5em;cursor:pointer;transition:color .3s,transform .3s;color:var(--admin-container-color)}.header-content .actions i[data-v-437b7a30]:hover{color:var(--admin-purple);transform:scale(1.2)}.header-content .actions .el-dropdown-link i[data-v-437b7a30]{color:var(--admin-container-color)}.header-content .actions .el-dropdown-link i[data-v-437b7a30]:hover{color:var(--admin-purple)}.header-content .actions .disabled[data-v-437b7a30]{color:#bbb;pointer-events:none}.header-content .actions .enabled[data-v-437b7a30]{color:var(--admin-purple)}.search-area[data-v-437b7a30]{margin-left:auto;margin-right:20px;display:flex;align-items:center;gap:8px}@media (max-width:768px){.search-area[data-v-437b7a30]{margin-right:0;margin-left:0;margin-top:10px;gap:6px}}.search-card[data-v-437b7a30]{display:flex;align-items:center}.search-card[data-v-437b7a30] .el-input__wrapper{border-radius:20px;background:var(--admin-dashboard-search-card-bg-color);box-shadow:var(--admin-dashboard-search-card-box-shadow);transition:background-color .3s}.search-card[data-v-437b7a30] .el-input__inner{width:280px;height:40px;font-size:1.2em;border:none;transition:width .3s;background:none}.search-card[data-v-437b7a30] .el-input__inner::-moz-placeholder{color:var(--el-text-color-placeholder);font-style:italic;font-weight:400;font-size:14px;opacity:.6;letter-spacing:.5px;-moz-transition:all .3s ease;transition:all .3s ease}.search-card[data-v-437b7a30] .el-input__inner::placeholder{color:var(--el-text-color-placeholder);font-style:italic;font-weight:400;font-size:14px;opacity:.6;letter-spacing:.5px;transition:all .3s ease}.search-card[data-v-437b7a30] .el-input__inner:focus::-moz-placeholder{opacity:.4;transform:translateX(5px)}.search-card[data-v-437b7a30] .el-input__inner:focus::placeholder{opacity:.4;transform:translateX(5px)}@media (max-width:768px){.search-card[data-v-437b7a30] .el-input__inner{width:45vw;height:32px;font-size:1em}}.search-card[data-v-437b7a30] .el-input__inner:focus{width:350px}@media (max-width:768px){.search-card[data-v-437b7a30] .el-input__inner:focus{width:55vw}}.search-icon[data-v-437b7a30]{cursor:pointer;color:var(--admin-container-color);transition:all .3s ease;font-size:1.3em;opacity:0;transform:scale(.8);pointer-events:none}.search-card:focus-within .search-icon[data-v-437b7a30]{opacity:1;transform:scale(1);pointer-events:auto}.search-card:focus-within .search-icon[data-v-437b7a30]:hover{color:var(--admin-purple);transform:scale(1.2)}.search-card[data-v-437b7a30] .el-input__suffix{display:flex;align-items:center;right:10px}.main-container[data-v-437b7a30]{display:flex;flex-direction:column;padding:20px 60px;min-height:calc(100vh - 80px);transition:padding-bottom .24s ease}.main-container.has-batch-toolbar[data-v-437b7a30]{padding-bottom:72px}@media (max-width:768px){.main-container[data-v-437b7a30]{margin-top:12vh}.main-container.has-batch-toolbar[data-v-437b7a30]{padding-bottom:86px}}.content[data-v-437b7a30]{display:grid;grid-template-columns:repeat(5,1fr);grid-template-rows:repeat(3,1fr);gap:20px;padding:10px;padding-bottom:0;flex-grow:1;min-height:80vh}.content.is-drag-selecting[data-v-437b7a30],.list-view.is-drag-selecting[data-v-437b7a30]{cursor:crosshair}.content.is-drag-selecting[data-v-437b7a30] .img-card:hover,.content.is-drag-selecting[data-v-437b7a30] .img-card:hover .file-icon,.content.is-drag-selecting[data-v-437b7a30] .img-card:hover .folder-icon-svg,.content.is-drag-selecting[data-v-437b7a30] .img-card:hover .image-preview,.content.is-drag-selecting[data-v-437b7a30] .img-card:hover .video-preview{transform:none}.content.is-drag-selecting[data-v-437b7a30] .image-preview:hover{opacity:1}.content.is-drag-selecting[data-v-437b7a30] .action-btn:hover{transform:none;background:hsla(0,0%,100%,.15)}.list-view.is-drag-selecting[data-v-437b7a30] .list-item:hover{background:transparent}.list-view.is-drag-selecting[data-v-437b7a30] .list-action-btn:hover{color:var(--el-text-color-regular);background:var(--el-fill-color)}.list-view.is-drag-selecting[data-v-437b7a30] .list-action-danger:hover{background:var(--el-fill-color)}.empty-state[data-v-437b7a30]{grid-column:1/-1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;color:var(--admin-container-color);opacity:.6}.empty-icon[data-v-437b7a30]{font-size:64px;margin-bottom:20px;color:var(--admin-container-color);opacity:.3}.empty-text[data-v-437b7a30]{font-size:18px;font-weight:500;margin:0 0 8px 0}.empty-hint[data-v-437b7a30]{font-size:14px;margin:0;opacity:.7}.list-empty[data-v-437b7a30]{padding:80px 20px}@media (max-width:768px){.content[data-v-437b7a30]{grid-template-columns:1fr;grid-template-rows:none}}.list-view[data-v-437b7a30]{display:flex;flex-direction:column;gap:0;background:var(--admin-dashboard-imgcard-bg-color);border-radius:12px;overflow-x:auto;overflow-y:visible;box-shadow:var(--admin-dashboard-imgcard-shadow);margin-top:15px}.list-header[data-v-437b7a30]{display:grid;grid-template-columns:50px 60px minmax(180px,1fr) 130px 100px 110px 130px 80px 100px 120px;padding:12px 20px;background:var(--admin-dashboard-stats-bg);font-weight:600;font-size:13px;color:var(--el-text-color-secondary);border-bottom:1px solid var(--el-border-color-lighter);min-width:-moz-fit-content;min-width:fit-content}.list-col[data-v-437b7a30]{display:flex;align-items:center}.list-col-checkbox[data-v-437b7a30]{justify-content:center;min-width:40px}.custom-checkbox[data-v-437b7a30]{width:18px;height:18px;border:2px solid var(--el-border-color);border-radius:4px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;background:transparent}.custom-checkbox[data-v-437b7a30]:hover{border-color:#38bdf8}.custom-checkbox.checked[data-v-437b7a30],.custom-checkbox.indeterminate[data-v-437b7a30]{background:linear-gradient(135deg,#0ea5e9,#38bdf8);border-color:#38bdf8}.custom-checkbox .check-icon[data-v-437b7a30]{font-size:10px;color:#fff}@media (max-width:768px){.list-header[data-v-437b7a30]{display:none}}.pagination-container[data-v-437b7a30]{display:flex;justify-content:center;align-items:center;margin-top:20px;padding-bottom:20px;gap:15px;position:relative}.pagination-center[data-v-437b7a30]{display:flex;align-items:center;gap:10px}.pagination-container[data-v-437b7a30] .el-pagination{--el-pagination-button-bg-color:var(--admin-dashboard-btn-bg-color);--el-pagination-hover-color:var(--admin-purple)}.pagination-container[data-v-437b7a30] .el-pager li{background:var(--admin-dashboard-btn-bg-color);border-radius:10px;margin:0 4px;min-width:36px;height:36px;line-height:36px;font-weight:500;border:none;box-shadow:var(--admin-dashboard-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1)}.pagination-container[data-v-437b7a30] .el-pager li:hover{color:#38bdf8;transform:translateY(-2px);box-shadow:var(--admin-dashboard-btn-hover-shadow)}.pagination-container[data-v-437b7a30] .el-pager li.is-active{background:linear-gradient(135deg,#0ea5e9,#38bdf8)!important;color:#fff!important;border-radius:10px;box-shadow:var(--admin-dashboard-btn-shadow),0 4px 12px rgba(56,189,248,.3),inset 0 1px 0 hsla(0,0%,100%,.2);transition:all .3s cubic-bezier(.4,0,.2,1)}.pagination-container[data-v-437b7a30] .el-pager li.is-active:hover{transform:translateY(-2px)!important;box-shadow:var(--admin-dashboard-btn-hover-shadow),0 6px 16px rgba(56,189,248,.4),inset 0 1px 0 hsla(0,0%,100%,.2)!important}.pagination-container[data-v-437b7a30] .btn-next,.pagination-container[data-v-437b7a30] .btn-prev{background:var(--admin-dashboard-btn-bg-color)!important;border-radius:10px!important;min-width:36px;height:36px;border:none;box-shadow:var(--admin-dashboard-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1)}.pagination-container[data-v-437b7a30] .btn-next:hover,.pagination-container[data-v-437b7a30] .btn-prev:hover{color:#38bdf8;transform:translateY(-2px);box-shadow:var(--admin-dashboard-btn-hover-shadow)}.pagination-right[data-v-437b7a30]{display:flex;align-items:center;gap:10px;position:absolute;right:0}.page-total[data-v-437b7a30]{font-size:13px;color:var(--el-text-color-secondary);white-space:nowrap}.page-jump[data-v-437b7a30]{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--el-text-color-secondary)}.page-jump .jump-input[data-v-437b7a30]{width:50px}.page-jump .jump-input[data-v-437b7a30] .el-input__wrapper{background:var(--admin-dashboard-btn-bg-color);box-shadow:var(--admin-dashboard-btn-shadow);border-radius:8px;padding:0 8px;height:28px}.page-jump .jump-input[data-v-437b7a30] .el-input__inner{text-align:center;color:var(--el-text-color-primary);height:28px;line-height:28px}.page-jump .jump-btn[data-v-437b7a30]{background:linear-gradient(135deg,#0ea5e9,#38bdf8);border:none;border-radius:8px;padding:0 12px;height:28px;font-size:12px;font-weight:600;color:#fff;box-shadow:0 2px 8px rgba(56,189,248,.3);transition:all .3s ease}.page-jump .jump-btn[data-v-437b7a30]:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(56,189,248,.4)}@media (max-width:768px){.pagination-container[data-v-437b7a30]{flex-direction:column;gap:12px;padding-bottom:15px}.pagination-center[data-v-437b7a30]{order:0}.pagination-right[data-v-437b7a30]{position:static;width:100%;justify-content:center;order:1}.page-jump .jump-input[data-v-437b7a30]{width:45px}}.refresh-btn[data-v-437b7a30]{cursor:pointer;background:var(--admin-dashboard-btn-bg-color);box-shadow:var(--admin-dashboard-btn-shadow);color:#38bdf8;border:none;border-radius:10px;width:36px;height:36px;min-width:36px;padding:0;display:flex;align-items:center;justify-content:center;font-size:14px;transition:all .3s cubic-bezier(.4,0,.2,1)}.refresh-btn[data-v-437b7a30]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-btn-hover-shadow);background:linear-gradient(135deg,#0ea5e9,#38bdf8);color:#fff}.load-more[data-v-437b7a30]{cursor:pointer;background:linear-gradient(135deg,#0ea5e9,#38bdf8);box-shadow:0 4px 15px rgba(56,189,248,.3);color:#fff;border:none;border-radius:10px;height:36px;padding:0 16px;font-weight:500;transition:all .3s cubic-bezier(.4,0,.2,1)}.load-more[data-v-437b7a30]:hover{transform:translateY(-2px);box-shadow:0 6px 20px rgba(56,189,248,.5)}[data-v-437b7a30] .btn-prev{left:8px}[data-v-437b7a30] .btn-next,[data-v-437b7a30] .btn-prev{border-radius:100%;position:fixed;top:50%;scale:1;color:var(--admin-dashboard-btn-color)}[data-v-437b7a30] .btn-next{right:8px}@media (min-width:768px){[data-v-437b7a30] .el-pagination.is-background .btn-next,[data-v-437b7a30] .el-pagination.is-background .btn-prev{background-color:var(--admin-dashboard-btn-bg-color);backdrop-filter:blur(10px);box-shadow:var(--admin-dashboard-btn-shadow);transition:all .3s ease}[data-v-437b7a30] .el-pagination.is-background .btn-next:hover,[data-v-437b7a30] .el-pagination.is-background .btn-prev:hover{transform:translateY(-10%);box-shadow:var(--admin-dashboard-btn-hover-shadow)}}.question-icon[data-v-437b7a30]{margin:0 3px}.breadcrumb[data-v-437b7a30]{height:32px;box-sizing:border-box;display:flex;align-items:center;padding:0 12px;background-color:var(--el-fill-color-light);border-radius:6px;font-size:.95em;box-shadow:var(--admin-dashboard-stats-shadow);transition:all .3s ease}.breadcrumb[data-v-437b7a30]:hover{transform:translateY(-1px);box-shadow:var(--admin-dashboard-stats-hover-shadow)}.breadcrumb-home-icon[data-v-437b7a30]{font-size:14px;color:#38bdf8;transition:color .2s ease}.breadcrumb-home-icon[data-v-437b7a30]:hover{color:var(--admin-purple)}[data-v-437b7a30] .el-breadcrumb__item{cursor:pointer}[data-v-437b7a30] .el-breadcrumb,[data-v-437b7a30] .el-breadcrumb__inner,[data-v-437b7a30] .el-breadcrumb__item,[data-v-437b7a30] .el-breadcrumb__separator{display:inline-flex;align-items:center;height:100%;line-height:32px}[data-v-437b7a30] .el-breadcrumb__inner:hover{color:var(--el-color-primary)}.mobile-directory-trigger[data-v-437b7a30]{display:none;align-items:center;height:28px;box-sizing:border-box;gap:6px;padding:0 10px;background:var(--el-fill-color-light);border-radius:8px;border:1px solid var(--el-border-color-lighter);cursor:pointer;transition:all .2s ease}.mobile-directory-trigger[data-v-437b7a30]:active{background:var(--el-fill-color)}.mobile-directory-icon[data-v-437b7a30]{font-size:12px;color:#38bdf8}.mobile-directory-path[data-v-437b7a30]{display:inline-flex;align-items:center;height:100%;font-size:12px;font-weight:500;line-height:1;color:var(--el-text-color-primary);max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mobile-directory-arrow[data-v-437b7a30]{font-size:8px;color:var(--el-text-color-secondary)}.desktop-only[data-v-437b7a30]{display:block}@media (max-width:768px){.mobile-directory-trigger[data-v-437b7a30]{display:flex}.desktop-only[data-v-437b7a30]{display:none!important}.breadcrumb-container[data-v-437b7a30]{padding:0;margin-left:0}}.drag-select-overlay[data-v-437b7a30]{position:fixed;background:rgba(24,144,255,.1);border:1px solid rgba(24,144,255,.6);pointer-events:none;z-index:9999;border-radius:2px} \ No newline at end of file diff --git a/frontend-dist/css/997.87fa4059.css.gz b/frontend-dist/css/997.87fa4059.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..d067f8146fa15d7c8a4bdc2ec412d1b0e714438e GIT binary patch literal 14389 zcmV-5ILgN#iwFP!000023hjMskL$XT;9t=sI6x~`^2*P4+n8V$yI%&F#R7|6U@}3_ zkZsyljx2d3xw}sc|Mvyo#iuCS=WenIlF9V3$YQZb7ORT&7@g`5lWs7bq~I2>$) z;~r^yY>MjpDq|zCxgHDKL{E8hD5|up&#Up|{I%ZKRhPEKUl9H0wl3>t^^rF(X^P6U zLtl9AW!4chI{F6|nGdgo7;W^w*nZ|Y`;n$`IH z6}5F)>>`0Q{ld^L@nlgGv-W9|?}|%H=30NCW?$Byt7Ea-q3Sk*2&6}p?|L`%pD%4! z?0@iOUbW|Zi_#71J`t*H(-zATA%VS{=<~~z$u;nSml?l7F1Z`^_RyP4`hM|1nQc+YR`Ft zs;;+RG{XBAqh8fJ^#0D4=*keA;i*c#wiG)G><~6}-2c7}z64{;&R)hus-vqDyl;anH}LS7&RAT(az4AFbeS_ zD$C;B7VY};Sac{Qr(#vrpG|(gjZo8IhS}v^A5{tarpsK^)oNRpmy`8W>BkWAm$lHkBCHuPWdO4CY z=ZvtKh%PAwk#4%meZ7KPlAIy>=llDn-u)2Q)dc>Gf7G?iboX&OA<@nTs zE)+WX^ZlK&TkV$1*6^C7D|as^bPbHBl{mjrf=K}g!`T$2xZm-XFY_OQnu{gc@5cK- zUC(t}kX^ekzR+%sudQrdqJ6i@)(ttX*;>pJu(;;1$zQSr|7SFd*MCWiYKOisW2Mb@ zO?}4qLx-Bxro1#Sv-4N1VdcRl-?Vjk=@3C^GWj@CoGAMfQUK*rlO<>7^xxaO+`cU5 zAD>Z5mNvHDU7G_Xy?*1eOB>5$`L6z?JU7C}DS~sJ#7P$6AD7yPal8&-4*H#b>`vuq zmp9*|J`(9`Fv}AB-+3~6TgCy1&s>O4_2tn;3xPu4mExB+EJsC7sVpj#H|YT{2CBN3 z@pQgJhlJocUnJw@TQZp~lhJq*(;vsPWW1Oslj$@WWy?5z;M~Eft0IV)IpBD6O$1qF z8RNIVoh~=K{c;_6^M(z*+Ms>ipev{8Z+;`-7Zs*jx+&}JcXlMO(7*%;U3fDnyv#6# z8PXmK}ybgduiIbS)J>GfG~w?BC0W- zQmC`|F;N87lz@y$;a z1bQXn-4SIv-Cb1fr-06#GgaH21x_q%Nw^k6(B0R~Y1MA?61`y7Y8z%mp?aBgC`Yp~ zwDBa4HKwAm92-`uY-rNp9Ogjo6o5LHcv(bTLvi*!bxun;f zZ7+pv2&|SryrDgEa{v*Z$5I@dn+@KU#SW!}uBmHtgSoSHjYd;Ce+^EF@((l!&cq4_ z;?pZ21`uCRk&_-26C=jeo;x#6;5ZzC$8 zrR@=+PFGJBlg(z4jknKHPv%lRd3$?%bBiBDR7cg$A%Lhjo487w2~bAJKaEqXOn!4n zj%`WM{g&YN$>@zpT{ble3(WC4{Y0DZMVES-XfhkOC}2Go8opk$kE5=Qs9Hpdx#=|1 z)ttE)f|xorIa{3|X_vt6**uP+(&MMBK`^QM%#!(p&}(fSbfr^v9EZ$q7Hb<+RfQyG z_t}BW8;k2g5&8LE9Y#etuXa+A(6=czF>#@M=C}vpC{`sv8Bft$6Q1$WB=6jUp4a(D^ zYRN{%&Eg=lf>0?H+@M74*t)Jwy0C3hU5>*0Cs01}b3!6PZVoD^n8iVwl4~vPleZ6S zaEojihtQHsXExC)WXiO=G4o|Sa9SJ>?-(XaoEwt_LcHxHlTE;lZ&n3D6Y~}5)Bqg? z44K$Ey3VD`%&ma1NwyM@zH1dxQGsKVY~666DCk6|?-JAm&i`{3-$D@`IKqFgKPxas z&m^Ec>smlvo|QvOdDaEH2YJUxeN(o`sDF5&BC0O^0)jgPU*6L$`~JZyQ!7Mv!p+=3 zxjc>8V!mmwltJd3mdPw!&?6T<sio)g((>2*qB^3c=u8{TGG@?Ni#~u+`*FDPL&GpV6}w%D%$}bReEr`l<#8H-~iJB`Mo!V_vmu0>w(UmBq#a}S96q+A= z7}s}L{=s@*4c8#0QH8#`ME&X9ppWZ4FDKezgC~i)sF;k?I79aH!VtYObI#3zux;z< zs&}1tE8Nc9UhwP&a$AeCD7FUC*X;Wv`Xw4`n}jTN*Pw2DR58ZhNYKm1(dqZU<8M1Q zR}kI@vu8V}w(YC{F02w)ti7~3^Pkd9-Xg=lhaWpRh9Qu|ZYHf=$;vtKat}QB)xO?d z+QjxFSC8sThxac5Z|$9a6m3CIrhbDd#v}TWj{ncWRwJUqYhy@GPM#07LFUAKC^_yt z9RX&NAPkBXJxP&tm)iUK;?zrwgrbf?@X{?4s~O z%Xqt@#hiSn1LwbkSqRQr)p$+I`V;K{MDG4aM4dxZe}Y%t{tJ{V{=e4+>`0qe)g9CA zu_$*hlQ@yRyZSt+E4Oax!a*<|W!`oa+CVI1M}dQWfp8??zp2oWH@kZ&q=S3}R#%^& zikkv&Fd%g;m0S8TN?O)4ADzhZ83@VFH0m20|W)!Uu#C((c(N6L!pgmedn??)OC_ z4n8E>9UF)^)|WMr6`07OFyrwQJR8vsf`58=6n*0|ePnhQXzrl`_n4uzbEn(8;loLo zH`aPM2M!u3h*03}x%xbgxwk_cYDl~F-EUlI6fbpi7h;wR$SHY0CAudTcH!ILTRQ9t z8gS*CR}tiVL1qyTultFL*q~YdqW&|vPdb9^4eFzK*7xBBnS|S}=Qt!}aGw!Snw#;q z^S2CB0SC(Db@u{Q!FZ6mIhc?`G|u2r6tiULhA!MBAFo9Skx$1V2qy$8p-ig!PZc%)&EcL-oWv z*0i~G)igNHc4Po|Luoqqx8bYh9~QRM2PXdxnToq%A4uzDY>gbV@inCj#Wfdbpf;$W zzA5@Crnc>ypck^gF~uLg#jv@^cNzX1VeHqRz84-^6OD6(|99kGTG^2lgH?cEH4kcBhYb>bsnXU)LVxruJuS%Zt-J8z(9r+B%`#T{L{8zcKzD z8|ab#gT@acz&+b2Du6dpQ{y1_mp2>;7~lTi@Px-s^@Hb9J~CUL?SCF)eUL>w#@$?l zUxiHChzm2E7ODy{fDF!#eH6H>qh&~8JR!jV1D2m!Ck9N_=+HOCK^?#lHu;BmxeSqi zf<&J{sV7X}k+M#o9;qS16_cJJV6&_4gur8f`bX)TuhPywPTS>8r;Vgfx~V@y6(pBd z$t=d%5J~r{^tEVpcWMCky$zVJ`HJgVCgBzg&rT0mVi& z@I@@ZG$G=bB~|dy_squjym2qq_fph&Re1ajv3DgDhmyN+wNdUlRDe&-<`hF=%O}~v zug>~2EcSq!fp{Q7%R#s>Cu8cq=k3{N*MmneXrsmhhq9b?$3p_Mh!K03+blL@Jo9~x zxj*g3yA7H<%z2uC$gZAWj3*#Emvnp!wo18f8v0tPUNpfb4cqfVsHCHW1ZyH|h^5G| zWK#(-?E0V}9QTJGkSZj&`Bpgdzi(*gYxcw3egG0bi{Go<-OH`+!ZwiO-v>LC=lh{Q z%Jj{9limV^|5JAyH!gjwTiN^}yDlC&mhG4YFmL%k*+V1V$G*Gz+^Yepu95*99_EOU zuh0qq{eO|iQ~AN_<$F_G6U(BRb_0C$KZ|SNNa&sm9QoMeyYGzi5UK?vf&+W`Ef9Iq z!GXK{_9*IRwhy=l**6(TxwfX?Akl)RV_6nuIKWV*>2aj>u=jLgMacoM8VDGmG<-g; z%qXFxN`Ea{ft~X+N#&al;V5~DnvTYgl0Q?BJ&a~90N<2rfCPaU&KBTX47-x-3aOUO z*ZBTfbjNgu+HF&usiTaVNCI?lw9>#5&n*uW`h9z8yZVH79zeto%nE{hDf8xlSe!f# zj<<#7^hB5^Y=y;PMMr!;aW%{aWrb!zYz3yEY*EIraxw@k~xWK9}zEwu|+* zC^8CBc!a!8etLhWE3@gUYglZE3XUdEus}<^&A_I*dKO6?i>~k0l|M+(k~;vw)5blY z9KJ%7Ea_Wp0VAm9aja4Y@j^*F-v*ILadR>OVv>hPaR)6znzoni7PV~%Wm!`zW!bj} zDXT+CJl_UUmUVUw7DQPNBb2g5wXZ|SirZOfia$I^Pz6Nd`Y?!;xTkfDAR?09p%i2( z%tMICnp)||zCB1v9ZKT)HjFW{MD32jg2*b8y$4d3K;-Pc4IXMg+e_BYotrQeZbw4vV&GZusSwThmYY!5p=+9HNvS4%^<8Q1V!DI;$N%y&u%sCJG3I$J@s+Kj*|+m`3FG$uh-ve5R6B$r5MojU~@F=}z9K z-z_)|SpNwAp#C00kZg4X0K8+j_34C51LcR-x$Tk>`P|iMzT3Gsr)?`*z(>bf*a)_U z%7G#dMcNTk&)1E@^_+Y2Iwp}(Br^#w;R6aB&DgO&IJN*=@g3Udml7MDPv`DOdO~fR zACRRvMfNRwo4&olnM`4RNai?|(|D%MrR(adb<&?y_Ry1(t=;}OcrvHF$`9y-DoZW5 z#qw?cHbWDTa+4usWmcg1W6a6|=pW4LQD$W>=ChfV7~y9yD_SJW%B{q>$>?04FJ<2N zo7vfwWdOj2dd9G|d=kTw@Sei3BsiU6@s^`)S!};!2To@n%TAGLpvV>p0LFHSH3cIM z){h-L6ks!ihqCIAYAG!TalI~#7}qOH+0>k9nY1(@p_A;wUj7(#ma}RiLaRv|)+iD` zkZ4=&?GV_XnZ`w`!ML;7LD2HwbPD)!)U(Ax`a7^?Pn_0oWTaGo8_-H#E+J)Teh3Aa zErLgFOD?SU_m8|Rc6o>XbqgM1#k0TYl2X<5np)p1Jj-sVb%M!E^eM10)S0}$6S!BH zVN^*Bmj#01Hix@9Q_~L*{1+FC+LQ5(C(_7VW-*GFN>e?3-gFWS$VR6D-Azha`nIRM zELA#9o=qn*hL=i2v$mQ_`oP#|6x=z8LX-f)E7_QW+tu6Zm}@|m{%T>Mam5O&AG84( zGEEDcbMi($ywX>Rs8pyuF?izANX?Pyv|yIEeIat`-)uP0jH5;#V*^#At_NL!p$QQi zbim?MytdtCBrzivmS23xZ1BEp%`9!CCVF|!t$~Y7QR&Lz zY@#LaFPy#Za@Ld7cJ=vYJ#@Y#?nd@ep1fHiJYH+3cJ0>2tO#&H!JgMp#wX~WuD0j! z`Ye4=#W=(p4E^V&XwXgs=vQ@`w;gJV_Io_ye@Vw(>+ZLHVObfIrw=I$4|>)|B;5Vo zZ&V4-V7voRk`ZbH$RIw%VeviZnOynr?|5aZ-4hQd2Yhaj12UW>nL{L}s=HS| zb!JdW{|VCzv;hoZD+d08fw1F$?~JUDZpJ4hi|dx2*|> zR&gSY(T>U8VFh3B&XeA6NizuW)N(6A%U+znEF)3pghBH#s8QS-nTZtrcB-aU5t{tNxY)v)p9`Hi zsM>1@JY@tLVq>*Ogu|!l#ppqHuN&bPGV`5_rNnFH4QXsWDL!n3(!f!QT{vl_{e**x zf*Ui}>Mj-bW|5P9*xrQ(!iZcPLuCg8;NEip?;DW@REb7o`AUu0g7z0nMhy1(q;!6xkvQhod-_ z+gXB7s6ihE`m~iSA}vz<6*bUq!cutXRNNO|XeT_@G*aqdsKrXDto2XD>0CEm&WtW< zH|!$rtSkvjVL3E&PmxFm<@gR7EiD@*{Y0DZMVDS$)G!Mp&30h?pjOp1CPhsn#IVx0 z0D7$ur6N22yODnquLfCkS@=e15cBFIZ+qEN{I9v*V1+3&AFKK#1rIHPc_#e zCrDsFxCtx~V_Onx_Q?skz$_MGH~5MD{=O?d3aJ3#MBNMP_Bl88p~0b(jFxYi^!l?* zOi*?ZDP^in$0imjEG_*W-8bM*uo5$E%izQ2nAacZy!bJkIcIQ%hZp09xkl9qcM=;b z_;qIIMg5ewFrIAn+f3GSgnrC|na*9eu5WLq)E1wnRB$l!!Lw!{j)q0c$jlnBNm2FX z=zy)2@Ebe8`qK441X&zZOnMVbOm{C?l45gBLaTav6F&ThUNl@ovo~YJf4r!p1mJWV z?NFB&Wy&}RcR!u(m)UYW+4i`flAW)cr|~(kI{|B>nS&{{CZJG(xmukvfydVGOD4n4 zOvmxGPV3E|(Y8zXMYm#}%xm+f+bF;63im)sA0nW zC15d*GIwL3wJx9d$Bl~9;o3JyI7RnGiD*Nr=<`c^&MQZe^AK=Ub!ODS%uO;6wfeI9MQ(DnPtcge&_`de z=o3Vl|EMn=Ri$uZ!jRE57z}Tt`L`9yChwXA%QJE}{iyZ_`&a*=Haw ziK=u$aARBilz+V}XXmekRJMM_#_(SvRDHa(`5p_NC{M|YIy(|^9D77QsUS_VOcj1D zTNU2{3*s%x334i`msfHV5p2d;_VF2|(F~JGKIAL}OLIg*u~^!=E;o52-htFZ`S$i^ zJI+=Bhu9S(r8eY2Q5fp3sn3`*bf{Tv%1iTtZ^2mTQtl>vRjFQu1&{V}!bU)IY5NGQ zx~Kvj2s0pklx=;HY)Fm)&dO2>lamDq-Gg4S7A#y^ra(t$@sPCJ66GRvO|z0f)AAzI zJVHf8HCr2|2bmLOlLLC#;;ei3-oJI&-jgEp(m1u+u@7Hfk%2*H16}2s=5!(FN&c40 zOaEyXx8!2+gJ;PGiJ3~!GI}Y;<460>9BapqoFlwz(nh$lULrxkAI*qC{z?0H5Q&W- zF-oI=$?_1wuqo5lY~nV|M%07H+yk!F*`X43NCYriAZ~JVzKN}2mmk6!lH4QVDAL3T zPW%qXy6wWD!R=_k!;-0!P0Y_)6kDb<8mO{5Nx>UKb<`Zwl38sunXxSjxB0S-wwFz@ zWu+ruMw3Z0PDay3GLG%|;nWm?*mbpuSzoq6EDS`zaDrv$IBK_fiC#u;Zw{m^BiT{1 zV&9iM(LgHW7>#3(a26tC386}+poa3*>w-%(Se}U9koQEPw zVS`Z2FAl-g=Z20*uDAh`2nbxcPqqN}(nO7fnV!Ga`lEl~)edTJhu^v^at4OKV0ukq zZ2K2oV*GDfLnhszWByUpP5LENU-|_jNa2v{Kq!*~P+G0H)F?n|&Y%MX0AO&|!hF;S zB=d3)WRxm*5 zLK`+DL(N^VX-~j49W5ZAbunV+O<5)$ByI5P#BE=l-A$Ga$CyL0#5v zGV7ypKtl?UxFOM(IX^&8L*f;OWdb6#^m~9q5gq9=6dsD zTWMfqL9&=2to>k%z+evtn~1%xC&5do-w>`n7`seo(9jhCMT!ER#-u^4S>^io17GRr zch0qres^W`O3??Zx>iOo*&u=NHybpIuaO&+3=gz|q6QoH+5;XJI|q^FJ)8r93Ls&F z>E0GLCt5!)BtI;>6aw&q&95QPZG%wqB0?4_2-V(30*uF-BH-?f*WrEC^{Q%oT*~?r z?Rxfi`cbq6FIno|=e(KN@0I{L*B)YB(t5vd5vZ+YJ-*y?&3%f6Z<{7os>vC&ZNXHA zqB^3c=(OQ~Pl9G~^(6N*zu5toMADQ@X9sZMz!7YuY1gD zR%lmrwM#qgyZLx`AzU$eXufccWC&u?u0#Hrw&#K~m}D@B`qHT&uKWv-^oYo$Byomg zY|FfDi+v%(g~&46Xh*2ZornW-(Ree}N#MjMUa)VcENN>d3W2+u(T}K!%3{zZA@2s^ zNI5g;;zHdiBDf|I+yP7nmKl3iRgJKzIqqdwm(_swJy*Z0OXv_9`G)rjkvRJ0i!iFb z8As>5sJe)-LjEZ&s;()jw%9UvdflO&zHD0fn>DjOPMA)-kJfjTlg7_i@;sAA2$1g; zd{VN&y2;;H9NW`VPx|i-`6Y0+b?IJzhl8f&2!a|kQcgh9Vl;XI z>5(1+P?evM2}QdY9MwTVsK4rH;D@g8#@|kto85j%!$ENK6qRLhZi}{u&{`mhj-qWH z#1JG8un8Z&;F~2;3G);`axAScZ*nfx&OeO(9GHay3>@Q2hBQ1zLu8j-5$yntS zw(-mzVs|P_Pp#OWKos^jSyp3kX0SKv|p)uG42E)zD*9Kd^|S|DZ1DLP%eGGN0bPM9RMR6vU?Rco?h~ z+HBb6%fn~7%0(2z1K4ebSoQ|I2BiS=In9JKG6(1CpSLOPGj^ezcnC#}p9xVL)Xcf= zU;>XaY1bd|Zi;3^72G#!93Rmbm*+1TOW!MgC4W5vW)gZ=YZtqdhlpsnz;iHx;fyNz z`fhb{C?)SC1!iyz{UP1vjkw;>bn%MbW=P2aAYvRoj!#tUC*t$O$6qM&71P`>!ceo1LH3&;jlF5!lWdIXx0Odt*x_OqsYBP{*+Gr%xix% z2T{(MXEY-mkORo(u_NJv=mn*<#vm8EFh`MAr1R15f7)cWITOKrn6+UuxQ45o7dPT5bbfk z0^6X8A0>*%u`P+1`Ypk`HW|ImrS*PlD%fMquWT;U5*g*E#-mAqY&>|p_6mne$GiNFx z5JNiAJInk>2shI+Nm_~>>#994G$e4TUqP-9N;@2OolHja4;*NQL;2{>IIMR3@tM%@ zKKdJOIa+=k6Pjb?yYtkM9mu0_`JxiM;x z7o-uHIo(UT-hRIcTQ^dg2Xm?&Of1cCXo1g_bI>R@awvP#`A*rZcEfrM zIc1*-R*1xFzvHXhZU9c=;^Q-+ttB7Ouc+}nwq%<8IpzZMFpbs2Wg*Ai9W4Bb{W~wd(zEFsx$^08l{*s=G zua}~V+UBrvH-F8(=^r@}Xp1-8V1i&u5g@1qO)*4(-2n+%<`B-Neyk)bPXuwS~y7EVT1%F_H- zS|h{HLz2cagvuF$2GCs;j8kNHJakaowWYy;+WUb%p5ba`J|F$#9IH!6n<%rBwXnFrS+Xwr{LTU?Xp(J0C ziL9zN&#b<@0FdT+W&&FZV9Q<(=;pYdtK-*-Hwy|7yDtLF45u=uH$0pQ91&NblpMxk z(HP*gDPjFYr%l_OY)+e=cD^RiY18%{I&Ip%L#Iu135junSSN7hnBBIyoHkmWXuVv6 z(sq^aI~Ifue%zpa-QXN*bm4yU8=+y7aw}FCSCZ>}wW+(K_Wk|6Md!T9aT1`w?3;Ra zDU&6OXPw}r%?@pAT8fQYaDctUR<{j=T3c`gIRc%S+GD!)TsmgSPkl*1 z#A;+6FuALjjnHBJT$2y!Z6}Jy{~v$S^Mws2lRUDje>iyJN%0kX)^bEhRzpqV*vyH2 z$#(UpuxV|lIYKDc12skat|<<{ge98~GyB~}EafwN*a2fpE;*W`Q(piVchfaXU5Jd| zT6jC7m=6id+ESS3OLH!f%}zLp1)VnePMUWFOuCf#ldL*+cia~}_*wuLtly(tE(@ig zz??X+s#_pEq3U9;1@DCK^9+^^BLW^MfkzAafe21&J7=S473u8o$1)aYxKPzI5Is@# zKJ9*-ku_MJZ}Fllk#|o{EQOZ>qhDcVy#-i=`m6}nV%VgwL1a1hfv;whfbrFbW38?M zEQF=jNf*nn*zwh)1%!rvChB3H4Zb+|O)*n$iotL!T$(VJU}18CPPf~r%&Wr%2RF5!MYlal zPLwU@i`QM2JH^@i$~-!AuaN{my&2hD@-Cf-GHW>jJ)N0oN`6d;T&*5v*@FDajF#OI zop9Nq!=dEW@#5QW$*=#L{3r|{+wtrT?dE@Cvehbkk}CiUFm2FD2psrtmC1~zuXFq> z(0R{IeMU|9W2N)&1abgs?S=ii;)K)t>@O9Qm>j++ma^!p(Rkk8Mua-=lxFYSqS=;c zY?2AA>h>$rthmYchw)RR|6(0!;vI?X9~BCYZY&iIM_F@VmQ_ZBPHDE0fRmfy(6d-3 z>1aMrMw3^(6X&r-b+c@|+X!bL4Ml^9FiqX%9eSBztG_-2KmH;JRHr#PBBcDht<0f- zm4Jq}5{Ldlr|Qz1&ZACrU|}vfhRqR+IjJn;h*2qhV`S1XmsPI;cx#yAEc^&_J&C#u z$}(Y{pgyB2a?m<){BCHdN?J&~zr+wq$y*?jdYUSNxYdIZ=WC4F28l-docbAAHZ|A- z*uduZeO5@L+W;j@SGIk<*b@0s|2MSES@XhaNZ5~n_MoEn$s6GQYa_+zb>2seo+``E zZ4`uwac_;6jFpk@nv85=A&NskuX_3|`XwSxoXiQzU7)@{(xvSh)NPNV94ORGmO!}o z)TdW>wlC$^*y^G~`U{2WTw^1J;>f3Y?OEGDrA$3=Zw7%Z+-KW*JZG>7=Mo&^v~CJ) z#^~yEgxAUD>b$l|3ge}P)AAbL5-r)VXERw|7|rdaxzpj@mI7}p^V-u6f^#R!+Z|Ap zrL%SUY>Q%|R_AT5dsFiP`QJFot6lWMTCes+h2pDpznEWx5cTDXw?U3Xc~RPH@7DoGZn~W2KUIZ&~uGc8^*PJ*lajgxw}wX$a!_gp-3p zw}*gD(P?ei z+WHJ1kU=pn#NWI@{d%11k}*+HnS1)WdCjM`B*8k{1=XDjQMMOv&ZELq|7%m^WzyzV zo3^Ma_93j?EJtxO5R8-p-HH7>sq`#PG`kcXuy#dW)`zPtuEWkvX$L4tx&=Q&$mE^H z@3F8-v;Au>$z!2)$}`eLlazI@|JR9QIujC)+2$R#U=qRQTaV;x?O}-eIs#K6+mldZ zXS=yVTk=E@5eH2eeKC#`doW`*kCUQmQ5VtgnE`)h#v9Ju;fC7gA@AH=7TywXzoXZA zzzSu{z$F?_Le^;NTBAwd65$|mx75)`1-lB1XS5K)tGvt82;U)Ay;FHH<5$Vd@!AB& zm&Sy*IXdZFfQP5HW=~R0o4Q-0yxAU=kT;dLDW$BT>opjCiA@>YulwUO94aqqs9vlC zv0{~Dm~b}#_`LPZrM~lokFmlXCV1DFXXf3ogCms z-*h!+0*Rk9H?^(G6)7m1MJ$f+vG-}2UF5MM5eu2Rcpr`c%Ic(xr)7@3F@F(S5Uq9U|?1ZR$_oOOxVp z3Qx<@?jbhxu;>Y_9f!rp^>Y{bCPeq6i=p`Unk**3mNqw)RXv+%kk4M&5rfWpV@sIV z#BHy49)4Gj28+E-t@;Bieo`l4A5nvxK5ZTZ{ODO;*OUgz@cr8W`$K^o1?~go-6@*i zHms;&I?$3GI|Ru$vQ>jc&ya^>Y%2_w%ROVkD>L(<85NJnD8fvl`c4FhD?<>vQ(kcm zK#`xspJjHo%>HPpS9xD zP9i-6{V04#KL7*%cm@&5*4pt9228*H)gL!HRQppI&?G3y9vH*-AnWZW4QT#XnQ1#z zPv#PXo~1$a4^^J701Bi#VIhDHbn_0=jA_|N5K}oQ@{*P|E4sWawt6I){x}9QaoZgD z2_7!B&gpYHaI${|^L)}&h(*J)dNO^H-F7f19yxc7HF%g_jx^}3%;q1TiYlr+-rXKC z2~Ba3{i2<++N}AXZV8U=66UaR9(~j3G(th=Usj~9DpG9{ps>nYFpC6<> zi`{(#-6`UPE+8#4-z$O2yrj1gegz7)^VsddLfq!5BB0@2Jj))Vlq7~wmY9dj(LciUsy)pZH7vq?-RH;6amOhFN)TBT|Qx zSVS#G6~bO9=UI*aOFDjT9(VB~nDLZAA#Wc-Hs!eY*=`n==-HuzP5EFjHKEmvvb5M8 zMNSs_3YBqS$D-=`49wEm17@5zOQ;%m4oMhA$m+QQoi~yF@)_?N+m*vI^N1~bmk5Dx zs_aRbMm=S)x##ELWTa3Un2RJ!)Xs9(P5zV8YV}(csNM4r+nqg!)n~smy999HBl_RI z=s0%(pTMtXj;{f>8fT6#3B$pnBrY=|DmzM7>(40vzn17W-Vp97(G8?Uy(Mbj zD(iLhYnJqOzAS*q_MY@^eY}CO&2xUh^QCE}!j!P^+6;heO)QfCgquW(=dvZgGDMC* zyz{XmV}7swGbPHbYkXyF0Tk327UVVSiA>eikhe_uDyI$MakmC zFT@136z~+d4^QHMtuhW*zI#ZdNXOix!Tydv33|uJsB5qI z!?BW)26ylmnF1d01@NOS%5uPhB-9yjEDBf77s+_}mP}^L02ign&t6bTIzxlg7gM3h z&}B_X5+vf@X_8^qPX>^vKXjHDhYEdl$&e0MEgr}Ryn6+F^ss}!rqj;J#%(eKiT5jW z2&J;f@C(fn$Jg+5fFu&5tGm4P3KYR&wlm1)&zIBrzA0$scc;PC$;7zP2>&m&JiA2U zc_t!Wdb?QPO^05q0}g;$vP}9{X^v3$Oo2ZAnAL~^a+E?BEO_19Q2{kno**pSf((~t zM55hI+LOzVRI^cBawjxzvF&PeKQe|)-g_PCK7zhGcIJBm3=`bl)(+?ZD-`ItE+{*s zZk7`$gr5mEg*E?T3nNY)iUf098+g=7fW>XppnZedqkUIudg;$R-J0jDKY-S8w`$j} zbnLxTE!S*&LvCOnS$oB=J8sJL9Sj6!eJksHm!9ed4cP?YoJv2wa|a($c#n4rz;y?_ z&Zb}uSvNNw2CW(ufhU=5n)CSPlSqjt6uvloa;{gT)rggSvxRNpXf5($y&A9kRCD(F z;6doxh|C9q1B=7RIB=is0P81mbNMIR+fftl2Us75#61p_*U6Q5FBzDSelIcnmn@B9 z94wySM*n$1tr2LiKgzE%90v!z&drwnF&}+QT+hK^UwlvYPZ-Fd1+ond(s0T{9uf=^ zgYFBJIMyc=6ezK_D0PZwu`Nc#4ZYW?*1oHaf(BZK{k~pF0NBbMZ>(9BFu-xCV~ z%iJlJ!ioI`2+zZ>XR$if8|*egW!t*>p(nDkTf99udm>J_!m7oK4N1kTmZlySni2M# zGJqs2)8uG>pEn?egw?FI_YMQdIq!~lN87+1))R4~qz?;Ge3g2;;3fBt93;l1m25*c z(k+8cAUo84@9J|}SLF{k9cdOsj|1A^1B90(babsmX<$5>RB;qP`rB;;oKW;i*cM%r v%7sP=)>$&1&5{YuRXVl=(Ho5xRwqvp.el-popper__arrow:before{background:none!important;border:none!important}*,body,html{scrollbar-width:none!important;-ms-overflow-style:none!important}::-webkit-scrollbar,body::-webkit-scrollbar,html::-webkit-scrollbar{display:none!important;width:0!important;height:0!important;background:transparent!important}.os-theme-dark{--os-handle-bg:hsla(0,0%,50%,.5);--os-handle-bg-hover:hsla(0,0%,50%,.7);--os-handle-bg-active:hsla(0,0%,50%,.85)}.dark .os-theme-dark,html.dark .os-theme-dark{--os-handle-bg:hsla(0,0%,71%,.6);--os-handle-bg-hover:hsla(0,0%,71%,.75);--os-handle-bg-active:hsla(0,0%,71%,.9)}.os-theme-dark .os-scrollbar,.os-theme-dark .os-scrollbar-horizontal,.os-theme-dark .os-scrollbar-vertical{--os-size:10px;--os-padding-perpendicular:2px;--os-padding-axis:2px;--os-track-bg:transparent;--os-track-bg-hover:transparent;--os-track-bg-active:transparent}.os-theme-dark .os-scrollbar .os-scrollbar-handle{border-radius:10px!important;transition:background-color .2s ease,opacity .2s ease!important} \ No newline at end of file diff --git a/frontend-dist/css/app.b63c4c0f.css.gz b/frontend-dist/css/app.b63c4c0f.css.gz deleted file mode 100644 index 7487379b58c28dacb1bda394a285015bb8a43785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5022 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 diff --git a/frontend-dist/css/app.ed6a21b7.css b/frontend-dist/css/app.ed6a21b7.css new file mode 100644 index 00000000..01e3cc40 --- /dev/null +++ b/frontend-dist/css/app.ed6a21b7.css @@ -0,0 +1 @@ +@font-face{font-family:Pacifico;src:url(/fonts/Pacifico-Regular.dc63ac94.woff2) format("woff2");font-display:swap}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50}nav{padding:30px}nav a{font-weight:700;color:#2c3e50}nav a.router-link-exact-active{color:#42b983}body{margin:0;padding:0;background-color:#f8f8f8}:focus-visible{outline:none}*{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}:root{--bg-color:linear-gradient(90deg,#efe8e8,#e4f8ff);--popper-bg-color:hsla(0,0%,100%,.8);--popper-shadow:0 0 10px 2px rgba(0,0,0,.1);--image-preview-filter:brightness(1);--text-bg-color:rgba(0,0,0,.1);--background-image-filter:brightness(1);--upload-list-card-bg-color:hsla(0,0%,100%,.7);--upload-list-card-border:1px solid #327ecc50;--upload-list-card-box-shadow:1px 2px 5px 1px #327ecc50;--upload-list-item-border:1px solid #a5bef7;--upload-list-dashboard-bg-color:hsla(0,0%,100%,.7);--upload-list-dashboard-shadow:0 2px 10px rgba(0,0,0,.1);--upload-list-file-icon-color:#327ecc;--el-upload-dragger-bg-color:hsla(0,0%,100%,.6);--el-upload-dragger-border:3px dashed #409eff;--el-upload-dragger-border-color:#409eff;--el-upload-dragger-hover-box-shadow:0 0 10px 5px #409eff;--el-upload-dragger-uniform-color:#409eff;--paste-card-textarea-border-color:#409eff;--paste-card-textarea-box-shadow:0 0 6px 1px #409eff;--el-icon--upload-color:#1f8bf8;--upload-text-color:rgba(58,58,58,.8);--upload-header-color:rgba(58,58,58,.8);--upload-main-title-color:linear-gradient(90deg,#a1e3cc,#78aeec);--upload-title-text-color:rgba(58,58,58,.8);--upload-title-text-shadow:none;--upload-title-hover-glow:rgba(64,158,255,.32);--upload-title-underline-bg:linear-gradient(90deg,transparent,rgba(161,227,204,.7),rgba(120,174,236,.85),transparent);--upload-title-underline-shadow:0 0 10px rgba(120,174,236,.36);--upload-title-crayon-deep:rgba(72,151,211,.78);--upload-title-crayon-base:rgba(116,186,232,.78);--upload-title-crayon-light:rgba(222,246,255,.9);--upload-title-crayon-edge:rgba(60,139,201,.38);--upload-title-crayon-fleck:hsla(0,0%,100%,.46);--upload-title-crayon-burr:rgba(76,154,213,.3);--upload-title-crayon-dust:rgba(118,183,224,.18);--modern-action-group-bg:rgba(64,158,255,.08);--modern-action-group-border:rgba(64,158,255,.15);--logo-glow-color:#409eff;--modern-action-group-shadow:rgba(0,0,0,.06);--modern-action-group-hover-bg:rgba(64,158,255,.12);--modern-action-group-hover-shadow:rgba(64,158,255,.15);--upload-action-toolbar-bg:rgba(230,241,247,.58);--upload-action-toolbar-border:rgba(180,212,226,.42);--upload-action-toolbar-shadow:0 8px 22px rgba(64,120,150,.07),inset 0 1px 0 hsla(0,0%,100%,.38);--upload-action-toolbar-hover-bg:rgba(220,236,244,.68);--upload-action-toolbar-hover-border:rgba(156,199,219,.46);--upload-action-toolbar-hover-shadow:0 10px 26px rgba(64,120,150,.1),inset 0 1px 0 hsla(0,0%,100%,.44);--upload-action-btn-bg:hsla(0,0%,100%,.5);--upload-action-btn-color:#327ecc;--upload-action-btn-shadow:inset 0 1px 0 hsla(0,0%,100%,.45);--upload-action-btn-hover-bg:hsla(0,0%,100%,.74);--upload-action-btn-hover-shadow:0 6px 14px rgba(67,102,122,.12),inset 0 1px 0 hsla(0,0%,100%,.66);--upload-action-btn-active-shadow:inset 0 2px 6px rgba(20,50,70,.1);--upload-action-copy-color:#2f86c9;--upload-action-retry-color:#3a9b78;--upload-action-danger-color:#d86666;--upload-action-danger-bg:hsla(0,100%,98%,.58);--upload-action-danger-hover-bg:hsla(0,100%,97%,.78);--upload-action-danger-hover-shadow:0 6px 14px hsla(0,59%,62%,.14),inset 0 1px 0 hsla(0,0%,100%,.7);--file-name-bg:linear-gradient(135deg,rgba(64,158,255,.08),rgba(64,158,255,.03));--file-name-border:rgba(64,158,255,.12);--file-name-hover-bg:linear-gradient(135deg,rgba(64,158,255,.12),rgba(64,158,255,.06));--file-name-hover-border:rgba(64,158,255,.2);--upload-list-item-bg:linear-gradient(135deg,hsla(0,0%,100%,.9),hsla(0,0%,100%,.7));--upload-list-item-border-color:rgba(64,158,255,.1);--upload-list-item-shadow:rgba(0,0,0,.04);--upload-list-item-hover-border:rgba(64,158,255,.25);--upload-list-item-hover-shadow:rgba(64,158,255,.12);--dashboard-title-bg:linear-gradient(135deg,rgba(64,158,255,.06),transparent);--toolbar-button-bg-color:hsla(0,0%,100%,.5);--toolbar-button-shadow:1px 2px 4px rgba(0,0,0,.3);--toolbar-button-shadow-hover:1px 2px 4px rgba(0,0,0,.5);--toolbar-button-color:#327ecc;--page-footer-text-color:rgba(58,58,58,.8);--page-footer-name-color:rgba(12,76,105,.8);--login-container-bg-color:hsla(0,0%,100%,.6);--password-input-bg-color:hsla(0,0%,100%,.9);--password-input-border:1px solid #dcdfe6;--login-title-color:#000;--login-container-box-shadow:0 0 12px rgba(0,0,0,.12);--login-container-hover-box-shadow:0 0 12px 4px rgba(0,0,0,.24);--login-submit-btn-bg-color:#487cb0e8;--login-title-glow-color:rgba(52,152,219,.5);--login-input-underline-color:#5b9bd3;--login-input-underline-secondary-color:#7ba9d8;--login-input-label-focus-color:#5b9bd3;--dialog-bg-color:hsla(0,0%,100%,.7);--dialog-box-shadow:0 0 10px 2px rgba(0,0,0,.1);--tabs-dropdown-popper-bg-color:hsla(0,0%,100%,.94);--tabs-dropdown-popper-shadow:0 12px 30px rgba(36,54,72,.16),0 2px 8px rgba(36,54,72,.08);--tabs-switcher-hover-bg:rgba(91,128,148,.1);--tabs-switcher-border-color:rgba(91,128,148,.16);--tabs-switcher-hover-border-color:rgba(91,128,148,.24);--admin-header-content-bg-color:hsla(0,0%,100%,.75);--admin-header-content-hover-bg-color:hsla(0,0%,100%,.85);--admin-header-content-border-bottom:1px solid rgba(0,0,0,.1);--admin-header-content-box-shadow:0 4px 6px rgba(0,0,0,.1);--admin-header-content-hover-box-shadow:0 6px 10px rgba(0,0,0,.2);--admin-container-bg-color:linear-gradient(90deg,#fdf3f6,#e4f8ff);--admin-container-color:#333;--admin-dashborad-stats-bg-color:hsla(0,0%,100%,.9);--admin-dashborad-stats-hover-bg-color:#f0eaf8;--admin-dashboard-search-card-bg-color:hsla(0,0%,100%,.9);--admin-dashboard-stats-shadow:0 2px 4px rgba(0,0,0,.05);--admin-dashboard-stats-hover-shadow:0 4px 6px rgba(0,0,0,.1);--admin-dashboard-search-card-box-shadow:0 2px 6px rgba(0,0,0,.1);--admin-dashboard-btn-color:#000;--admin-dashboard-btn-bg-color:hsla(0,0%,100%,.3);--admin-dashboard-btn-shadow:0 2px 4px rgba(0,0,0,.3);--admin-dashboard-btn-hover-shadow:0 4px 6px rgba(0,0,0,.3);--admin-dashboard-imgcard-bg-color:hsla(0,0%,100%,.6);--admin-dashboard-imgcard-shadow:0 2px 12px rgba(0,0,0,.1);--admin-dashboard-tag-suggestion-bg-color:#fff;--admin-dashboard-tag-suggestion-border-color:#dcdfe6;--admin-dashboard-tag-suggestion-box-shadow:0 2px 12px rgba(0,0,0,.1);--admin-dashboard-tag-suggestion-item-hover-bg-color:#f5f7fa;--skeleton-bg-color:#e0e0e0;--skeleton-shimmer-color:hsla(0,0%,100%,.5);--admin-cuscfg-table-shadow:0 4px 6px rgba(0,0,0,.1);--admin-cuscfg-table-bg-color:hsla(0,0%,100%,.95);--admin-syscfg-tabs-border-color:#3c3c3c4c;--admin-purple:#b39ddb;--admin-batch-toolbar-bg:rgba(247,251,252,.74);--admin-batch-toolbar-border:rgba(135,172,188,.24);--admin-batch-toolbar-shadow:0 10px 28px rgba(91,128,148,.1),inset 0 1px 0 hsla(0,0%,100%,.5);--admin-batch-action-bg:transparent;--admin-batch-action-shadow:none;--admin-batch-action-hover-bg:rgba(64,158,255,.08);--admin-batch-action-hover-shadow:none;--admin-batch-delete-color:#bd5864;--admin-batch-tag-color:#b98732;--admin-batch-clear-color:#728998;--theme-toggle-color:#327ecc;--theme-toggle-bg-color:#327ecc;--admin-theme-toggle-color:#000;--admin-theme-toggle-bg-color:#000;--not-found-title-text-color:linear-gradient(90deg,#6b9788,#6285ac);--floating-btn-bg:linear-gradient(135deg,#409eff,#66b1ff);--floating-btn-color:#fff;--floating-btn-shadow:0 4px 16px rgba(64,158,255,.4);--floating-btn-shadow-hover:0 8px 24px rgba(64,158,255,.5);--floating-btn-right:32px;--floating-btn-bottom:32px;--glass-bg:hsla(0,0%,100%,.45);--glass-bg-hover:hsla(0,0%,100%,.55);--glass-border:hsla(0,0%,100%,.5);--glass-border-hover:hsla(0,0%,100%,.6);--glass-shadow:0 4px 12px rgba(0,0,0,.06);--glass-shadow-hover:0 6px 16px rgba(0,0,0,.1);--glass-header-bg:hsla(0,0%,100%,.3);--glass-header-border:hsla(0,0%,100%,.4)}.dark{--bg-color:linear-gradient(90deg,#1c1c1c,#000);--popper-bg-color:rgba(0,0,0,.8);--popper-shadow:0 0 10px 2px hsla(0,0%,100%,.1);--image-preview-filter:brightness(0.8);--text-bg-color:hsla(0,0%,100%,.1);--background-image-filter:brightness(0.6);--upload-list-card-bg-color:rgba(0,0,0,.7);--upload-list-card-border:1px solid #8fadc8;--upload-list-card-box-shadow:-1px 2px 4px #c1ddf5ae;--upload-list-item-border:1px solid #8fadc8;--upload-list-dashboard-bg-color:rgba(0,0,0,.7);--upload-list-dashboard-shadow:0 2px 10px hsla(0,0%,100%,.1);--upload-list-file-icon-color:#8fadc8;--el-upload-dragger-bg-color:rgba(0,0,0,.6);--el-upload-dragger-border:3px dashed #8fadc8;--el-upload-dragger-border-color:#8fadc8;--el-upload-dragger-hover-box-shadow:0 0 10px 5px #8fadc8;--el-upload-dragger-uniform-color:#8fadc8;--paste-card-textarea-border-color:#8fadc8;--paste-card-textarea-box-shadow:0 0 6px 1px #8fadc8;--el-icon--upload-color:#ffebcd;--upload-text-color:#faebd7;--upload-header-color:#ffebcd;--upload-main-title-color:linear-gradient(90deg,#8fd3ff,#d7f4ff 55%,#a8d4f2);--upload-title-text-color:#cfe7f5;--upload-title-text-shadow:0 0 10px rgba(143,211,255,.16);--upload-title-hover-glow:rgba(143,211,255,.3);--upload-title-underline-bg:linear-gradient(90deg,transparent,rgba(143,211,255,.34),rgba(218,244,255,.86),hsla(0,0%,100%,.72),transparent);--upload-title-underline-shadow:0 0 12px rgba(143,211,255,.28),0 0 8px hsla(0,0%,100%,.12);--upload-title-crayon-deep:rgba(92,183,240,.96);--upload-title-crayon-base:rgba(137,211,252,.94);--upload-title-crayon-light:rgba(218,244,255,.9);--upload-title-crayon-edge:rgba(185,233,255,.6);--upload-title-crayon-fleck:hsla(0,0%,100%,.28);--upload-title-crayon-burr:rgba(62,156,220,.55);--upload-title-crayon-dust:rgba(96,180,236,.26);--toolbar-button-bg-color:rgba(0,0,0,.7);--toolbar-button-shadow:-1px 2px 4px hsla(0,0%,100%,.3);--toolbar-button-shadow-hover:-1px 2px 4px hsla(0,0%,100%,.5);--toolbar-button-color:#bedefd;--modern-action-group-bg:rgba(64,158,255,.12);--modern-action-group-border:rgba(64,158,255,.2);--logo-glow-color:#8fadc8;--modern-action-group-shadow:rgba(0,0,0,.2);--modern-action-group-hover-bg:rgba(64,158,255,.18);--modern-action-group-hover-shadow:rgba(64,158,255,.25);--upload-action-toolbar-bg:rgba(18,24,30,.56);--upload-action-toolbar-border:rgba(190,222,253,.14);--upload-action-toolbar-shadow:0 8px 22px rgba(0,0,0,.24),inset 0 1px 0 hsla(0,0%,100%,.06);--upload-action-toolbar-hover-bg:rgba(28,36,44,.68);--upload-action-toolbar-hover-border:rgba(190,222,253,.22);--upload-action-toolbar-hover-shadow:0 10px 26px rgba(0,0,0,.3),inset 0 1px 0 hsla(0,0%,100%,.08);--upload-action-btn-bg:hsla(0,0%,100%,.06);--upload-action-btn-color:#bedefd;--upload-action-btn-shadow:inset 0 1px 0 hsla(0,0%,100%,.06);--upload-action-btn-hover-bg:hsla(0,0%,100%,.1);--upload-action-btn-hover-shadow:0 6px 14px rgba(0,0,0,.22),inset 0 1px 0 hsla(0,0%,100%,.09);--upload-action-btn-active-shadow:inset 0 2px 6px rgba(0,0,0,.28);--upload-action-copy-color:#9ccdf7;--upload-action-retry-color:#9ddfbe;--upload-action-danger-color:#f0a8a8;--upload-action-danger-bg:hsla(0,87%,69%,.08);--upload-action-danger-hover-bg:hsla(0,87%,69%,.14);--upload-action-danger-hover-shadow:0 6px 14px rgba(0,0,0,.22),inset 0 1px 0 hsla(0,0%,100%,.08);--file-name-bg:linear-gradient(135deg,rgba(64,158,255,.12),rgba(64,158,255,.05));--file-name-border:rgba(64,158,255,.18);--file-name-hover-bg:linear-gradient(135deg,rgba(64,158,255,.18),rgba(64,158,255,.08));--file-name-hover-border:rgba(64,158,255,.3);--upload-list-item-bg:linear-gradient(135deg,rgba(30,30,30,.9),rgba(40,40,40,.7));--upload-list-item-border-color:rgba(64,158,255,.15);--upload-list-item-shadow:rgba(0,0,0,.15);--upload-list-item-hover-border:rgba(64,158,255,.35);--upload-list-item-hover-shadow:rgba(64,158,255,.2);--dashboard-title-bg:linear-gradient(135deg,rgba(64,158,255,.1),transparent);--page-footer-text-color:#f0f8ff;--page-footer-name-color:#faebd7;--login-container-bg-color:rgba(0,0,0,.6);--password-input-bg-color:rgba(77,77,77,.8);--password-input-border:1px solid #919191;--login-title-color:#f0f8ff;--login-container-box-shadow:-3px 2px 12px hsla(0,0%,100%,.12);--login-container-hover-box-shadow:-3px 2px 12px 4px hsla(0,0%,100%,.24);--login-submit-btn-bg-color:#8fadc8b4;--login-title-glow-color:rgba(143,173,200,.7);--login-input-underline-color:#a3c5e5;--login-input-underline-secondary-color:#b8d0e8;--login-input-label-focus-color:#a3c5e5;--dialog-bg-color:rgba(0,0,0,.8);--dialog-box-shadow:0 0 10px 2px hsla(0,0%,100%,.1);--tabs-dropdown-popper-bg-color:rgba(24,30,38,.94);--tabs-dropdown-popper-shadow:0 12px 30px rgba(0,0,0,.34),0 2px 8px rgba(0,0,0,.24);--tabs-switcher-hover-bg:rgba(190,222,253,.08);--tabs-switcher-border-color:rgba(190,222,253,.1);--tabs-switcher-hover-border-color:rgba(190,222,253,.16);--admin-header-content-bg-color:rgba(0,0,0,.75);--admin-header-content-hover-bg-color:rgba(0,0,0,.85);--admin-header-content-border-bottom:1px solid hsla(0,0%,100%,.1);--admin-header-content-box-shadow:0 4px 6px hsla(0,0%,100%,.1);--admin-header-content-hover-box-shadow:0 6px 10px hsla(0,0%,100%,.2);--admin-container-bg-color:linear-gradient(90deg,#464545,#2d2d2d);--admin-container-color:#f0f0f0;--admin-dashborad-stats-bg-color:rgba(0,0,0,.9);--admin-dashborad-stats-hover-bg-color:#1e1e1e;--admin-dashboard-stats-shadow:0 2px 4px hsla(0,0%,100%,.1);--admin-dashboard-stats-hover-shadow:0 4px 6px hsla(0,0%,100%,.15);--admin-dashboard-search-card-bg-color:rgba(0,0,0,.9);--admin-dashboard-search-card-box-shadow:0 2px 6px hsla(0,0%,100%,.1);--admin-dashboard-btn-color:#f0f0f0;--admin-dashboard-btn-bg-color:rgba(0,0,0,.3);--admin-dashboard-btn-shadow:0 2px 4px hsla(0,0%,100%,.3);--admin-dashboard-btn-hover-shadow:0 4px 6px hsla(0,0%,100%,.3);--admin-dashboard-imgcard-bg-color:rgba(0,0,0,.6);--admin-dashboard-imgcard-shadow:0 2px 12px hsla(0,0%,100%,.1);--admin-dashboard-tag-suggestion-bg-color:#2d2d2d;--admin-dashboard-tag-suggestion-border-color:#555;--admin-dashboard-tag-suggestion-box-shadow:0 2px 12px hsla(0,0%,100%,.1);--admin-dashboard-tag-suggestion-item-hover-bg-color:#3a3a3a;--skeleton-bg-color:#3a3a3a;--skeleton-shimmer-color:hsla(0,0%,100%,.15);--admin-cuscfg-table-shadow:0 4px 6px rgba(0,0,0,.3),0 0 1px 1px hsla(0,0%,100%,.05);--admin-cuscfg-table-bg-color:rgba(45,45,45,.95);--admin-syscfg-tabs-border-color:#cfcccc47;--theme-toggle-color:#bedefd;--theme-toggle-bg-color:#bedefd;--admin-theme-toggle-color:#fff;--admin-theme-toggle-bg-color:#fcfcfc;--admin-batch-toolbar-bg:rgba(30,37,43,.58);--admin-batch-toolbar-border:rgba(190,222,253,.1);--admin-batch-toolbar-shadow:0 10px 28px rgba(0,0,0,.22),inset 0 1px 0 hsla(0,0%,100%,.04);--admin-batch-action-bg:transparent;--admin-batch-action-shadow:none;--admin-batch-action-hover-bg:rgba(190,222,253,.09);--admin-batch-action-hover-shadow:none;--admin-batch-delete-color:#ee9aa4;--admin-batch-tag-color:#d8bd78;--admin-batch-clear-color:#bdcbd5;--not-found-title-text-color:linear-gradient(90deg,#effac3,#f3a060);--floating-btn-bg:linear-gradient(135deg,#409eff,#2d8cf0);--floating-btn-color:#fff;--floating-btn-shadow:0 4px 16px rgba(0,0,0,.4);--floating-btn-shadow-hover:0 8px 24px rgba(0,0,0,.5);--glass-bg:rgba(30,30,30,.6);--glass-bg-hover:rgba(40,40,40,.7);--glass-border:hsla(0,0%,100%,.1);--glass-border-hover:hsla(0,0%,100%,.15);--glass-shadow:0 4px 12px rgba(0,0,0,.2);--glass-shadow-hover:0 6px 16px rgba(0,0,0,.3);--glass-header-bg:hsla(0,0%,100%,.03);--glass-header-border:hsla(0,0%,100%,.08)}.el-message{border-radius:50px!important;border:none!important;padding:10px 30px!important;box-shadow:0 4px 16px rgba(0,0,0,.2)!important;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);background-color:rgba(40,40,40,.85)!important;min-width:unset!important;top:30px!important}.el-message .el-message__icon{font-size:18px!important;color:#fff!important}.el-message .el-message__content{font-size:16px!important;font-weight:500!important;color:#fff!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;letter-spacing:.5px}.el-message--success .el-message__icon{color:#67c23a!important}.el-message--warning .el-message__icon{color:#e6a23c!important}.el-message--error .el-message__icon{color:#f56c6c!important}.dark .el-message{background-color:hsla(0,0%,100%,.2)!important;border:1px solid hsla(0,0%,100%,.1)!important;box-shadow:0 4px 16px rgba(0,0,0,.4)!important}.dialog-section{margin-bottom:24px;background:var(--el-fill-color-lighter);border-radius:12px;padding:16px;border:1px solid var(--el-border-color-lighter)}.section-header{display:flex;align-items:center;gap:8px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--el-border-color-lighter)}.section-title{font-size:15px;font-weight:600;color:var(--el-text-color-primary)}.section-help-icon{color:var(--el-text-color-secondary);cursor:pointer;font-size:14px;transition:color .2s}.section-help-icon:hover{color:var(--el-color-primary)}.section-content{display:flex;flex-direction:column;gap:16px}.radio-card-group{display:flex;flex-wrap:wrap;gap:10px}.radio-card-group .radio-card{margin-right:0;padding:10px 16px;border-radius:8px;background:var(--el-bg-color);border:1px solid var(--el-border-color-lighter);transition:all .2s ease}.radio-card-group .radio-card:hover{border-color:var(--el-color-primary-light-5)}.radio-card-group .radio-card.is-checked{background:linear-gradient(135deg,rgba(64,158,255,.1),rgba(56,189,248,.05));border-color:var(--el-color-primary)}.radio-card-group .el-radio__input{display:none}.radio-card-group .el-radio__label{padding-left:0;font-weight:500;display:flex;align-items:center;gap:8px}.setting-item{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:var(--el-bg-color);border-radius:8px;border:1px solid var(--el-border-color-lighter)}.setting-label{font-size:14px;font-weight:500;color:var(--el-text-color-primary)}.setting-input{width:60%;max-width:250px}.dialog-action{display:flex;justify-content:flex-end;padding-top:16px}.confirm-btn{min-width:100px;border-radius:8px}@media (max-width:768px){.el-message{padding:8px 18px!important;border-radius:30px!important}.el-message .el-message__icon{font-size:14px!important}.el-message .el-message__content{font-size:13px!important}.dialog-section{padding:12px}.radio-card-group{flex-direction:column}.radio-card-group .radio-card{width:100%;text-align:center}.setting-item{flex-direction:column;align-items:flex-start;gap:10px}.setting-item .radio-card-group.compact{width:100%}.setting-input{width:100%;max-width:none}.radio-card-group.compact{flex-direction:row;display:grid;grid-template-columns:repeat(2,1fr);gap:8px;width:100%}.radio-card-group.compact .radio-card{width:100%;box-sizing:border-box;justify-content:center;flex:1}.radio-card-group.compact .radio-card .el-radio__label{display:flex;align-items:center;justify-content:center;gap:6px}.radio-card-group.compact .channel-icon{width:18px;font-size:18px;text-align:center;flex-shrink:0}}.slider-item{flex-direction:column;align-items:flex-start;gap:12px}.slider-wrapper{display:flex;align-items:center;gap:12px;width:100%}.slider-wrapper .el-slider{flex:1;min-width:0}.slider-input{width:80px!important;flex-shrink:0}.slider-input .el-input__wrapper{padding:0 8px}.slider-input-wrapper{display:flex;align-items:center;gap:6px;flex-shrink:0}.slider-unit{font-size:13px;font-weight:500;color:var(--el-text-color-secondary)}@media (max-width:768px){.slider-wrapper{gap:8px;width:100%}.slider-input{width:80px!important}.setting-input{width:100%!important;max-width:none!important}.dialog-section{overflow:hidden}.radio-card-group.grid-2x2{grid-template-columns:repeat(2,1fr);gap:8px}.radio-card-group.grid-2x2 .radio-card{padding:10px 12px;font-size:13px;justify-content:center}}.inline-help-icon{color:var(--el-text-color-secondary);cursor:pointer;font-size:13px;margin-left:6px;transition:color .2s}.inline-help-icon:hover{color:var(--el-color-primary)}.radio-card-group.compact{gap:8px}.radio-card-group.compact .radio-card{padding:8px 12px;font-size:13px}.radio-card-group.compact .radio-card .el-radio__label{display:flex;align-items:center;gap:6px}.radio-card-group.compact .channel-icon{width:18px;font-size:18px;text-align:center;flex-shrink:0}.channel-brand-telegram{color:#229ed9!important}.channel-brand-cfr2{color:#f38020!important}.channel-brand-s3{color:#f90!important}.channel-brand-discord{color:#5865f2!important}.channel-brand-huggingface{color:#ff9d00!important}.channel-brand-webdav{color:#14b8a6!important}.radio-card-group.grid-2x2{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.radio-card-group.grid-2x2 .radio-card{width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:center;gap:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (min-width:769px){.radio-card-group.grid-2x2 .radio-card{justify-content:flex-start;padding-left:20px}}.radio-icon{font-size:14px;opacity:.8;width:20px;text-align:center;display:inline-block}.radio-card.is-checked .radio-icon{opacity:1}.el-dialog,.el-message-box{border-radius:16px!important;overflow:hidden;box-shadow:0 12px 32px rgba(0,0,0,.2)!important;border:1px solid hsla(0,0%,100%,.5);background-color:hsla(0,0%,100%,.85)!important;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.el-dialog__header,.el-message-box__header{border-bottom:none;padding:16px 20px!important;margin-right:0!important;position:relative}.el-dialog__header:after{background:linear-gradient(90deg,transparent,rgba(156,163,175,.5) 20%,rgba(156,163,175,.8) 50%,rgba(156,163,175,.5) 80%,transparent)}.el-dialog__header:after,.el-message-box__header:after{content:"";position:absolute;bottom:0;left:20px;right:20px;height:1px}.el-message-box__header:after{background:linear-gradient(90deg,rgba(156,163,175,.8),rgba(156,163,175,.5) 30%,transparent 80%)}.el-dialog__body,.el-message-box__content{padding:20px!important}.el-dialog__footer,.el-message-box__btns{border-top:none;padding:12px 20px!important;background-color:transparent}.dark .el-dialog,.dark .el-message-box{background-color:rgba(30,30,30,.75)!important;border:1px solid hsla(0,0%,100%,.08)!important;box-shadow:0 12px 32px rgba(0,0,0,.5)!important}.dark .el-dialog__header,.dark .el-message-box__header{border-bottom:none}.dark .el-dialog__header:after{background:linear-gradient(90deg,transparent,rgba(156,163,175,.3) 20%,rgba(156,163,175,.5) 50%,rgba(156,163,175,.3) 80%,transparent)}.dark .el-message-box__header:after{background:linear-gradient(90deg,rgba(156,163,175,.5),rgba(156,163,175,.3) 30%,transparent 80%)}.dark .el-dialog__footer,.dark .el-message-box__btns{border-top:none;background-color:transparent}.dark .el-dialog__title,.dark .el-message-box__title{color:#e5eaf3}.dark .el-message-box__content{color:#cfd3dc}.el-loading-mask{border-radius:12px}.el-dropdown__popper.el-popper{border-radius:12px;border:none;background-color:var(--popper-bg-color);backdrop-filter:blur(10px);box-shadow:var(--popper-shadow)}.el-dropdown__popper.el-popper .el-dropdown-menu,.el-dropdown__popper.el-popper .el-dropdown-menu__item{background:none;border:none}.el-popper.is-light>.el-popper__arrow:before{background:none!important;border:none!important}*,body,html{scrollbar-width:none!important;-ms-overflow-style:none!important}::-webkit-scrollbar,body::-webkit-scrollbar,html::-webkit-scrollbar{display:none!important;width:0!important;height:0!important;background:transparent!important}.os-theme-dark{--os-handle-bg:hsla(0,0%,50%,.5);--os-handle-bg-hover:hsla(0,0%,50%,.7);--os-handle-bg-active:hsla(0,0%,50%,.85)}.dark .os-theme-dark,html.dark .os-theme-dark{--os-handle-bg:hsla(0,0%,71%,.6);--os-handle-bg-hover:hsla(0,0%,71%,.75);--os-handle-bg-active:hsla(0,0%,71%,.9)}.os-theme-dark .os-scrollbar,.os-theme-dark .os-scrollbar-horizontal,.os-theme-dark .os-scrollbar-vertical{--os-size:10px;--os-padding-perpendicular:2px;--os-padding-axis:2px;--os-track-bg:transparent;--os-track-bg-hover:transparent;--os-track-bg-active:transparent}.os-theme-dark .os-scrollbar .os-scrollbar-handle{border-radius:10px!important;transition:background-color .2s ease,opacity .2s ease!important} \ No newline at end of file diff --git a/frontend-dist/css/app.ed6a21b7.css.gz b/frontend-dist/css/app.ed6a21b7.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..e9dde12f6d5d44c50317c70abe1a42e00c5f995f GIT binary patch literal 5009 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 ImgHub
\ No newline at end of file +Sanyue ImgHub
\ No newline at end of file diff --git a/frontend-dist/index.html.gz b/frontend-dist/index.html.gz index dbde1d69591aa73f439b9da10ceaf341b66fedb2..5bb722f8a31646f3c99169903c834091ebb7510f 100644 GIT binary patch literal 520 zcmV+j0{8tNiwFP!000023YAmAZqzUk{guHSdf6nqXiHnkiBusZ$_Z221vzQ|g6tT&>O-h~|`^tEuBf&iPat3{PrvD4Ln#;M9vPh|}KS-FbQ zW5G0PTl^< z&^eD_DYFYbM6bA`G@LW;aNbig`32qT#J4(QS%Di=|0L9&Mgy5Cspsyfku9Yc#GjpL zBs=!loDD9kB`Ft)V6ekB4~@{gRc|)!)t@lc zav&|4xsib$6>y@^H(&80A!JHvhIVAg$Blh=LvP0x3}Frz40}pDh>0R5Kf~U!rIF#I zn$-QW2n?$AXiE6xQDr>E;24;W{rNYrVY>~oL|bZP zQIlu~{`(vu@c|1FZbCy>Vst4I254BGkUJX!}|(#hrd8x_E?G0;x16+7j-+U z*;E=wt1vqR3+pXg>9VAx!)hh!(pkTSh^`V=kr!Yhwv{LnOSY=$QCnF!>L?GsJ1LhT zILw#^WwQT-_A+h%1p|s4#Y((x*UfslJQb`lsb~Y+JeW__#9fCs;h{-|``t-Vuv{dT#^RZ3#EHSy#y8AKMB=zXK+_FApgvi%dL zm=B~OJ=LYBX9XO|clB4iiU^5foS+#P(qUuYZQq%p0Zo|v6~m6=7DA+e(M_d.handleToggleClick&&d.handleToggleClick(...e))},[(0,i.bF)(s.eB,{name:"icon-fade",mode:"out-in"},{default:(0,i.k6)(()=>[g.isAuto?((0,i.uX)(),(0,i.Wv)(m,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.3em",color:"var(--admin-theme-toggle-color)"}})):((0,i.uX)(),(0,i.CE)("svg",{key:"sun-moon",class:(0,o.C4)(["theme_toggle_svg",{dark:g.isDark}]),width:"1.3em",height:"1.3em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,i.Lk)("mask",r,[t[1]||(t[1]=(0,i.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,i.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:g.isDark?"50%":"100%",cy:g.isDark?"23%":"0%",r:g.isDark?"9":"5"},null,8,l)]),(0,i.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:g.isDark?"9":"5",mask:"url(#themeMaskAdmin)"},null,8,c),(0,i.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:g.isDark?0:1},[...t[2]||(t[2]=[(0,i.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,i.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,i.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,i.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,i.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,i.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,i.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,i.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,u)],2))]),_:1})])}var d={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},m=n(71241);const h=(0,m.A)(d,[["render",g],["__scopeId","data-v-5c149ed5"]]);var p=h;const k={class:"tabs"},b=["aria-expanded"],y={class:"page-switcher-title"},f={class:"page-options",role:"menu"},I=["onClick"];function v(e,t,n,r,l,c){const u=(0,i.g2)("font-awesome-icon"),g=p,d=a.A;return(0,i.uX)(),(0,i.CE)("div",k,[(0,i.Lk)("div",{class:(0,o.C4)(["page-switcher",{"is-open":l.isPageMenuOpen}]),role:"navigation",onClick:t[1]||(t[1]=(0,s.D$)(()=>{},["stop"]))},[(0,i.Lk)("button",{class:"title page-switcher-trigger",type:"button","aria-expanded":l.isPageMenuOpen,onClick:t[0]||(t[0]=(...e)=>c.togglePageMenu&&c.togglePageMenu(...e))},[(0,i.bF)(u,{icon:c.iconName,class:"fa-images"},null,8,["icon"]),(0,i.Lk)("span",y,(0,o.v_)(c.titleName),1),(0,i.bF)(u,{icon:"chevron-down",class:"page-switcher-arrow"})],8,b),(0,i.Lk)("div",f,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(c.pageOptions,t=>((0,i.uX)(),(0,i.CE)("button",{key:t.name,class:(0,o.C4)(["page-option",{"is-active":n.activeTab===t.name}]),type:"button",role:"menuitem",onClick:e=>c.handleTabClick(t.name)},[(0,i.bF)(u,{icon:t.icon,class:"page-option-icon"},null,8,["icon"]),(0,i.Lk)("span",null,(0,o.v_)(e.$t(t.label)),1)],10,I))),128))])],2),(0,i.bF)(g),(0,i.bF)(d,{class:"tabs-language-switcher"})])}n(44114);var C={name:"DashboardTabs",props:{activeTab:{type:String,default:"dashboard"}},components:{AdminToggleDark:p,LanguageSwitcher:a.A},data(){return{isPageMenuOpen:!1}},computed:{pageOptions(){return[{name:"dashboard",icon:"images",label:"dashboardTabs.fileManagement"},{name:"customerConfig",icon:"user-cog",label:"dashboardTabs.userManagement"},{name:"systemConfig",icon:"cogs",label:"dashboardTabs.systemSettings"},{name:"",icon:"upload",label:"dashboardTabs.fileUpload"}]},titleName(){return"dashboard"===this.activeTab?this.$t("dashboardTabs.fileManagement"):"customerConfig"===this.activeTab?this.$t("dashboardTabs.userManagement"):"systemConfig"===this.activeTab?this.$t("dashboardTabs.systemSettings"):this.$t("dashboardTabs.fileUpload")},iconName(){return"dashboard"===this.activeTab?"images":"customerConfig"===this.activeTab?"user-cog":"systemConfig"===this.activeTab?"cogs":"upload"}},methods:{handleDocumentClick(){this.closePageMenu()},refreshDashboard(){location.reload()},handleTabClick(e){this.isPageMenuOpen=!1,e!==this.activeTab?this.$router.push(`/${e}`):this.refreshDashboard()},togglePageMenu(){this.isPageMenuOpen=!this.isPageMenuOpen},closePageMenu(){this.isPageMenuOpen=!1}},mounted(){document.addEventListener("click",this.handleDocumentClick)},beforeUnmount(){document.removeEventListener("click",this.handleDocumentClick)}};const B=(0,m.A)(C,[["render",v],["__scopeId","data-v-74e008d5"]]);var x=B},38736:function(e,t,n){n(85331)},48903:function(e,t,n){var a=n(60782);t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null}},computed:{...(0,a.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const n=document.createElement("img");n.id="bg2",n.className="background-image2",n.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(n,e.firstChild)},initializeBackground(e,t=".login",n=!1,a=!1){this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:n,autoCreateElements:a};const i=document.querySelector(t);this.prepareBackgroundContainer(i),a&&(!i||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(i));const s=document.getElementById("bg1"),o=document.getElementById("bg2");if(!s||!o)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const r=this.userConfig?.[e];"bing"===r?this.setupBingWallpaper(s,o,t):Array.isArray(r)&&r.length>1?this.setupCustomWallpaperCarousel(s,o,r,t):Array.isArray(r)&&1===r.length?this.setupSingleCustomWallpaper(s,r[0],t):n&&this.setupDefaultWallpaper(s,t)},setupBingWallpaper(e,t,n){this.$store.dispatch("fetchBingWallPapers").then(()=>{0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,n),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,n,a){this.loadBackgroundImage(e,n[this.customWallPaperIndex],a),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,n)},this.bkInterval)},setupSingleCustomWallpaper(e,t,n){this.loadBackgroundImage(e,t,n)},setupDefaultWallpaper(e,t){const a=this.useDarkMode,i=n(a?10732:7835);this.loadBackgroundImage(e,i,t)},loadBackgroundImage(e,t,n){e.style.zIndex=-1,e.style.opacity=0;const a=document.querySelector(n);this.prepareBackgroundContainer(a);const i=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.style.opacity=this.bkOpacity})})},s=new Image;s.onload=()=>{e.src=t,i()},s.onerror=()=>{e.src=t,i()},s.src=t},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t){if(0===this.bingWallPapers.length)return;const n=0!=e.style.opacity,a=n?e:t,i=n?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const s=this.bingWallPapers[this.bingWallPaperIndex]?.url;a.style.zIndex=-2,i.style.zIndex=-1;const o=new Image;o.onload=()=>{i.src=s,setTimeout(()=>{i.style.opacity=this.bkOpacity,setTimeout(()=>{a.style.opacity=0},1200)},50)},o.src=s},switchCustomWallpaper(e,t,n){const a=0!=e.style.opacity,i=a?e:t,s=a?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%n.length;const o=n[this.customWallPaperIndex];i.style.zIndex=-2,s.style.zIndex=-1;const r=new Image;r.onload=()=>{s.src=o,setTimeout(()=>{s.style.opacity=this.bkOpacity,setTimeout(()=>{i.style.opacity=0},1200)},50)},r.src=o},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),n=document.getElementById("bg2");e?(t&&(t.style.transition="none",t.style.opacity=0,t.src="",setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out")},50)),n&&(n.style.transition="none",n.style.opacity=0,n.src="",setTimeout(()=>{n&&(n.style.transition="opacity 1.2s ease-in-out")},50))):(t&&(t.style.opacity=0,setTimeout(()=>{t&&(t.src="")},1200)),n&&(n.style.opacity=0,setTimeout(()=>{n&&(n.src="")},1200)))},smoothThemeTransition(e,t=".login",a=!1,i=!1){const s=this.userConfig?.[e];if(!a||void 0!==s)return void this.reinitializeBackground(e,t,a,i);const o=document.getElementById("bg1"),r=document.getElementById("bg2");if(!o||!r)return void this.reinitializeBackground(e,t,a,i);const l=0!=o.style.opacity?o:r,c=0!=o.style.opacity?r:o,u=this.useDarkMode,g=n(u?10732:7835),d=new Image;d.onload=()=>{c.src=g,c.onload=()=>{l.style.opacity=0,setTimeout(()=>{c.style.opacity=this.bkOpacity},50)}},d.onerror=()=>{console.warn("主题背景图预加载失败,回退到直接切换"),this.reinitializeBackground(e,t,a,i)},d.src=g},reinitializeBackground(e,t=".login",n=!1,a=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,n,a)},100)}}}},54047:function(e,t,n){n.d(t,{A:function(){return u}});var a=n(56768);const i=["title"];function s(e,t,n,s,o,r){const l=(0,a.g2)("font-awesome-icon");return(0,a.uX)(),(0,a.CE)("span",{class:"language-switcher",onClick:t[0]||(t[0]=(...e)=>r.toggleLocale&&r.toggleLocale(...e)),role:"button",title:e.$t("language.switchTo")},[(0,a.bF)(l,{icon:"globe",class:"lang-icon"})],8,i)}var o=n(46638),r={name:"LanguageSwitcher",computed:{isZh(){return"zh-CN"===this.$i18n.locale}},methods:{toggleLocale(){const e=this.isZh?"en":"zh-CN";(0,o.xS)(e)}}},l=n(71241);const c=(0,l.A)(r,[["render",s],["__scopeId","data-v-08567d0a"]]);var u=c},67819:function(e,t,n){n(85331)},70797:function(e,t,n){n.d(t,{A:function(){return o}});n(44114);var a=n(25507),i=n(16915);let s=!1;async function o(e,t={}){t.credentials="include",t.headers={...t.headers};const n=await fetch(e,t);return 401!==n.status||s||(s=!0,a.A.commit("setAdminLoggedIn",!1),i.A.push("/adminLogin").finally(()=>{s=!1})),n}},77128:function(e,t,n){n(85331),n(4318)},78450:function(e,t,n){n(85331)},85970:function(e,t,n){n(85331)},96808:function(e,t,n){n(85331),n(18785),n(67819),n(85970),n(19104)}}]); +//# sourceMappingURL=142.fc366b6d.js.map \ No newline at end of file diff --git a/frontend-dist/js/142.fc366b6d.js.gz b/frontend-dist/js/142.fc366b6d.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..baf5b694421439ffebbfba32344ce0807253d27f GIT binary patch literal 4379 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 V9mVcD(w*Yj{{h|7|6p7+002qQdL#e< literal 0 HcmV?d00001 diff --git a/frontend-dist/js/142.fc366b6d.js.map b/frontend-dist/js/142.fc366b6d.js.map new file mode 100644 index 00000000..5f51f5a4 --- /dev/null +++ b/frontend-dist/js/142.fc366b6d.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/142.fc366b6d.js","mappings":"8gBACA,MAAMA,EAAa,CACjBC,GAAI,kBAEAC,EAAa,CAAC,KAAM,KAAM,KAC1BC,EAAa,CAAC,KACdC,EAAa,CAAC,WACb,SAASC,EAAOC,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACvD,OAAO,WAAc,QAAoB,MAAO,CAC9CX,GAAI,cACJY,QAASN,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAASI,mBAAqBJ,EAASI,qBAAqBD,KAC3G,EAAC,QAAa,KAAa,CAC5BE,KAAM,YACNC,KAAM,UACL,CACDC,SAAS,QAAS,IAAM,CAAER,EAAMS,SA2EU,WAAc,QAAaP,EAA8B,CACjGQ,IAAK,YACLC,KAAM,qBACNC,MAAO,YACPC,MAAO,CACL,YAAa,QACb,MAAS,wCAjF6B,WAAc,QAAoB,MAAO,CACjFH,IAAK,WACLE,OAAO,QAAgB,CAAC,mBAAoB,CAC1C,KAAQZ,EAAMc,UAEhBC,MAAO,QACPC,OAAQ,QACRC,QAAS,YACTC,KAAM,OACN,eAAgB,IAChB,iBAAkB,QAClB,kBAAmB,QACnBC,OAAQ,gBACP,EAAC,QAAoB,OAAQ7B,EAAY,CAACO,EAAO,KAAOA,EAAO,IAAK,QAAoB,OAAQ,CACjGuB,EAAG,IACHC,EAAG,IACHN,MAAO,OACPC,OAAQ,OACRE,KAAM,SACL,MAAO,KAAK,QAAoB,SAAU,CAC3CN,MAAO,uBACPM,KAAM,QACNI,GAAItB,EAAMc,OAAS,MAAQ,OAC3BS,GAAIvB,EAAMc,OAAS,MAAQ,KAC3BU,EAAGxB,EAAMc,OAAS,IAAM,KACvB,KAAM,EAAGtB,MAAe,QAAoB,SAAU,CACvDoB,MAAO,uBACPU,GAAI,KACJC,GAAI,KACJC,EAAGxB,EAAMc,OAAS,IAAM,IACxBW,KAAM,wBACL,KAAM,EAAGhC,IAAa,QAAoB,IAAK,CAChDmB,MAAO,iBACPO,OAAQ,eACRO,QAAS1B,EAAMc,OAAS,EAAI,GAC3B,IAAKjB,EAAO,KAAOA,EAAO,GAAK,EAAC,QAAoB,OAAQ,CAC7D8B,GAAI,KACJC,GAAI,IACJC,GAAI,KACJC,GAAI,KACH,MAAO,IAAI,QAAoB,OAAQ,CACxCH,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,MACH,MAAO,IAAI,QAAoB,OAAQ,CACxCH,GAAI,OACJC,GAAI,OACJC,GAAI,OACJC,GAAI,QACH,MAAO,IAAI,QAAoB,OAAQ,CACxCH,GAAI,QACJC,GAAI,QACJC,GAAI,QACJC,GAAI,SACH,MAAO,IAAI,QAAoB,OAAQ,CACxCH,GAAI,IACJC,GAAI,KACJC,GAAI,IACJC,GAAI,MACH,MAAO,IAAI,QAAoB,OAAQ,CACxCH,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,MACH,MAAO,IAAI,QAAoB,OAAQ,CACxCH,GAAI,OACJC,GAAI,QACJC,GAAI,OACJC,GAAI,SACH,MAAO,IAAI,QAAoB,OAAQ,CACxCH,GAAI,QACJC,GAAI,OACJC,GAAI,QACJC,GAAI,QACH,MAAO,MAAQ,EAAGpC,IAAc,MASnCqC,EAAG,KAEP,CCtGA,OACEzB,KAAM,aACN,IAAA0B,GACE,MAAO,CACLlB,OAAQmB,KAAKC,OAAOC,QAAQC,YAC5B3B,QAASwB,KAAKC,OAAOC,QAAQE,YAEjC,EACAC,QAAS,CACP,iBAAAjC,GAEM4B,KAAKxB,QAEPwB,KAAKnB,QAAS,EACdmB,KAAKxB,QAAS,EACdwB,KAAKC,OAAOK,OAAO,kBAAkB,GACrCN,KAAKC,OAAOK,OAAO,kBAAkB,IAC3BN,KAAKnB,QAOfmB,KAAKxB,QAAS,EACdwB,KAAKC,OAAOK,OAAO,kBAAkB,KANrCN,KAAKnB,QAAS,EACdmB,KAAKC,OAAOK,OAAO,kBAAkB,GACrCN,KAAKC,OAAOK,OAAO,kBAAkB,GAMzC,I,WCpBJ,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS7C,GAAQ,CAAC,YAAY,qBAEzF,QCRA,MAAM,EAAa,CACjBiB,MAAO,QAEH,EAAa,CAAC,iBACd,EAAa,CACjBA,MAAO,uBAEH,EAAa,CACjBA,MAAO,eACP6B,KAAM,QAEFC,EAAa,CAAC,WACb,SAAS,EAAO9C,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACjDyC,EAA6B,EAC7BC,EAA8B,IACpC,OAAO,WAAc,QAAoB,MAAO,EAAY,EAAC,QAAoB,MAAO,CACtFhC,OAAO,QAAgB,CAAC,gBAAiB,CACvC,UAAWZ,EAAM6C,kBAEnBJ,KAAM,aACNtC,QAASN,EAAO,KAAOA,EAAO,IAAK,QAAe,OAAU,CAAC,WAC5D,EAAC,QAAoB,SAAU,CAChCe,MAAO,8BACPkC,KAAM,SACN,gBAAiB9C,EAAM6C,eACvB1C,QAASN,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAAS8C,gBAAkB9C,EAAS8C,kBAAkB3C,KACrG,EAAC,QAAaF,EAA8B,CAC7CS,KAAMV,EAAS+C,SACfpC,MAAO,aACN,KAAM,EAAG,CAAC,UAAU,QAAoB,OAAQ,GAAY,QAAiBX,EAASgD,WAAY,IAAI,QAAa/C,EAA8B,CAClJS,KAAM,eACNC,MAAO,yBACJ,EAAG,IAAa,QAAoB,MAAO,EAAY,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYX,EAASiD,YAAaC,KAC9I,WAAc,QAAoB,SAAU,CACjDzC,IAAKyC,EAAO7C,KACZM,OAAO,QAAgB,CAAC,cAAe,CACrC,YAAad,EAAOsD,YAAcD,EAAO7C,QAE3CwC,KAAM,SACNL,KAAM,WACNtC,QAASkD,GAAUpD,EAASqD,eAAeH,EAAO7C,OACjD,EAAC,QAAaJ,EAA8B,CAC7CS,KAAMwC,EAAOxC,KACbC,MAAO,oBACN,KAAM,EAAG,CAAC,UAAU,QAAoB,OAAQ,MAAM,QAAiBhB,EAAK2D,GAAGJ,EAAOK,QAAS,IAAK,GAAId,KACzG,SAAU,IAAI,QAAaC,IAA6B,QAAaC,EAA6B,CACpGhC,MAAO,4BAEX,C,aC/CA,GACEN,KAAM,gBACNmD,MAAO,CACLL,UAAW,CACTN,KAAMY,OACNlD,QAAS,cAGbmD,WAAY,CACVC,gBAAe,EACfC,iBAAgB,KAElB,IAAA7B,GACE,MAAO,CACLa,gBAAgB,EAEpB,EACAiB,SAAU,CACR,WAAAZ,GACE,MAAO,CAAC,CACN5C,KAAM,YACNK,KAAM,SACN6C,MAAO,gCACN,CACDlD,KAAM,iBACNK,KAAM,WACN6C,MAAO,gCACN,CACDlD,KAAM,eACNK,KAAM,OACN6C,MAAO,gCACN,CACDlD,KAAM,GACNK,KAAM,SACN6C,MAAO,4BAEX,EACA,SAAAP,GACE,MAAuB,cAAnBhB,KAAKmB,UACAnB,KAAKsB,GAAG,gCACa,mBAAnBtB,KAAKmB,UACPnB,KAAKsB,GAAG,gCACa,iBAAnBtB,KAAKmB,UACPnB,KAAKsB,GAAG,gCAERtB,KAAKsB,GAAG,2BAEnB,EACA,QAAAP,GACE,MAAuB,cAAnBf,KAAKmB,UACA,SACqB,mBAAnBnB,KAAKmB,UACP,WACqB,iBAAnBnB,KAAKmB,UACP,OAEA,QAEX,GAEFd,QAAS,CACP,mBAAAyB,GACE9B,KAAK+B,eACP,EACA,gBAAAC,GACEC,SAASC,QACX,EACA,cAAAb,CAAec,GACbnC,KAAKY,gBAAiB,EAClBuB,IAAQnC,KAAKmB,UAIjBnB,KAAKoC,QAAQC,KAAK,IAAIF,KAHpBnC,KAAKgC,kBAIT,EACA,cAAAlB,GACEd,KAAKY,gBAAkBZ,KAAKY,cAC9B,EACA,aAAAmB,GACE/B,KAAKY,gBAAiB,CACxB,GAEF,OAAA0B,GACEC,SAASC,iBAAiB,QAASxC,KAAK8B,oBAC1C,EACA,aAAAW,GACEF,SAASG,oBAAoB,QAAS1C,KAAK8B,oBAC7C,GCnFF,MAAM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,O,uECFA,KACE/B,IAAAA,GACE,MAAO,CACL4C,mBAAoB,EACpBC,qBAAsB,EACtBC,mBAAoB,KAEpBC,qBAAsB,KAE1B,EACAjB,SAAU,KACLkB,EAAAA,EAAAA,IAAW,CAAC,aAAc,iBAAkB,gBAC/CC,UAAAA,GACE,OAAOhD,KAAKiD,YAAYD,YAAc,GACxC,EACAE,SAAAA,GACE,OAAOlD,KAAKiD,YAAYC,WAAa,CACvC,EAEAC,wBAAAA,GACE,MAAO,8JAIT,EAEAC,sBAAAA,GACE,MAAO,0yBA4BT,GAGFC,MAAO,CAELlD,WAAAA,CAAYmD,EAAQC,GAEdD,IAAWC,GAAUvD,KAAK8C,sBAC5B9C,KAAKwD,UAAU,KACbxD,KAAKyD,sBACHzD,KAAK8C,qBAAqBY,UAC1B1D,KAAK8C,qBAAqBa,kBAC1B3D,KAAK8C,qBAAqBc,qBAC1B5D,KAAK8C,qBAAqBe,qBAIlC,GAGFvB,OAAAA,GAEEtC,KAAK8D,wBACP,EAEArB,aAAAA,GAEMzC,KAAK6C,oBACPkB,cAAc/D,KAAK6C,oBAGrB7C,KAAKgE,uBAAsB,GAE3BhE,KAAKiE,wBACP,EAEA5D,QAAS,CAIPyD,sBAAAA,GACE,MAAMI,EAAU,4BAChB,IAAK3B,SAAS4B,eAAeD,GAAU,CACrC,MAAMtF,EAAQ2D,SAAS6B,cAAc,SACrCxF,EAAMtB,GAAK4G,EACXtF,EAAMyF,YAAcrE,KAAKoD,uBACzBb,SAAS+B,KAAKC,YAAY3F,EAC5B,CACF,EAKAqF,sBAAAA,GACE,MAAMC,EAAU,4BACVM,EAAgBjC,SAAS4B,eAAeD,GAC1CM,GACFA,EAAcC,QAElB,EAMAC,wBAAAA,CAAyBC,GACvB,IAAKA,EAEH,YADAC,QAAQC,KAAK,cAKf,GAAItC,SAAS4B,eAAe,QAAU5B,SAAS4B,eAAe,OAC5D,OAIF,MAAMW,EAAMvC,SAAS6B,cAAc,OACnCU,EAAIxH,GAAK,MACTwH,EAAIC,UAAY,oBAChBD,EAAIE,IAAM,mBAGV,MAAMC,EAAM1C,SAAS6B,cAAc,OACnCa,EAAI3H,GAAK,MACT2H,EAAIF,UAAY,oBAChBE,EAAID,IAAM,mBAGVL,EAAUO,aAAaJ,EAAKH,EAAUQ,YACtCR,EAAUO,aAAaD,EAAKN,EAAUQ,WACxC,EAQAC,oBAAAA,CAAqB1B,EAAWC,EAAoB,SAAUC,GAAuB,EAAOC,GAAqB,GAE/G7D,KAAK8C,qBAAuB,CAC1BY,YACAC,oBACAC,uBACAC,sBAIF,MAAMc,EAAYpC,SAAS8C,cAAc1B,GACzC3D,KAAKsF,2BAA2BX,GAE5Bd,KACEc,GAAepC,SAAS4B,eAAe,QAAW5B,SAAS4B,eAAe,QAC5EnE,KAAK0E,yBAAyBC,IAIlC,MAAMG,EAAMvC,SAAS4B,eAAe,OAC9Bc,EAAM1C,SAAS4B,eAAe,OAEpC,IAAKW,IAAQG,EAEX,YADAL,QAAQC,KAAK,4DAIf,MAAMU,EAAmBvF,KAAKiD,aAAaS,GAElB,SAArB6B,EACFvF,KAAKwF,mBAAmBV,EAAKG,EAAKtB,GACzB8B,MAAMC,QAAQH,IAAqBA,EAAiBI,OAAS,EACtE3F,KAAK4F,6BAA6Bd,EAAKG,EAAKM,EAAkB5B,GACrD8B,MAAMC,QAAQH,IAAiD,IAA5BA,EAAiBI,OAC7D3F,KAAK6F,2BAA2Bf,EAAKS,EAAiB,GAAI5B,GACjDC,GACT5D,KAAK8F,sBAAsBhB,EAAKnB,EAEpC,EAKA6B,kBAAAA,CAAmBV,EAAKG,EAAKtB,GAC3B3D,KAAKC,OAAO8F,SAAS,uBAAuBC,KAAK,KACZ,IAA/BhG,KAAKiG,eAAeN,SAExB3F,KAAKkG,oBAAoBpB,EAAK9E,KAAKiG,eAAejG,KAAK2C,qBAAqBwD,IAAKxC,GAEjF3D,KAAK6C,mBAAqBuD,YAAY,KACpCpG,KAAKqG,oBAAoBvB,EAAKG,IAC7BjF,KAAKgD,cAEZ,EAKA4C,4BAAAA,CAA6Bd,EAAKG,EAAKqB,EAAY3C,GACjD3D,KAAKkG,oBAAoBpB,EAAKwB,EAAWtG,KAAK4C,sBAAuBe,GAErE3D,KAAK6C,mBAAqBuD,YAAY,KACpCpG,KAAKuG,sBAAsBzB,EAAKG,EAAKqB,IACpCtG,KAAKgD,WACV,EAKA6C,0BAAAA,CAA2Bf,EAAK0B,EAAc7C,GAC5C3D,KAAKkG,oBAAoBpB,EAAK0B,EAAc7C,EAC9C,EAKAmC,qBAAAA,CAAsBhB,EAAKnB,GAEzB,MAAM9E,EAASmB,KAAKG,YACdsG,EACFC,EADiB7H,EACT,MACA,MAEZmB,KAAKkG,oBAAoBpB,EAAK2B,EAAc9C,EAC9C,EAKAuC,mBAAAA,CAAoBS,EAAYC,EAAUjD,GAExCgD,EAAW/H,MAAMiI,QAAU,EAC3BF,EAAW/H,MAAMa,QAAU,EAC3B,MAAMkF,EAAYpC,SAAS8C,cAAc1B,GACzC3D,KAAKsF,2BAA2BX,GAEhC,MAAMmC,EAAYA,KAChBC,sBAAsB,KACpBA,sBAAsB,KACpBJ,EAAW/H,MAAMa,QAAUO,KAAKkD,eAKhC8D,EAAU,IAAIC,MACpBD,EAAQE,OAAS,KACfP,EAAWQ,IAAMP,EACjBE,KAEFE,EAAQI,QAAU,KAChBT,EAAWQ,IAAMP,EACjBE,KAEFE,EAAQG,IAAMP,CAChB,EAEAtB,0BAAAA,CAA2BX,GACzB,IAAKA,EAAW,OAEhB,MAAM0C,EAAgBC,OAAOC,iBAAiB5C,GACf,WAA3B0C,EAAcG,WAChB7C,EAAU/F,MAAM4I,SAAW,YAGA,SAAzBH,EAAcR,SAChBlC,EAAU/F,MAAMiI,OAAS,KAG3BlC,EAAU/F,MAAM6I,UAAY,SAC9B,EAKApB,mBAAAA,CAAoBvB,EAAKG,GACvB,GAAmC,IAA/BjF,KAAKiG,eAAeN,OAAc,OAEtC,MAAM+B,EAAoC,GAArB5C,EAAIlG,MAAMa,QACzBkI,EAAQD,EAAe5C,EAAMG,EAC7B2C,EAASF,EAAezC,EAAMH,EAEpC9E,KAAK2C,oBAAsB3C,KAAK2C,mBAAqB,GAAK3C,KAAKiG,eAAeN,OAC9E,MAAMkC,EAAU7H,KAAKiG,eAAejG,KAAK2C,qBAAqBwD,IAG9DwB,EAAM/I,MAAMiI,QAAU,EACtBe,EAAOhJ,MAAMiI,QAAU,EAEvB,MAAMG,EAAU,IAAIC,MACpBD,EAAQE,OAAS,KACfU,EAAOT,IAAMU,EAGbC,WAAW,KACTF,EAAOhJ,MAAMa,QAAUO,KAAKkD,UAG5B4E,WAAW,KACTH,EAAM/I,MAAMa,QAAU,GACrB,OACF,KAELuH,EAAQG,IAAMU,CAChB,EAKAtB,qBAAAA,CAAsBzB,EAAKG,EAAKqB,GAC9B,MAAMoB,EAAoC,GAArB5C,EAAIlG,MAAMa,QACzBkI,EAAQD,EAAe5C,EAAMG,EAC7B2C,EAASF,EAAezC,EAAMH,EAEpC9E,KAAK4C,sBAAwB5C,KAAK4C,qBAAuB,GAAK0D,EAAWX,OACzE,MAAMkC,EAAUvB,EAAWtG,KAAK4C,sBAGhC+E,EAAM/I,MAAMiI,QAAU,EACtBe,EAAOhJ,MAAMiI,QAAU,EAEvB,MAAMG,EAAU,IAAIC,MACpBD,EAAQE,OAAS,KACfU,EAAOT,IAAMU,EAEbC,WAAW,KACTF,EAAOhJ,MAAMa,QAAUO,KAAKkD,UAE5B4E,WAAW,KACTH,EAAM/I,MAAMa,QAAU,GACrB,OACF,KAELuH,EAAQG,IAAMU,CAChB,EAKAE,uBAAAA,GACM/H,KAAK6C,qBACPkB,cAAc/D,KAAK6C,oBACnB7C,KAAK6C,mBAAqB,KAE9B,EAMAmB,qBAAAA,CAAsBgE,GAAY,GAChC,MAAMlD,EAAMvC,SAAS4B,eAAe,OAC9Bc,EAAM1C,SAAS4B,eAAe,OAEhC6D,GAEElD,IACFA,EAAIlG,MAAMqJ,WAAa,OACvBnD,EAAIlG,MAAMa,QAAU,EACpBqF,EAAIqC,IAAM,GAEVW,WAAW,KACLhD,IAAKA,EAAIlG,MAAMqJ,WAAa,6BAC/B,KAEDhD,IACFA,EAAIrG,MAAMqJ,WAAa,OACvBhD,EAAIrG,MAAMa,QAAU,EACpBwF,EAAIkC,IAAM,GAEVW,WAAW,KACL7C,IAAKA,EAAIrG,MAAMqJ,WAAa,6BAC/B,OAIDnD,IACFA,EAAIlG,MAAMa,QAAU,EACpBqI,WAAW,KACLhD,IAAKA,EAAIqC,IAAM,KAClB,OAEDlC,IACFA,EAAIrG,MAAMa,QAAU,EACpBqI,WAAW,KACL7C,IAAKA,EAAIkC,IAAM,KAClB,OAGT,EASA1D,qBAAAA,CAAsBC,EAAWC,EAAoB,SAAUC,GAAuB,EAAOC,GAAqB,GAChH,MAAM0B,EAAmBvF,KAAKiD,aAAaS,GAG3C,IAAKE,QAA6CsE,IAArB3C,EAE3B,YADAvF,KAAKmI,uBAAuBzE,EAAWC,EAAmBC,EAAsBC,GAKlF,MAAMiB,EAAMvC,SAAS4B,eAAe,OAC9Bc,EAAM1C,SAAS4B,eAAe,OAEpC,IAAKW,IAAQG,EAGX,YADAjF,KAAKmI,uBAAuBzE,EAAWC,EAAmBC,EAAsBC,GAKlF,MAAMuE,EAAiC,GAArBtD,EAAIlG,MAAMa,QAAeqF,EAAMG,EAC3C2C,EAA8B,GAArB9C,EAAIlG,MAAMa,QAAewF,EAAMH,EAGxCjG,EAASmB,KAAKG,YACdkI,EACF3B,EADkB7H,EACV,MACA,MAGNyJ,EAAa,IAAIrB,MACvBqB,EAAWpB,OAAS,KAElBU,EAAOT,IAAMkB,EAGbT,EAAOV,OAAS,KAEdkB,EAAUxJ,MAAMa,QAAU,EAG1BqI,WAAW,KACTF,EAAOhJ,MAAMa,QAAUO,KAAKkD,WAC3B,MAIPoF,EAAWlB,QAAU,KAEnBxC,QAAQC,KAAK,sBACb7E,KAAKmI,uBAAuBzE,EAAWC,EAAmBC,EAAsBC,IAGlFyE,EAAWnB,IAAMkB,CACnB,EAKAF,sBAAAA,CAAuBzE,EAAWC,EAAoB,SAAUC,GAAuB,EAAOC,GAAqB,GACjH7D,KAAK+H,0BACL/H,KAAKgE,uBAAsB,GAC3BhE,KAAK2C,mBAAqB,EAC1B3C,KAAK4C,qBAAuB,EAG5BkF,WAAW,KACT9H,KAAKoF,qBAAqB1B,EAAWC,EAAmBC,EAAsBC,IAC7E,IACL,G,uECteJ,MAAMxG,EAAa,CAAC,SACb,SAASK,EAAOC,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACvD,OAAO,WAAc,QAAoB,OAAQ,CAC/CU,MAAO,oBACPT,QAASN,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAASuK,cAAgBvK,EAASuK,gBAAgBpK,IAClGqC,KAAM,SACNgI,MAAO7K,EAAK2D,GAAG,sBACd,EAAC,QAAarD,EAA8B,CAC7CS,KAAM,QACNC,MAAO,eACJ,EAAGtB,EACV,C,eCZA,GACEgB,KAAM,mBACNwD,SAAU,CACR,IAAA4G,GACE,MAA6B,UAAtBzI,KAAK0I,MAAMC,MACpB,GAEFtI,QAAS,CACP,YAAAkI,GACE,MAAMK,EAAO5I,KAAKyI,KAAO,KAAO,SAChC,QAAUG,EACZ,I,WCLJ,MAAMrI,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS7C,GAAQ,CAAC,YAAY,qBAEzF,O,2HCNA,IAAImL,GAAgB,EAELC,eAAeC,EAAc5C,EAAK6C,EAAU,CAAC,GAKxDA,EAAQC,YAAc,UAEtBD,EAAQE,QAAU,IACXF,EAAQE,SAGf,MAAMC,QAAiBC,MAAMjD,EAAK6C,GAWlC,OATwB,MAApBG,EAASE,QAAmBR,IAC5BA,GAAgB,EAChBS,EAAAA,EAAMhJ,OAAO,oBAAoB,GAEjCiJ,EAAAA,EAAOlH,KAAK,eAAemH,QAAQ,KAC/BX,GAAgB,KAIjBM,CACX,C","sources":["webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?bba2","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?7379","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?a53e","webpack://sanyue_imghub/./src/components/DashboardTabs.vue","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?1414","webpack://sanyue_imghub/./src/mixins/backgroundManager.js","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?0caa","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?90ec","webpack://sanyue_imghub/./src/utils/fetchWithAuth.js"],"sourcesContent":["import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMaskAdmin\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.3em\",\n height: \"1.3em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMaskAdmin)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.3em\",\n \"color\": \"var(--admin-theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./AdminToggleDark.vue?vue&type=template&id=5c149ed5&scoped=true\"\nimport script from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./AdminToggleDark.vue?vue&type=style&index=0&id=5c149ed5&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5c149ed5\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, withModifiers as _withModifiers } from \"vue\";\nconst _hoisted_1 = {\n class: \"tabs\"\n};\nconst _hoisted_2 = [\"aria-expanded\"];\nconst _hoisted_3 = {\n class: \"page-switcher-title\"\n};\nconst _hoisted_4 = {\n class: \"page-options\",\n role: \"menu\"\n};\nconst _hoisted_5 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_AdminToggleDark = _resolveComponent(\"AdminToggleDark\");\n const _component_LanguageSwitcher = _resolveComponent(\"LanguageSwitcher\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"page-switcher\", {\n 'is-open': $data.isPageMenuOpen\n }]),\n role: \"navigation\",\n onClick: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"button\", {\n class: \"title page-switcher-trigger\",\n type: \"button\",\n \"aria-expanded\": $data.isPageMenuOpen,\n onClick: _cache[0] || (_cache[0] = (...args) => $options.togglePageMenu && $options.togglePageMenu(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $options.iconName,\n class: \"fa-images\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString($options.titleName), 1), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"page-switcher-arrow\"\n })], 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_4, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.pageOptions, option => {\n return _openBlock(), _createElementBlock(\"button\", {\n key: option.name,\n class: _normalizeClass([\"page-option\", {\n 'is-active': $props.activeTab === option.name\n }]),\n type: \"button\",\n role: \"menuitem\",\n onClick: $event => $options.handleTabClick(option.name)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: option.icon,\n class: \"page-option-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t(option.label)), 1)], 10, _hoisted_5);\n }), 128))])], 2), _createVNode(_component_AdminToggleDark), _createVNode(_component_LanguageSwitcher, {\n class: \"tabs-language-switcher\"\n })]);\n}","import \"core-js/modules/es.array.push.js\";\nimport AdminToggleDark from './dashboard/AdminToggleDark.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nexport default {\n name: 'DashboardTabs',\n props: {\n activeTab: {\n type: String,\n default: 'dashboard'\n }\n },\n components: {\n AdminToggleDark,\n LanguageSwitcher\n },\n data() {\n return {\n isPageMenuOpen: false\n };\n },\n computed: {\n pageOptions() {\n return [{\n name: 'dashboard',\n icon: 'images',\n label: 'dashboardTabs.fileManagement'\n }, {\n name: 'customerConfig',\n icon: 'user-cog',\n label: 'dashboardTabs.userManagement'\n }, {\n name: 'systemConfig',\n icon: 'cogs',\n label: 'dashboardTabs.systemSettings'\n }, {\n name: '',\n icon: 'upload',\n label: 'dashboardTabs.fileUpload'\n }];\n },\n titleName() {\n if (this.activeTab === 'dashboard') {\n return this.$t('dashboardTabs.fileManagement');\n } else if (this.activeTab === 'customerConfig') {\n return this.$t('dashboardTabs.userManagement');\n } else if (this.activeTab === 'systemConfig') {\n return this.$t('dashboardTabs.systemSettings');\n } else {\n return this.$t('dashboardTabs.fileUpload');\n }\n },\n iconName() {\n if (this.activeTab === 'dashboard') {\n return 'images';\n } else if (this.activeTab === 'customerConfig') {\n return 'user-cog';\n } else if (this.activeTab === 'systemConfig') {\n return 'cogs';\n } else {\n return 'upload';\n }\n }\n },\n methods: {\n handleDocumentClick() {\n this.closePageMenu();\n },\n refreshDashboard() {\n location.reload();\n },\n handleTabClick(tab) {\n this.isPageMenuOpen = false;\n if (tab === this.activeTab) {\n this.refreshDashboard();\n return;\n }\n this.$router.push(`/${tab}`);\n },\n togglePageMenu() {\n this.isPageMenuOpen = !this.isPageMenuOpen;\n },\n closePageMenu() {\n this.isPageMenuOpen = false;\n }\n },\n mounted() {\n document.addEventListener('click', this.handleDocumentClick);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleDocumentClick);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DashboardTabs.vue?vue&type=template&id=74e008d5&scoped=true\"\nimport script from \"./DashboardTabs.vue?vue&type=script&lang=js\"\nexport * from \"./DashboardTabs.vue?vue&type=script&lang=js\"\n\nimport \"./DashboardTabs.vue?vue&type=style&index=0&id=74e008d5&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-74e008d5\"]])\n\nexport default __exports__","/**\r\n * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\r\n\r\nexport default {\r\n data() {\r\n return {\r\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\r\n // 存储初始化参数,用于主题切换时重新初始化\r\n backgroundInitParams: null,\r\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\r\n },\r\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\r\n this.$store.dispatch('fetchBingWallPapers').then(() => {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchBingWallpaper(bg1, bg2)\r\n }, this.bkInterval)\r\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\r\n }, this.bkInterval)\r\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector) {\r\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n imgElement.style.opacity = this.bkOpacity\r\n })\r\n })\r\n }\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.onerror = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.src = imageSrc\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2) {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\r\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\r\n\r\n // 【层级魔法】:让旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\r\n \r\n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers) {\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\r\n const nextUrl = wallpapers[this.customWallPaperIndex]\r\n\r\n // 旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n \r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (immediate) {\r\n // 立即清除,不使用过渡效果\r\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n } else {\r\n // 使用过渡效果淡出\r\n if (bg1) {\r\n bg1.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg1) bg1.src = ''\r\n }, 1200)\r\n }\r\n if (bg2) {\r\n bg2.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg2) bg2.src = ''\r\n }, 1200)\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\r\n preloadImg.onload = () => {\r\n // 设置下一个背景的图片源\r\n nextBg.src = newThemeImage\r\n \r\n // 等待图片加载完成后执行淡入淡出过渡\r\n nextBg.onload = () => {\r\n // 淡出当前背景\r\n currentBg.style.opacity = 0\r\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n }, 50) // 50ms 延迟,让淡出效果先开始\r\n }\r\n }\r\n \r\n preloadImg.onerror = () => {\r\n // 如果预加载失败,回退到直接重新初始化\r\n console.warn('主题背景图预加载失败,回退到直接切换')\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }\r\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"title\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", {\n class: \"language-switcher\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleLocale && $options.toggleLocale(...args)),\n role: \"button\",\n title: _ctx.$t('language.switchTo')\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n class: \"lang-icon\"\n })], 8, _hoisted_1);\n}","import { setLocale } from '@/locales';\nexport default {\n name: 'LanguageSwitcher',\n computed: {\n isZh() {\n return this.$i18n.locale === 'zh-CN';\n }\n },\n methods: {\n toggleLocale() {\n const next = this.isZh ? 'en' : 'zh-CN';\n setLocale(next);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./LanguageSwitcher.vue?vue&type=template&id=08567d0a&scoped=true\"\nimport script from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\nexport * from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\n\nimport \"./LanguageSwitcher.vue?vue&type=style&index=0&id=08567d0a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08567d0a\"]])\n\nexport default __exports__","import store from '@/store'\r\nimport router from '@/router'\r\n\r\nlet isRedirecting = false;\r\n\r\nexport default async function fetchWithAuth(url, options = {}) {\r\n // 开发环境下添加 /api 前缀\r\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\r\n\r\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\r\n options.credentials = 'include';\r\n\r\n options.headers = {\r\n ...options.headers,\r\n };\r\n\r\n const response = await fetch(url, options);\r\n\r\n if (response.status === 401 && !isRedirecting) {\r\n isRedirecting = true;\r\n store.commit('setAdminLoggedIn', false);\r\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\r\n router.push('/adminLogin').finally(() => {\r\n isRedirecting = false;\r\n });\r\n }\r\n\r\n return response;\r\n}\r\n"],"names":["_hoisted_1","id","_hoisted_2","_hoisted_3","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","onClick","args","handleToggleClick","name","mode","default","isAuto","key","icon","class","style","isDark","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","opacity","x1","y1","x2","y2","_","data","this","$store","getters","useDarkMode","cusDarkMode","methods","commit","__exports__","role","_hoisted_5","_component_AdminToggleDark","_component_LanguageSwitcher","isPageMenuOpen","type","togglePageMenu","iconName","titleName","pageOptions","option","activeTab","$event","handleTabClick","$t","label","props","String","components","AdminToggleDark","LanguageSwitcher","computed","handleDocumentClick","closePageMenu","refreshDashboard","location","reload","tab","$router","push","mounted","document","addEventListener","beforeUnmount","removeEventListener","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","mapGetters","bkInterval","userConfig","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","watch","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","injectBackgroundStyles","clearInterval","clearBackgroundImages","removeBackgroundStyles","styleId","getElementById","createElement","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","initializeBackground","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","length","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","defaultImage","require","imgElement","imageSrc","zIndex","showImage","requestAnimationFrame","preload","Image","onload","src","onerror","computedStyle","window","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","clearBackgroundInterval","immediate","transition","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg","toggleLocale","title","isZh","$i18n","locale","next","isRedirecting","async","fetchWithAuth","options","credentials","headers","response","fetch","status","store","router","finally"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/142.fc366b6d.js.map.gz b/frontend-dist/js/142.fc366b6d.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..ed041c3cdfaa1f56938f1dd7f56c77a4461e462d GIT binary patch literal 11910 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 MAC0W>8}O|F03x0%K>z>% literal 0 HcmV?d00001 diff --git a/frontend-dist/js/309.b7dca603.js b/frontend-dist/js/309.b7dca603.js deleted file mode 100644 index 750891f2..00000000 --- a/frontend-dist/js/309.b7dca603.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[309],{213:function(e,t,n){n(85331),n(19104)},4318:function(){},7835:function(e,t,n){e.exports=n.p+"img/background-light.f17603bc.jpg"},10456:function(e,t,n){n(85331)},10732:function(e,t,n){e.exports=n.p+"img/background.ea1b7ee7.jpg"},18785:function(e,t,n){n(85331)},19104:function(e,t,n){n(85331)},23597:function(e,t,n){n(85331)},30694:function(e,t,n){n(85331)},38736:function(e,t,n){n(85331)},40670:function(e,t,n){n(85331),n(99648),n(19104),n(85970)},48903:function(e,t,n){var a=n(60782);t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null}},computed:{...(0,a.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const n=document.createElement("img");n.id="bg2",n.className="background-image2",n.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(n,e.firstChild)},initializeBackground(e,t=".login",n=!1,a=!1){this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:n,autoCreateElements:a};const s=document.querySelector(t);this.prepareBackgroundContainer(s),a&&(!s||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(s));const i=document.getElementById("bg1"),o=document.getElementById("bg2");if(!i||!o)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const r=this.userConfig?.[e];"bing"===r?this.setupBingWallpaper(i,o,t):Array.isArray(r)&&r.length>1?this.setupCustomWallpaperCarousel(i,o,r,t):Array.isArray(r)&&1===r.length?this.setupSingleCustomWallpaper(i,r[0],t):n&&this.setupDefaultWallpaper(i,t)},setupBingWallpaper(e,t,n){this.$store.dispatch("fetchBingWallPapers").then(()=>{0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,n),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,n,a){this.loadBackgroundImage(e,n[this.customWallPaperIndex],a),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,n)},this.bkInterval)},setupSingleCustomWallpaper(e,t,n){this.loadBackgroundImage(e,t,n)},setupDefaultWallpaper(e,t){const a=this.useDarkMode,s=n(a?10732:7835);this.loadBackgroundImage(e,s,t)},loadBackgroundImage(e,t,n){e.style.zIndex=-1,e.style.opacity=0;const a=document.querySelector(n);this.prepareBackgroundContainer(a);const s=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.style.opacity=this.bkOpacity})})},i=new Image;i.onload=()=>{e.src=t,s()},i.onerror=()=>{e.src=t,s()},i.src=t},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t){if(0===this.bingWallPapers.length)return;const n=0!=e.style.opacity,a=n?e:t,s=n?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const i=this.bingWallPapers[this.bingWallPaperIndex]?.url;a.style.zIndex=-2,s.style.zIndex=-1;const o=new Image;o.onload=()=>{s.src=i,setTimeout(()=>{s.style.opacity=this.bkOpacity,setTimeout(()=>{a.style.opacity=0},1200)},50)},o.src=i},switchCustomWallpaper(e,t,n){const a=0!=e.style.opacity,s=a?e:t,i=a?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%n.length;const o=n[this.customWallPaperIndex];s.style.zIndex=-2,i.style.zIndex=-1;const r=new Image;r.onload=()=>{i.src=o,setTimeout(()=>{i.style.opacity=this.bkOpacity,setTimeout(()=>{s.style.opacity=0},1200)},50)},r.src=o},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),n=document.getElementById("bg2");e?(t&&(t.style.transition="none",t.style.opacity=0,t.src="",setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out")},50)),n&&(n.style.transition="none",n.style.opacity=0,n.src="",setTimeout(()=>{n&&(n.style.transition="opacity 1.2s ease-in-out")},50))):(t&&(t.style.opacity=0,setTimeout(()=>{t&&(t.src="")},1200)),n&&(n.style.opacity=0,setTimeout(()=>{n&&(n.src="")},1200)))},smoothThemeTransition(e,t=".login",a=!1,s=!1){const i=this.userConfig?.[e];if(!a||void 0!==i)return void this.reinitializeBackground(e,t,a,s);const o=document.getElementById("bg1"),r=document.getElementById("bg2");if(!o||!r)return void this.reinitializeBackground(e,t,a,s);const l=0!=o.style.opacity?o:r,c=0!=o.style.opacity?r:o,u=this.useDarkMode,d=n(u?10732:7835),g=new Image;g.onload=()=>{c.src=d,c.onload=()=>{l.style.opacity=0,setTimeout(()=>{c.style.opacity=this.bkOpacity},50)}},g.onerror=()=>{console.warn("主题背景图预加载失败,回退到直接切换"),this.reinitializeBackground(e,t,a,s)},g.src=d},reinitializeBackground(e,t=".login",n=!1,a=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,n,a)},100)}}}},54047:function(e,t,n){n.d(t,{A:function(){return u}});var a=n(56768);const s=["title"];function i(e,t,n,i,o,r){const l=(0,a.g2)("font-awesome-icon");return(0,a.uX)(),(0,a.CE)("span",{class:"language-switcher",onClick:t[0]||(t[0]=(...e)=>r.toggleLocale&&r.toggleLocale(...e)),role:"button",title:e.$t("language.switchTo")},[(0,a.bF)(l,{icon:"globe",class:"lang-icon"})],8,s)}var o=n(46638),r={name:"LanguageSwitcher",computed:{isZh(){return"zh-CN"===this.$i18n.locale}},methods:{toggleLocale(){const e=this.isZh?"en":"zh-CN";(0,o.xS)(e)}}},l=n(71241);const c=(0,l.A)(r,[["render",i],["__scopeId","data-v-08567d0a"]]);var u=c},67819:function(e,t,n){n(85331)},70797:function(e,t,n){n.d(t,{A:function(){return o}});n(44114);var a=n(25507),s=n(16915);let i=!1;async function o(e,t={}){t.credentials="include",t.headers={...t.headers};const n=await fetch(e,t);return 401!==n.status||i||(i=!0,a.A.commit("setAdminLoggedIn",!1),s.A.push("/adminLogin").finally(()=>{i=!1})),n}},77128:function(e,t,n){n(85331),n(4318)},78450:function(e,t,n){n(85331)},85970:function(e,t,n){n(85331)},88830:function(e,t,n){n(85331)},96808:function(e,t,n){n(85331),n(18785),n(67819),n(85970),n(19104)},97247:function(e,t,n){n.d(t,{A:function(){return C}});var a=n(54047),s=n(56768),i=n(45130),o=n(24232);const r={id:"themeMaskAdmin"},l=["cx","cy","r"],c=["r"],u=["opacity"];function d(e,t,n,a,d,g){const m=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{id:"themeToggle",onClick:t[0]||(t[0]=(...e)=>g.handleToggleClick&&g.handleToggleClick(...e))},[(0,s.bF)(i.eB,{name:"icon-fade",mode:"out-in"},{default:(0,s.k6)(()=>[d.isAuto?((0,s.uX)(),(0,s.Wv)(m,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.3em",color:"var(--admin-theme-toggle-color)"}})):((0,s.uX)(),(0,s.CE)("svg",{key:"sun-moon",class:(0,o.C4)(["theme_toggle_svg",{dark:d.isDark}]),width:"1.3em",height:"1.3em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,s.Lk)("mask",r,[t[1]||(t[1]=(0,s.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,s.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:d.isDark?"50%":"100%",cy:d.isDark?"23%":"0%",r:d.isDark?"9":"5"},null,8,l)]),(0,s.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:d.isDark?"9":"5",mask:"url(#themeMaskAdmin)"},null,8,c),(0,s.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:d.isDark?0:1},[...t[2]||(t[2]=[(0,s.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,s.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,s.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,u)],2))]),_:1})])}var g={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},m=n(71241);const h=(0,m.A)(g,[["render",d],["__scopeId","data-v-5c149ed5"]]);var p=h,k=n(62086);n(85331),n(40670),n(88830),n(23597);const b={class:"tabs"},y={class:"tabs-dropdown-link"};function f(e,t,n,i,r,l){const c=(0,s.g2)("font-awesome-icon"),u=k.c6,d=k.Iy,g=k.dW,m=p,h=a.A;return(0,s.uX)(),(0,s.CE)("div",b,[(0,s.Lk)("span",{class:"title",onClick:t[0]||(t[0]=(...e)=>l.refreshDashboard&&l.refreshDashboard(...e))},[(0,s.bF)(c,{icon:l.iconName,class:"fa-images"},null,8,["icon"]),(0,s.eW)(" "+(0,o.v_)(l.titleName),1)]),(0,s.bF)(g,{onCommand:l.handleTabClick,class:"tabs-dropdown",role:"navigation",onVisibleChange:l.handleDropdownVisible,"popper-class":"tabs-dropdown-popper"},{dropdown:(0,s.k6)(()=>[(0,s.bF)(d,null,{default:(0,s.k6)(()=>["dashboard"!==n.activeTab?((0,s.uX)(),(0,s.Wv)(u,{key:0,command:"dashboard"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{icon:"images",style:{"margin-right":"5px",width:"16px"}}),(0,s.eW)(" "+(0,o.v_)(e.$t("dashboardTabs.fileManagement")),1)]),_:1})):(0,s.Q3)("",!0),"customerConfig"!==n.activeTab?((0,s.uX)(),(0,s.Wv)(u,{key:1,command:"customerConfig"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{icon:"user-cog",style:{"margin-right":"5px",width:"16px"}}),(0,s.eW)(" "+(0,o.v_)(e.$t("dashboardTabs.userManagement")),1)]),_:1})):(0,s.Q3)("",!0),"systemConfig"!==n.activeTab?((0,s.uX)(),(0,s.Wv)(u,{key:2,command:"systemConfig"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{icon:"cogs",style:{"margin-right":"5px",width:"16px"}}),(0,s.eW)(" "+(0,o.v_)(e.$t("dashboardTabs.systemSettings")),1)]),_:1})):(0,s.Q3)("",!0),(0,s.bF)(u,{command:""},{default:(0,s.k6)(()=>[(0,s.bF)(c,{icon:"upload",style:{"margin-right":"5px",width:"16px"}}),(0,s.eW)(" "+(0,o.v_)(e.$t("dashboardTabs.fileUpload")),1)]),_:1})]),_:1})]),default:(0,s.k6)(()=>[(0,s.Lk)("span",y,[(0,s.bF)(c,{icon:"bars",class:"tabs-arrow"})])]),_:1},8,["onCommand","onVisibleChange"]),(0,s.bF)(m),(0,s.bF)(h,{class:"tabs-language-switcher"})])}n(44114);var I={name:"DashboardTabs",props:{activeTab:{type:String,default:"dashboard"}},components:{AdminToggleDark:p,LanguageSwitcher:a.A},computed:{titleName(){return"dashboard"===this.activeTab?this.$t("dashboardTabs.fileManagement"):"customerConfig"===this.activeTab?this.$t("dashboardTabs.userManagement"):"systemConfig"===this.activeTab?this.$t("dashboardTabs.systemSettings"):this.$t("dashboardTabs.fileUpload")},iconName(){return"dashboard"===this.activeTab?"images":"customerConfig"===this.activeTab?"user-cog":"systemConfig"===this.activeTab?"cogs":"upload"}},methods:{refreshDashboard(){location.reload()},handleTabClick(e){this.$router.push(`/${e}`)},handleDropdownVisible(e){const t=document.querySelector(".tabs-dropdown-link");e?t.classList.add("rotate-up"):t.classList.remove("rotate-up")}}};const v=(0,m.A)(I,[["render",f],["__scopeId","data-v-4e00471a"]]);var C=v}}]); -//# sourceMappingURL=309.b7dca603.js.map \ No newline at end of file diff --git a/frontend-dist/js/309.b7dca603.js.gz b/frontend-dist/js/309.b7dca603.js.gz deleted file mode 100644 index db2315786c086fcb28ef8d3ee00c6b3c3d26a893..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4310 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 E0EdowtN;K2 diff --git a/frontend-dist/js/309.b7dca603.js.map b/frontend-dist/js/309.b7dca603.js.map deleted file mode 100644 index 2608c77a..00000000 --- a/frontend-dist/js/309.b7dca603.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/309.b7dca603.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/mixins/backgroundManager.js","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?0caa","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?90ec","webpack://sanyue_imghub/./src/utils/fetchWithAuth.js","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?bba2","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?7379","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?4056","webpack://sanyue_imghub/./src/components/DashboardTabs.vue","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?1414"],"sourcesContent":["/**\r\n * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\r\n\r\nexport default {\r\n data() {\r\n return {\r\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\r\n // 存储初始化参数,用于主题切换时重新初始化\r\n backgroundInitParams: null,\r\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\r\n },\r\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\r\n this.$store.dispatch('fetchBingWallPapers').then(() => {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchBingWallpaper(bg1, bg2)\r\n }, this.bkInterval)\r\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\r\n }, this.bkInterval)\r\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector) {\r\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n imgElement.style.opacity = this.bkOpacity\r\n })\r\n })\r\n }\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.onerror = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.src = imageSrc\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2) {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\r\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\r\n\r\n // 【层级魔法】:让旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\r\n \r\n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers) {\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\r\n const nextUrl = wallpapers[this.customWallPaperIndex]\r\n\r\n // 旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n \r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (immediate) {\r\n // 立即清除,不使用过渡效果\r\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n } else {\r\n // 使用过渡效果淡出\r\n if (bg1) {\r\n bg1.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg1) bg1.src = ''\r\n }, 1200)\r\n }\r\n if (bg2) {\r\n bg2.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg2) bg2.src = ''\r\n }, 1200)\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\r\n preloadImg.onload = () => {\r\n // 设置下一个背景的图片源\r\n nextBg.src = newThemeImage\r\n \r\n // 等待图片加载完成后执行淡入淡出过渡\r\n nextBg.onload = () => {\r\n // 淡出当前背景\r\n currentBg.style.opacity = 0\r\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n }, 50) // 50ms 延迟,让淡出效果先开始\r\n }\r\n }\r\n \r\n preloadImg.onerror = () => {\r\n // 如果预加载失败,回退到直接重新初始化\r\n console.warn('主题背景图预加载失败,回退到直接切换')\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }\r\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"title\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", {\n class: \"language-switcher\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleLocale && $options.toggleLocale(...args)),\n role: \"button\",\n title: _ctx.$t('language.switchTo')\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n class: \"lang-icon\"\n })], 8, _hoisted_1);\n}","import { setLocale } from '@/locales';\nexport default {\n name: 'LanguageSwitcher',\n computed: {\n isZh() {\n return this.$i18n.locale === 'zh-CN';\n }\n },\n methods: {\n toggleLocale() {\n const next = this.isZh ? 'en' : 'zh-CN';\n setLocale(next);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./LanguageSwitcher.vue?vue&type=template&id=08567d0a&scoped=true\"\nimport script from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\nexport * from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\n\nimport \"./LanguageSwitcher.vue?vue&type=style&index=0&id=08567d0a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08567d0a\"]])\n\nexport default __exports__","import store from '@/store'\r\nimport router from '@/router'\r\n\r\nlet isRedirecting = false;\r\n\r\nexport default async function fetchWithAuth(url, options = {}) {\r\n // 开发环境下添加 /api 前缀\r\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\r\n\r\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\r\n options.credentials = 'include';\r\n\r\n options.headers = {\r\n ...options.headers,\r\n };\r\n\r\n const response = await fetch(url, options);\r\n\r\n if (response.status === 401 && !isRedirecting) {\r\n isRedirecting = true;\r\n store.commit('setAdminLoggedIn', false);\r\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\r\n router.push('/adminLogin').finally(() => {\r\n isRedirecting = false;\r\n });\r\n }\r\n\r\n return response;\r\n}\r\n","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMaskAdmin\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.3em\",\n height: \"1.3em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMaskAdmin)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.3em\",\n \"color\": \"var(--admin-theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./AdminToggleDark.vue?vue&type=template&id=5c149ed5&scoped=true\"\nimport script from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./AdminToggleDark.vue?vue&type=style&index=0&id=5c149ed5&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5c149ed5\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"tabs\"\n};\nconst _hoisted_2 = {\n class: \"tabs-dropdown-link\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_AdminToggleDark = _resolveComponent(\"AdminToggleDark\");\n const _component_LanguageSwitcher = _resolveComponent(\"LanguageSwitcher\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"span\", {\n class: \"title\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.refreshDashboard && $options.refreshDashboard(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $options.iconName,\n class: \"fa-images\"\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($options.titleName), 1)]), _createVNode(_component_el_dropdown, {\n onCommand: $options.handleTabClick,\n class: \"tabs-dropdown\",\n role: \"navigation\",\n onVisibleChange: $options.handleDropdownVisible,\n \"popper-class\": \"tabs-dropdown-popper\"\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [$props.activeTab !== 'dashboard' ? (_openBlock(), _createBlock(_component_el_dropdown_item, {\n key: 0,\n command: \"dashboard\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"images\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.fileManagement')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), $props.activeTab !== 'customerConfig' ? (_openBlock(), _createBlock(_component_el_dropdown_item, {\n key: 1,\n command: \"customerConfig\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"user-cog\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.userManagement')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), $props.activeTab !== 'systemConfig' ? (_openBlock(), _createBlock(_component_el_dropdown_item, {\n key: 2,\n command: \"systemConfig\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cogs\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.systemSettings')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), _createVNode(_component_el_dropdown_item, {\n command: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.fileUpload')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_2, [_createVNode(_component_font_awesome_icon, {\n icon: \"bars\",\n class: \"tabs-arrow\"\n })])]),\n _: 1\n }, 8, [\"onCommand\", \"onVisibleChange\"]), _createVNode(_component_AdminToggleDark), _createVNode(_component_LanguageSwitcher, {\n class: \"tabs-language-switcher\"\n })]);\n}","import \"core-js/modules/es.array.push.js\";\nimport AdminToggleDark from './dashboard/AdminToggleDark.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nexport default {\n name: 'DashboardTabs',\n props: {\n activeTab: {\n type: String,\n default: 'dashboard'\n }\n },\n components: {\n AdminToggleDark,\n LanguageSwitcher\n },\n computed: {\n titleName() {\n if (this.activeTab === 'dashboard') {\n return this.$t('dashboardTabs.fileManagement');\n } else if (this.activeTab === 'customerConfig') {\n return this.$t('dashboardTabs.userManagement');\n } else if (this.activeTab === 'systemConfig') {\n return this.$t('dashboardTabs.systemSettings');\n } else {\n return this.$t('dashboardTabs.fileUpload');\n }\n },\n iconName() {\n if (this.activeTab === 'dashboard') {\n return 'images';\n } else if (this.activeTab === 'customerConfig') {\n return 'user-cog';\n } else if (this.activeTab === 'systemConfig') {\n return 'cogs';\n } else {\n return 'upload';\n }\n }\n },\n methods: {\n refreshDashboard() {\n location.reload();\n },\n handleTabClick(tab) {\n this.$router.push(`/${tab}`);\n },\n handleDropdownVisible(isVisible) {\n const arrow = document.querySelector('.tabs-dropdown-link');\n if (isVisible) {\n arrow.classList.add('rotate-up'); // 添加旋转类\n } else {\n arrow.classList.remove('rotate-up'); // 移除旋转类\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DashboardTabs.vue?vue&type=template&id=4e00471a&scoped=true\"\nimport script from \"./DashboardTabs.vue?vue&type=script&lang=js\"\nexport * from \"./DashboardTabs.vue?vue&type=script&lang=js\"\n\nimport \"./DashboardTabs.vue?vue&type=style&index=0&id=4e00471a&scoped=true&lang=css\"\nimport \"./DashboardTabs.vue?vue&type=style&index=1&id=4e00471a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4e00471a\"]])\n\nexport default __exports__"],"names":["data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","computed","mapGetters","bkInterval","this","userConfig","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","mounted","injectBackgroundStyles","beforeUnmount","clearInterval","clearBackgroundImages","removeBackgroundStyles","methods","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","initializeBackground","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","length","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","zIndex","opacity","showImage","requestAnimationFrame","preload","Image","onload","src","onerror","computedStyle","window","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","clearBackgroundInterval","immediate","transition","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg","_hoisted_1","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","class","onClick","args","toggleLocale","role","title","$t","icon","name","isZh","$i18n","locale","next","__exports__","isRedirecting","async","fetchWithAuth","options","credentials","headers","response","fetch","status","store","commit","router","push","finally","_hoisted_2","_hoisted_3","_hoisted_4","handleToggleClick","mode","default","isAuto","key","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","x1","y1","x2","y2","_","getters","cusDarkMode","_component_el_dropdown_item","_component_el_dropdown_menu","_component_el_dropdown","_component_AdminToggleDark","_component_LanguageSwitcher","refreshDashboard","iconName","titleName","onCommand","handleTabClick","onVisibleChange","handleDropdownVisible","dropdown","activeTab","command","props","type","String","components","AdminToggleDark","LanguageSwitcher","location","reload","tab","$router","isVisible","arrow","classList","add"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/309.b7dca603.js.map.gz b/frontend-dist/js/309.b7dca603.js.map.gz deleted file mode 100644 index 1b25cec6c2d9cec853cb6b06da102b52ee6675a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11806 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 M02}~Fd6=;P0GALy0ssI2 diff --git a/frontend-dist/js/396.226339af.js.gz b/frontend-dist/js/396.226339af.js.gz deleted file mode 100644 index b32735364839ffc56a98e557ce38e7bb773d37c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2760 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 OE&m^t;Y2lK8~^}{rfYlv diff --git a/frontend-dist/js/396.226339af.js.map.gz b/frontend-dist/js/396.226339af.js.map.gz deleted file mode 100644 index aba4d09ce07ff925a94fe8756f552d7f835726b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7044 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 diff --git a/frontend-dist/js/396.226339af.js b/frontend-dist/js/396.b3b6ae37.js similarity index 98% rename from frontend-dist/js/396.226339af.js rename to frontend-dist/js/396.b3b6ae37.js index 0389d2a8..b0226e07 100644 --- a/frontend-dist/js/396.226339af.js +++ b/frontend-dist/js/396.b3b6ae37.js @@ -1,2 +1,2 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[396],{5802:function(e,a,t){t(85331),t(38736),t(213),t(85970)},59396:function(e,a,t){t.r(a),t.d(a,{default:function(){return F}});var i=t(99114),n=(t(85331),t(30694),t(80047)),o=(t(99648),t(77815)),l=(t(72907),t(55558)),s=(t(10456),t(84757)),d=(t(5802),t(57009)),r=(t(78450),t(64752),t(54880)),c=(t(77128),t(78507)),u=(t(213),t(97247)),p=t(56768),g=t(24232);const h={class:"container"},m={class:"header-content"},f={class:"header-action"},b={class:"main-container"},C={style:{margin:"8px"}},y={style:{"text-align":"center"}},k=["src"],w={key:2,style:{width:"100px",height:"100px",display:"flex","justify-content":"center","align-items":"center"}},L={class:"pagination-container"};function v(e,a,t,v,T,$){const x=u.A,S=(0,p.g2)("font-awesome-icon"),D=c.R7,F=r.bZ,E=s.o8,_=d.Zq,z=s.Up,A=l.qi,P=o.aQ,W=n.S2,X=i.A;return(0,p.uX)(),(0,p.CE)("div",h,[(0,p.bF)(F,null,{default:(0,p.k6)(()=>[(0,p.Lk)("div",m,[(0,p.bF)(x,{activeTab:"customerConfig"}),(0,p.Lk)("div",f,[(0,p.bF)(D,{disabled:$.disableTooltip,content:e.$t("sysConfig.logout"),placement:"bottom"},{default:(0,p.k6)(()=>[(0,p.bF)(S,{icon:"sign-out-alt",class:"header-icon",onClick:$.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,p.Lk)("div",b,[(0,p.bo)(((0,p.uX)(),(0,p.Wv)(z,{data:$.paginatedData,"default-sort":{prop:"count",order:"descending"},"row-key":"ip",class:"main-table","table-layout":"fixed",onExpandChange:$.handleExpandChange},{default:(0,p.k6)(()=>[(0,p.bF)(E,{type:"expand"},{default:(0,p.k6)(a=>[(0,p.Lk)("div",C,[(0,p.Lk)("h3",y,(0,g.v_)(e.$t("customerConfig.uploadFileList")),1),(0,p.bo)(((0,p.uX)(),(0,p.Wv)(z,{data:a.row.data,style:{width:"100%"},"default-sort":{prop:"metadata.TimeStamp",order:"descending"},"table-layout":"fixed","max-height":400},{default:(0,p.k6)(()=>[(0,p.bF)(E,{prop:"metadata.FileName",label:e.$t("customerConfig.fileNameCol")},null,8,["label"]),(0,p.bF)(E,{label:e.$t("customerConfig.filePreview")},{default:(0,p.k6)(({row:e})=>[e.metadata?.FileType?.includes("image")?((0,p.uX)(),(0,p.Wv)(_,{key:0,src:"/file/"+e.id+"?from=admin",fit:"cover",lazy:"",style:{width:"100px",height:"100px"}},null,8,["src"])):e.metadata?.FileType?.includes("video")?((0,p.uX)(),(0,p.CE)("video",{key:1,src:"/file/"+e.id+"?from=admin",controls:"",style:{width:"100px",height:"100px"}},null,8,k)):((0,p.uX)(),(0,p.CE)("div",w,[(0,p.bF)(S,{icon:"file",style:{"font-size":"2em"}})]))]),_:1},8,["label"]),(0,p.bF)(E,{formatter:$.formatTimeStamp,label:e.$t("customerConfig.uploadTimeCol"),prop:"metadata.TimeStamp",sortable:"","sort-method":$.sortByTimestamp},{default:(0,p.k6)(({row:e})=>[(0,p.eW)((0,g.v_)($.formatTimeStamp(e.metadata.TimeStamp)),1)]),_:1},8,["formatter","label","sort-method"])]),_:1},8,["data"])),[[X,a.row.filesLoading]])])]),_:1}),(0,p.bF)(E,{prop:"ip",label:e.$t("customerConfig.ipAddress")},null,8,["label"]),(0,p.bF)(E,{prop:"address",label:e.$t("customerConfig.address")},null,8,["label"]),(0,p.bF)(E,{prop:"count",label:e.$t("customerConfig.uploadCount"),sortable:""},null,8,["label"]),(0,p.bF)(E,{label:e.$t("customerConfig.allowUpload")},{default:(0,p.k6)(({row:a})=>[(0,p.bF)(A,{modelValue:a.enable,"onUpdate:modelValue":e=>a.enable=e,"active-color":"#13ce66","inactive-color":"#ff4949","active-text":e.$t("customerConfig.allow"),"inactive-text":e.$t("customerConfig.deny"),onChange:e=>$.handleSwitchEnable(a)},null,8,["modelValue","onUpdate:modelValue","active-text","inactive-text","onChange"])]),_:1},8,["label"])]),_:1},8,["data","onExpandChange"])),[[X,T.loading]]),(0,p.Lk)("div",L,[(0,p.bF)(P,{background:"",layout:"prev, pager, next",total:T.dealedData.length,"current-page":T.currentPage,"page-size":T.pageSize,"pager-count":$.pagerCount,onCurrentChange:$.handlePageChange},null,8,["total","current-page","page-size","pager-count","onCurrentChange"]),T.currentPage===Math.ceil(T.dealedData.length/T.pageSize)?((0,p.uX)(),(0,p.Wv)(W,{key:0,type:"primary",onClick:$.loadMoreData,loading:T.loading,class:"load-more"},{default:(0,p.k6)(()=>[(0,p.eW)((0,g.v_)(e.$t("customerConfig.loadMore")),1)]),_:1},8,["onClick","loading"])):(0,p.Q3)("",!0)])])])}t(44114),t(18111),t(22489),t(61701),t(13579),t(33110);var T=t(70797),$=t(48903),x={name:"CustomerConfig",mixins:[$.A],data(){return{tableData:[],dealedData:[],blockipList:[],loading:!1,currentPage:1,pageSize:10}},components:{DashboardTabs:u.A},computed:{disableTooltip(){return window.innerWidth<768},pagerCount(){return window.innerWidth<768?3:7},paginatedData(){const e=(this.currentPage-1)*this.pageSize,a=e+this.pageSize;return this.dealedData.slice(e,a)}},methods:{handleLogout(){const e="/api/auth/logout";fetch(e,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:"admin"})}).finally(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")})},formatTimeStamp(e){return new Date(e).toLocaleString()},sortByTimestamp(e,a){return new Date(e.metadata.TimeStamp)-new Date(a.metadata.TimeStamp)},async handleSwitchEnable(e){const a=e.ip,t=e.enable;t?(this.blockipList=this.blockipList.filter(e=>e!==a),await(0,T.A)("/api/manage/cusConfig/whiteip",{method:"POST",body:a})):(this.blockipList.push(a),await(0,T.A)("/api/manage/cusConfig/blockip",{method:"POST",body:a}))},handlePageChange(e){this.currentPage=e,e===Math.ceil(this.dealedData.length/this.pageSize)&&this.loadMoreData()},async handleExpandChange(e,a){if(a.some(a=>a.ip===e.ip)&&!e.filesLoaded&&!e.filesLoading){e.filesLoading=!0;try{const a=await(0,T.A)(`/api/manage/cusConfig/files?ip=${encodeURIComponent(e.ip)}&count=${e.count}`,{method:"GET"}),t=await a.json();e.data=(t.data||[]).sort(this.sortByTimestamp).reverse(),e.filesLoaded=!0}catch(t){this.$message.error(this.$t("customerConfig.loadError"))}finally{e.filesLoading=!1}}},loadMoreData(){this.loading=!0;const e=this.dealedData.length,a=20;(0,T.A)(`/api/manage/cusConfig/list?start=${e}&count=${a}`,{method:"GET"}).then(e=>e.json()).then(e=>{this.dealedData=this.dealedData.concat(e.map(e=>{const a=!this.blockipList.includes(e.ip);return{ip:e.ip,address:e.address,count:e.count,data:[],filesLoaded:!1,filesLoading:!1,enable:a}}))}).catch(()=>{this.$message.error(this.$t("customerConfig.loadError"))}).finally(()=>{this.loading=!1})},handleSizeChange(e){this.pageSize=e,this.currentPage=1}},mounted(){this.initializeBackground("adminBkImg",".container",!1,!0),this.loading=!0,this.showLogoutButton=this.$store.state.adminLoggedIn,(0,T.A)("/api/manage/cusConfig/list?count=20",{method:"GET"}).then(e=>e.json()).then(async e=>{const a=await(0,T.A)("/api/manage/cusConfig/blockipList",{method:"GET"});this.blockipList=(await a.text()).split(","),this.dealedData=e.map(e=>{const a=!this.blockipList.includes(e.ip);return{ip:e.ip,address:e.address,count:e.count,data:[],filesLoaded:!1,filesLoading:!1,enable:a}})}).catch(e=>{"Unauthorized"!==e.message&&this.$message.error(this.$t("customerConfig.syncError"))}).finally(()=>{this.loading=!1})}},S=t(71241);const D=(0,S.A)(x,[["render",v],["__scopeId","data-v-47645a4d"]]);var F=D},64752:function(e,a,t){t(85331),t(38736),t(18785)},72907:function(e,a,t){t(85331),t(96808),t(29092)}}]); -//# sourceMappingURL=396.226339af.js.map \ No newline at end of file +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[396],{5802:function(e,a,t){t(85331),t(38736),t(213),t(85970)},59396:function(e,a,t){t.r(a),t.d(a,{default:function(){return F}});var i=t(99114),n=(t(85331),t(30694),t(80047)),o=(t(99648),t(77815)),l=(t(72907),t(55558)),s=(t(10456),t(84757)),d=(t(5802),t(57009)),r=(t(78450),t(64752),t(54880)),c=(t(77128),t(78507)),u=(t(213),t(36600)),p=t(56768),g=t(24232);const h={class:"container"},m={class:"header-content"},f={class:"header-action"},b={class:"main-container"},C={style:{margin:"8px"}},y={style:{"text-align":"center"}},k=["src"],w={key:2,style:{width:"100px",height:"100px",display:"flex","justify-content":"center","align-items":"center"}},L={class:"pagination-container"};function v(e,a,t,v,T,$){const x=u.A,S=(0,p.g2)("font-awesome-icon"),D=c.R7,F=r.bZ,E=s.o8,_=d.Zq,z=s.Up,A=l.qi,P=o.aQ,W=n.S2,X=i.A;return(0,p.uX)(),(0,p.CE)("div",h,[(0,p.bF)(F,null,{default:(0,p.k6)(()=>[(0,p.Lk)("div",m,[(0,p.bF)(x,{activeTab:"customerConfig"}),(0,p.Lk)("div",f,[(0,p.bF)(D,{disabled:$.disableTooltip,content:e.$t("sysConfig.logout"),placement:"bottom"},{default:(0,p.k6)(()=>[(0,p.bF)(S,{icon:"sign-out-alt",class:"header-icon",onClick:$.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,p.Lk)("div",b,[(0,p.bo)(((0,p.uX)(),(0,p.Wv)(z,{data:$.paginatedData,"default-sort":{prop:"count",order:"descending"},"row-key":"ip",class:"main-table","table-layout":"fixed",onExpandChange:$.handleExpandChange},{default:(0,p.k6)(()=>[(0,p.bF)(E,{type:"expand"},{default:(0,p.k6)(a=>[(0,p.Lk)("div",C,[(0,p.Lk)("h3",y,(0,g.v_)(e.$t("customerConfig.uploadFileList")),1),(0,p.bo)(((0,p.uX)(),(0,p.Wv)(z,{data:a.row.data,style:{width:"100%"},"default-sort":{prop:"metadata.TimeStamp",order:"descending"},"table-layout":"fixed","max-height":400},{default:(0,p.k6)(()=>[(0,p.bF)(E,{prop:"metadata.FileName",label:e.$t("customerConfig.fileNameCol")},null,8,["label"]),(0,p.bF)(E,{label:e.$t("customerConfig.filePreview")},{default:(0,p.k6)(({row:e})=>[e.metadata?.FileType?.includes("image")?((0,p.uX)(),(0,p.Wv)(_,{key:0,src:"/file/"+e.id+"?from=admin",fit:"cover",lazy:"",style:{width:"100px",height:"100px"}},null,8,["src"])):e.metadata?.FileType?.includes("video")?((0,p.uX)(),(0,p.CE)("video",{key:1,src:"/file/"+e.id+"?from=admin",controls:"",style:{width:"100px",height:"100px"}},null,8,k)):((0,p.uX)(),(0,p.CE)("div",w,[(0,p.bF)(S,{icon:"file",style:{"font-size":"2em"}})]))]),_:1},8,["label"]),(0,p.bF)(E,{formatter:$.formatTimeStamp,label:e.$t("customerConfig.uploadTimeCol"),prop:"metadata.TimeStamp",sortable:"","sort-method":$.sortByTimestamp},{default:(0,p.k6)(({row:e})=>[(0,p.eW)((0,g.v_)($.formatTimeStamp(e.metadata.TimeStamp)),1)]),_:1},8,["formatter","label","sort-method"])]),_:1},8,["data"])),[[X,a.row.filesLoading]])])]),_:1}),(0,p.bF)(E,{prop:"ip",label:e.$t("customerConfig.ipAddress")},null,8,["label"]),(0,p.bF)(E,{prop:"address",label:e.$t("customerConfig.address")},null,8,["label"]),(0,p.bF)(E,{prop:"count",label:e.$t("customerConfig.uploadCount"),sortable:""},null,8,["label"]),(0,p.bF)(E,{label:e.$t("customerConfig.allowUpload")},{default:(0,p.k6)(({row:a})=>[(0,p.bF)(A,{modelValue:a.enable,"onUpdate:modelValue":e=>a.enable=e,"active-color":"#13ce66","inactive-color":"#ff4949","active-text":e.$t("customerConfig.allow"),"inactive-text":e.$t("customerConfig.deny"),onChange:e=>$.handleSwitchEnable(a)},null,8,["modelValue","onUpdate:modelValue","active-text","inactive-text","onChange"])]),_:1},8,["label"])]),_:1},8,["data","onExpandChange"])),[[X,T.loading]]),(0,p.Lk)("div",L,[(0,p.bF)(P,{background:"",layout:"prev, pager, next",total:T.dealedData.length,"current-page":T.currentPage,"page-size":T.pageSize,"pager-count":$.pagerCount,onCurrentChange:$.handlePageChange},null,8,["total","current-page","page-size","pager-count","onCurrentChange"]),T.currentPage===Math.ceil(T.dealedData.length/T.pageSize)?((0,p.uX)(),(0,p.Wv)(W,{key:0,type:"primary",onClick:$.loadMoreData,loading:T.loading,class:"load-more"},{default:(0,p.k6)(()=>[(0,p.eW)((0,g.v_)(e.$t("customerConfig.loadMore")),1)]),_:1},8,["onClick","loading"])):(0,p.Q3)("",!0)])])])}t(44114),t(18111),t(22489),t(61701),t(13579),t(33110);var T=t(70797),$=t(48903),x={name:"CustomerConfig",mixins:[$.A],data(){return{tableData:[],dealedData:[],blockipList:[],loading:!1,currentPage:1,pageSize:10}},components:{DashboardTabs:u.A},computed:{disableTooltip(){return window.innerWidth<768},pagerCount(){return window.innerWidth<768?3:7},paginatedData(){const e=(this.currentPage-1)*this.pageSize,a=e+this.pageSize;return this.dealedData.slice(e,a)}},methods:{handleLogout(){const e="/api/auth/logout";fetch(e,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:"admin"})}).finally(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")})},formatTimeStamp(e){return new Date(e).toLocaleString()},sortByTimestamp(e,a){return new Date(e.metadata.TimeStamp)-new Date(a.metadata.TimeStamp)},async handleSwitchEnable(e){const a=e.ip,t=e.enable;t?(this.blockipList=this.blockipList.filter(e=>e!==a),await(0,T.A)("/api/manage/cusConfig/whiteip",{method:"POST",body:a})):(this.blockipList.push(a),await(0,T.A)("/api/manage/cusConfig/blockip",{method:"POST",body:a}))},handlePageChange(e){this.currentPage=e,e===Math.ceil(this.dealedData.length/this.pageSize)&&this.loadMoreData()},async handleExpandChange(e,a){if(a.some(a=>a.ip===e.ip)&&!e.filesLoaded&&!e.filesLoading){e.filesLoading=!0;try{const a=await(0,T.A)(`/api/manage/cusConfig/files?ip=${encodeURIComponent(e.ip)}&count=${e.count}`,{method:"GET"}),t=await a.json();e.data=(t.data||[]).sort(this.sortByTimestamp).reverse(),e.filesLoaded=!0}catch(t){this.$message.error(this.$t("customerConfig.loadError"))}finally{e.filesLoading=!1}}},loadMoreData(){this.loading=!0;const e=this.dealedData.length,a=20;(0,T.A)(`/api/manage/cusConfig/list?start=${e}&count=${a}`,{method:"GET"}).then(e=>e.json()).then(e=>{this.dealedData=this.dealedData.concat(e.map(e=>{const a=!this.blockipList.includes(e.ip);return{ip:e.ip,address:e.address,count:e.count,data:[],filesLoaded:!1,filesLoading:!1,enable:a}}))}).catch(()=>{this.$message.error(this.$t("customerConfig.loadError"))}).finally(()=>{this.loading=!1})},handleSizeChange(e){this.pageSize=e,this.currentPage=1}},mounted(){this.initializeBackground("adminBkImg",".container",!1,!0),this.loading=!0,this.showLogoutButton=this.$store.state.adminLoggedIn,(0,T.A)("/api/manage/cusConfig/list?count=20",{method:"GET"}).then(e=>e.json()).then(async e=>{const a=await(0,T.A)("/api/manage/cusConfig/blockipList",{method:"GET"});this.blockipList=(await a.text()).split(","),this.dealedData=e.map(e=>{const a=!this.blockipList.includes(e.ip);return{ip:e.ip,address:e.address,count:e.count,data:[],filesLoaded:!1,filesLoading:!1,enable:a}})}).catch(e=>{"Unauthorized"!==e.message&&this.$message.error(this.$t("customerConfig.syncError"))}).finally(()=>{this.loading=!1})}},S=t(71241);const D=(0,S.A)(x,[["render",v],["__scopeId","data-v-47645a4d"]]);var F=D},64752:function(e,a,t){t(85331),t(38736),t(18785)},72907:function(e,a,t){t(85331),t(96808),t(29092)}}]); +//# sourceMappingURL=396.b3b6ae37.js.map \ No newline at end of file diff --git a/frontend-dist/js/396.b3b6ae37.js.gz b/frontend-dist/js/396.b3b6ae37.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..19b586b0f88cb83dba1e54d404ab153f8050d2f9 GIT binary patch literal 2761 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 PDSG}t$|+n#V;legYG7O- literal 0 HcmV?d00001 diff --git a/frontend-dist/js/396.226339af.js.map b/frontend-dist/js/396.b3b6ae37.js.map similarity index 99% rename from frontend-dist/js/396.226339af.js.map rename to frontend-dist/js/396.b3b6ae37.js.map index 410bbb9e..67ded923 100644 --- a/frontend-dist/js/396.226339af.js.map +++ b/frontend-dist/js/396.b3b6ae37.js.map @@ -1 +1 @@ -{"version":3,"file":"js/396.226339af.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/views/CustomerConfig.vue?32f4","webpack://sanyue_imghub/./src/views/CustomerConfig.vue","webpack://sanyue_imghub/./src/views/CustomerConfig.vue?658e"],"sourcesContent":["import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nconst _hoisted_4 = {\n class: \"main-container\"\n};\nconst _hoisted_5 = {\n style: {\n \"margin\": \"8px\"\n }\n};\nconst _hoisted_6 = {\n style: {\n \"text-align\": \"center\"\n }\n};\nconst _hoisted_7 = [\"src\"];\nconst _hoisted_8 = {\n key: 2,\n style: {\n \"width\": \"100px\",\n \"height\": \"100px\",\n \"display\": \"flex\",\n \"justify-content\": \"center\",\n \"align-items\": \"center\"\n }\n};\nconst _hoisted_9 = {\n class: \"pagination-container\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_pagination = _resolveComponent(\"el-pagination\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"customerConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('sysConfig.logout'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_4, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $options.paginatedData,\n \"default-sort\": {\n prop: 'count',\n order: 'descending'\n },\n \"row-key\": \"ip\",\n class: \"main-table\",\n \"table-layout\": \"fixed\",\n onExpandChange: $options.handleExpandChange\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n type: \"expand\"\n }, {\n default: _withCtx(props => [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"h3\", _hoisted_6, _toDisplayString(_ctx.$t('customerConfig.uploadFileList')), 1), _withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: props.row.data,\n style: {\n \"width\": \"100%\"\n },\n \"default-sort\": {\n prop: 'metadata.TimeStamp',\n order: 'descending'\n },\n \"table-layout\": \"fixed\",\n \"max-height\": 400\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"metadata.FileName\",\n label: _ctx.$t('customerConfig.fileNameCol')\n }, null, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('customerConfig.filePreview')\n }, {\n default: _withCtx(({\n row\n }) => [row.metadata?.FileType?.includes('image') ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + row.id + '?from=admin',\n fit: \"cover\",\n lazy: \"\",\n style: {\n \"width\": \"100px\",\n \"height\": \"100px\"\n }\n }, null, 8, [\"src\"])) : row.metadata?.FileType?.includes('video') ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + row.id + '?from=admin',\n controls: \"\",\n style: {\n \"width\": \"100px\",\n \"height\": \"100px\"\n }\n }, null, 8, _hoisted_7)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n style: {\n \"font-size\": \"2em\"\n }\n })]))]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n formatter: $options.formatTimeStamp,\n label: _ctx.$t('customerConfig.uploadTimeCol'),\n prop: \"metadata.TimeStamp\",\n sortable: \"\",\n \"sort-method\": $options.sortByTimestamp\n }, {\n default: _withCtx(({\n row\n }) => [_createTextVNode(_toDisplayString($options.formatTimeStamp(row.metadata.TimeStamp)), 1)]),\n _: 1\n }, 8, [\"formatter\", \"label\", \"sort-method\"])]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, props.row.filesLoading]])])]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"ip\",\n label: _ctx.$t('customerConfig.ipAddress')\n }, null, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"address\",\n label: _ctx.$t('customerConfig.address')\n }, null, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"count\",\n label: _ctx.$t('customerConfig.uploadCount'),\n sortable: \"\"\n }, null, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('customerConfig.allowUpload')\n }, {\n default: _withCtx(({\n row\n }) => [_createVNode(_component_el_switch, {\n modelValue: row.enable,\n \"onUpdate:modelValue\": $event => row.enable = $event,\n \"active-color\": \"#13ce66\",\n \"inactive-color\": \"#ff4949\",\n \"active-text\": _ctx.$t('customerConfig.allow'),\n \"inactive-text\": _ctx.$t('customerConfig.deny'),\n onChange: $event => $options.handleSwitchEnable(row)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"active-text\", \"inactive-text\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"data\", \"onExpandChange\"])), [[_directive_loading, $data.loading]]), _createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_el_pagination, {\n background: \"\",\n layout: \"prev, pager, next\",\n total: $data.dealedData.length,\n \"current-page\": $data.currentPage,\n \"page-size\": $data.pageSize,\n \"pager-count\": $options.pagerCount,\n onCurrentChange: $options.handlePageChange\n }, null, 8, [\"total\", \"current-page\", \"page-size\", \"pager-count\", \"onCurrentChange\"]), $data.currentPage === Math.ceil($data.dealedData.length / $data.pageSize) ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.loadMoreData,\n loading: $data.loading,\n class: \"load-more\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('customerConfig.loadMore')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])) : _createCommentVNode(\"\", true)])])]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'CustomerConfig',\n mixins: [backgroundManager],\n data() {\n return {\n tableData: [],\n dealedData: [],\n // 根据IP地址处理后的数据,格式为 {ip, count, [data]}\n blockipList: [],\n // 禁止上传的IP列表\n\n loading: false,\n // 分页数据\n currentPage: 1,\n pageSize: 10 // 默认每页10条\n };\n },\n components: {\n DashboardTabs\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n pagerCount() {\n return window.innerWidth < 768 ? 3 : 7;\n },\n paginatedData() {\n // 计算分页数据\n const start = (this.currentPage - 1) * this.pageSize;\n const end = start + this.pageSize;\n return this.dealedData.slice(start, end);\n }\n },\n methods: {\n handleLogout() {\n const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n formatTimeStamp(timeStamp) {\n return new Date(timeStamp).toLocaleString();\n },\n sortByTimestamp(a, b) {\n return new Date(a.metadata.TimeStamp) - new Date(b.metadata.TimeStamp);\n },\n async handleSwitchEnable(row) {\n const ip = row.ip;\n const enable = row.enable;\n if (enable) {\n // 从 blockipList 中移除\n this.blockipList = this.blockipList.filter(item => item !== ip);\n // 更新 blockipList\n await fetchWithAuth(\"/api/manage/cusConfig/whiteip\", {\n method: 'POST',\n body: ip\n });\n } else {\n // 添加到 blockipList 中\n this.blockipList.push(ip);\n // 更新 blockipList\n await fetchWithAuth(\"/api/manage/cusConfig/blockip\", {\n method: 'POST',\n body: ip\n });\n }\n },\n handlePageChange(page) {\n this.currentPage = page;\n // 到最后一页时,加载更多数据\n if (page === Math.ceil(this.dealedData.length / this.pageSize)) {\n this.loadMoreData();\n }\n },\n async handleExpandChange(row, expandedRows) {\n if (!expandedRows.some(item => item.ip === row.ip) || row.filesLoaded || row.filesLoading) return;\n row.filesLoading = true;\n try {\n const response = await fetchWithAuth(`/api/manage/cusConfig/files?ip=${encodeURIComponent(row.ip)}&count=${row.count}`, {\n method: 'GET'\n });\n const result = await response.json();\n row.data = (result.data || []).sort(this.sortByTimestamp).reverse();\n row.filesLoaded = true;\n } catch (err) {\n this.$message.error(this.$t('customerConfig.loadError'));\n } finally {\n row.filesLoading = false;\n }\n },\n loadMoreData() {\n this.loading = true;\n const start = this.dealedData.length;\n const count = 20; // 每次加载20条数据\n fetchWithAuth(`/api/manage/cusConfig/list?start=${start}&count=${count}`, {\n method: 'GET'\n }).then(response => response.json()).then(result => {\n this.dealedData = this.dealedData.concat(result.map(item => {\n const enable = !this.blockipList.includes(item.ip);\n return {\n ip: item.ip,\n address: item.address,\n count: item.count,\n data: [],\n filesLoaded: false,\n filesLoading: false,\n enable: enable\n };\n }));\n }).catch(() => {\n this.$message.error(this.$t('customerConfig.loadError'));\n }).finally(() => {\n this.loading = false;\n });\n },\n handleSizeChange(size) {\n this.pageSize = size;\n this.currentPage = 1;\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n this.loading = true;\n\n // 路由守卫已通过 /api/auth/sessionCheck 验证认证状态\n this.showLogoutButton = this.$store.state.adminLoggedIn;\n fetchWithAuth(\"/api/manage/cusConfig/list?count=20\", {\n method: 'GET'\n }).then(response => response.json()).then(async result => {\n // 读取blockipList, 接口返回格式为 'ip1,ip2,ip3',需要转换为数组\n const blockipList = await fetchWithAuth(\"/api/manage/cusConfig/blockipList\", {\n method: 'GET'\n });\n this.blockipList = (await blockipList.text()).split(',');\n this.dealedData = result.map(item => {\n const enable = !this.blockipList.includes(item.ip);\n return {\n ip: item.ip,\n address: item.address,\n count: item.count,\n data: [],\n filesLoaded: false,\n filesLoading: false,\n enable: enable\n };\n });\n }).catch(err => {\n if (err.message !== 'Unauthorized') {\n this.$message.error(this.$t('customerConfig.syncError'));\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomerConfig.vue?vue&type=template&id=47645a4d&scoped=true\"\nimport script from \"./CustomerConfig.vue?vue&type=script&lang=js\"\nexport * from \"./CustomerConfig.vue?vue&type=script&lang=js\"\n\nimport \"./CustomerConfig.vue?vue&type=style&index=0&id=47645a4d&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-47645a4d\"]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","style","_hoisted_6","_hoisted_7","_hoisted_8","key","_hoisted_9","render","_ctx","_cache","$props","$setup","$data","$options","_component_DashboardTabs","_component_font_awesome_icon","_component_el_tooltip","_component_el_header","_component_el_table_column","_component_el_image","_component_el_table","_component_el_switch","_component_el_pagination","_component_el_button","_directive_loading","default","activeTab","disabled","disableTooltip","content","$t","placement","icon","onClick","handleLogout","_","data","paginatedData","prop","order","onExpandChange","handleExpandChange","type","props","row","label","metadata","FileType","includes","src","id","fit","lazy","controls","formatter","formatTimeStamp","sortable","sortByTimestamp","TimeStamp","filesLoading","modelValue","enable","$event","onChange","handleSwitchEnable","loading","background","layout","total","dealedData","length","currentPage","pageSize","pagerCount","onCurrentChange","handlePageChange","Math","ceil","loadMoreData","name","mixins","backgroundManager","tableData","blockipList","components","DashboardTabs","computed","window","innerWidth","start","this","end","slice","methods","url","fetch","method","credentials","headers","body","JSON","stringify","authType","finally","$store","commit","$router","push","timeStamp","Date","toLocaleString","a","b","ip","filter","item","fetchWithAuth","page","expandedRows","some","filesLoaded","response","encodeURIComponent","count","result","json","sort","reverse","err","$message","error","then","concat","map","address","catch","handleSizeChange","size","mounted","initializeBackground","showLogoutButton","state","adminLoggedIn","async","text","split","message","__exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/396.b3b6ae37.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/views/CustomerConfig.vue?32f4","webpack://sanyue_imghub/./src/views/CustomerConfig.vue","webpack://sanyue_imghub/./src/views/CustomerConfig.vue?658e"],"sourcesContent":["import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nconst _hoisted_4 = {\n class: \"main-container\"\n};\nconst _hoisted_5 = {\n style: {\n \"margin\": \"8px\"\n }\n};\nconst _hoisted_6 = {\n style: {\n \"text-align\": \"center\"\n }\n};\nconst _hoisted_7 = [\"src\"];\nconst _hoisted_8 = {\n key: 2,\n style: {\n \"width\": \"100px\",\n \"height\": \"100px\",\n \"display\": \"flex\",\n \"justify-content\": \"center\",\n \"align-items\": \"center\"\n }\n};\nconst _hoisted_9 = {\n class: \"pagination-container\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_pagination = _resolveComponent(\"el-pagination\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"customerConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('sysConfig.logout'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_4, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $options.paginatedData,\n \"default-sort\": {\n prop: 'count',\n order: 'descending'\n },\n \"row-key\": \"ip\",\n class: \"main-table\",\n \"table-layout\": \"fixed\",\n onExpandChange: $options.handleExpandChange\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n type: \"expand\"\n }, {\n default: _withCtx(props => [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"h3\", _hoisted_6, _toDisplayString(_ctx.$t('customerConfig.uploadFileList')), 1), _withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: props.row.data,\n style: {\n \"width\": \"100%\"\n },\n \"default-sort\": {\n prop: 'metadata.TimeStamp',\n order: 'descending'\n },\n \"table-layout\": \"fixed\",\n \"max-height\": 400\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"metadata.FileName\",\n label: _ctx.$t('customerConfig.fileNameCol')\n }, null, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('customerConfig.filePreview')\n }, {\n default: _withCtx(({\n row\n }) => [row.metadata?.FileType?.includes('image') ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + row.id + '?from=admin',\n fit: \"cover\",\n lazy: \"\",\n style: {\n \"width\": \"100px\",\n \"height\": \"100px\"\n }\n }, null, 8, [\"src\"])) : row.metadata?.FileType?.includes('video') ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + row.id + '?from=admin',\n controls: \"\",\n style: {\n \"width\": \"100px\",\n \"height\": \"100px\"\n }\n }, null, 8, _hoisted_7)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n style: {\n \"font-size\": \"2em\"\n }\n })]))]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n formatter: $options.formatTimeStamp,\n label: _ctx.$t('customerConfig.uploadTimeCol'),\n prop: \"metadata.TimeStamp\",\n sortable: \"\",\n \"sort-method\": $options.sortByTimestamp\n }, {\n default: _withCtx(({\n row\n }) => [_createTextVNode(_toDisplayString($options.formatTimeStamp(row.metadata.TimeStamp)), 1)]),\n _: 1\n }, 8, [\"formatter\", \"label\", \"sort-method\"])]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, props.row.filesLoading]])])]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"ip\",\n label: _ctx.$t('customerConfig.ipAddress')\n }, null, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"address\",\n label: _ctx.$t('customerConfig.address')\n }, null, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"count\",\n label: _ctx.$t('customerConfig.uploadCount'),\n sortable: \"\"\n }, null, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('customerConfig.allowUpload')\n }, {\n default: _withCtx(({\n row\n }) => [_createVNode(_component_el_switch, {\n modelValue: row.enable,\n \"onUpdate:modelValue\": $event => row.enable = $event,\n \"active-color\": \"#13ce66\",\n \"inactive-color\": \"#ff4949\",\n \"active-text\": _ctx.$t('customerConfig.allow'),\n \"inactive-text\": _ctx.$t('customerConfig.deny'),\n onChange: $event => $options.handleSwitchEnable(row)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"active-text\", \"inactive-text\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"data\", \"onExpandChange\"])), [[_directive_loading, $data.loading]]), _createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_el_pagination, {\n background: \"\",\n layout: \"prev, pager, next\",\n total: $data.dealedData.length,\n \"current-page\": $data.currentPage,\n \"page-size\": $data.pageSize,\n \"pager-count\": $options.pagerCount,\n onCurrentChange: $options.handlePageChange\n }, null, 8, [\"total\", \"current-page\", \"page-size\", \"pager-count\", \"onCurrentChange\"]), $data.currentPage === Math.ceil($data.dealedData.length / $data.pageSize) ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.loadMoreData,\n loading: $data.loading,\n class: \"load-more\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('customerConfig.loadMore')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])) : _createCommentVNode(\"\", true)])])]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'CustomerConfig',\n mixins: [backgroundManager],\n data() {\n return {\n tableData: [],\n dealedData: [],\n // 根据IP地址处理后的数据,格式为 {ip, count, [data]}\n blockipList: [],\n // 禁止上传的IP列表\n\n loading: false,\n // 分页数据\n currentPage: 1,\n pageSize: 10 // 默认每页10条\n };\n },\n components: {\n DashboardTabs\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n pagerCount() {\n return window.innerWidth < 768 ? 3 : 7;\n },\n paginatedData() {\n // 计算分页数据\n const start = (this.currentPage - 1) * this.pageSize;\n const end = start + this.pageSize;\n return this.dealedData.slice(start, end);\n }\n },\n methods: {\n handleLogout() {\n const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n formatTimeStamp(timeStamp) {\n return new Date(timeStamp).toLocaleString();\n },\n sortByTimestamp(a, b) {\n return new Date(a.metadata.TimeStamp) - new Date(b.metadata.TimeStamp);\n },\n async handleSwitchEnable(row) {\n const ip = row.ip;\n const enable = row.enable;\n if (enable) {\n // 从 blockipList 中移除\n this.blockipList = this.blockipList.filter(item => item !== ip);\n // 更新 blockipList\n await fetchWithAuth(\"/api/manage/cusConfig/whiteip\", {\n method: 'POST',\n body: ip\n });\n } else {\n // 添加到 blockipList 中\n this.blockipList.push(ip);\n // 更新 blockipList\n await fetchWithAuth(\"/api/manage/cusConfig/blockip\", {\n method: 'POST',\n body: ip\n });\n }\n },\n handlePageChange(page) {\n this.currentPage = page;\n // 到最后一页时,加载更多数据\n if (page === Math.ceil(this.dealedData.length / this.pageSize)) {\n this.loadMoreData();\n }\n },\n async handleExpandChange(row, expandedRows) {\n if (!expandedRows.some(item => item.ip === row.ip) || row.filesLoaded || row.filesLoading) return;\n row.filesLoading = true;\n try {\n const response = await fetchWithAuth(`/api/manage/cusConfig/files?ip=${encodeURIComponent(row.ip)}&count=${row.count}`, {\n method: 'GET'\n });\n const result = await response.json();\n row.data = (result.data || []).sort(this.sortByTimestamp).reverse();\n row.filesLoaded = true;\n } catch (err) {\n this.$message.error(this.$t('customerConfig.loadError'));\n } finally {\n row.filesLoading = false;\n }\n },\n loadMoreData() {\n this.loading = true;\n const start = this.dealedData.length;\n const count = 20; // 每次加载20条数据\n fetchWithAuth(`/api/manage/cusConfig/list?start=${start}&count=${count}`, {\n method: 'GET'\n }).then(response => response.json()).then(result => {\n this.dealedData = this.dealedData.concat(result.map(item => {\n const enable = !this.blockipList.includes(item.ip);\n return {\n ip: item.ip,\n address: item.address,\n count: item.count,\n data: [],\n filesLoaded: false,\n filesLoading: false,\n enable: enable\n };\n }));\n }).catch(() => {\n this.$message.error(this.$t('customerConfig.loadError'));\n }).finally(() => {\n this.loading = false;\n });\n },\n handleSizeChange(size) {\n this.pageSize = size;\n this.currentPage = 1;\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n this.loading = true;\n\n // 路由守卫已通过 /api/auth/sessionCheck 验证认证状态\n this.showLogoutButton = this.$store.state.adminLoggedIn;\n fetchWithAuth(\"/api/manage/cusConfig/list?count=20\", {\n method: 'GET'\n }).then(response => response.json()).then(async result => {\n // 读取blockipList, 接口返回格式为 'ip1,ip2,ip3',需要转换为数组\n const blockipList = await fetchWithAuth(\"/api/manage/cusConfig/blockipList\", {\n method: 'GET'\n });\n this.blockipList = (await blockipList.text()).split(',');\n this.dealedData = result.map(item => {\n const enable = !this.blockipList.includes(item.ip);\n return {\n ip: item.ip,\n address: item.address,\n count: item.count,\n data: [],\n filesLoaded: false,\n filesLoading: false,\n enable: enable\n };\n });\n }).catch(err => {\n if (err.message !== 'Unauthorized') {\n this.$message.error(this.$t('customerConfig.syncError'));\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomerConfig.vue?vue&type=template&id=47645a4d&scoped=true\"\nimport script from \"./CustomerConfig.vue?vue&type=script&lang=js\"\nexport * from \"./CustomerConfig.vue?vue&type=script&lang=js\"\n\nimport \"./CustomerConfig.vue?vue&type=style&index=0&id=47645a4d&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-47645a4d\"]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","style","_hoisted_6","_hoisted_7","_hoisted_8","key","_hoisted_9","render","_ctx","_cache","$props","$setup","$data","$options","_component_DashboardTabs","_component_font_awesome_icon","_component_el_tooltip","_component_el_header","_component_el_table_column","_component_el_image","_component_el_table","_component_el_switch","_component_el_pagination","_component_el_button","_directive_loading","default","activeTab","disabled","disableTooltip","content","$t","placement","icon","onClick","handleLogout","_","data","paginatedData","prop","order","onExpandChange","handleExpandChange","type","props","row","label","metadata","FileType","includes","src","id","fit","lazy","controls","formatter","formatTimeStamp","sortable","sortByTimestamp","TimeStamp","filesLoading","modelValue","enable","$event","onChange","handleSwitchEnable","loading","background","layout","total","dealedData","length","currentPage","pageSize","pagerCount","onCurrentChange","handlePageChange","Math","ceil","loadMoreData","name","mixins","backgroundManager","tableData","blockipList","components","DashboardTabs","computed","window","innerWidth","start","this","end","slice","methods","url","fetch","method","credentials","headers","body","JSON","stringify","authType","finally","$store","commit","$router","push","timeStamp","Date","toLocaleString","a","b","ip","filter","item","fetchWithAuth","page","expandedRows","some","filesLoaded","response","encodeURIComponent","count","result","json","sort","reverse","err","$message","error","then","concat","map","address","catch","handleSizeChange","size","mounted","initializeBackground","showLogoutButton","state","adminLoggedIn","async","text","split","message","__exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/396.b3b6ae37.js.map.gz b/frontend-dist/js/396.b3b6ae37.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..69bc71bfcf39e981767a4214128c88ba5cc85414 GIT binary patch literal 7044 zcmV-~8++s*iwFP!000023e7xgbKJ&}e+5Bw-dzjaYf2G!0wWi zqEtm6NMfd^r{CSv1L(23$HK_*J+(fiscpw)YF*ulYE#!{s@qfBGbWpwt?opsruNJr zaJ){W*43UxDA5)OSsb7`F^*{3aiFV7w)b-;&_x z2GLVOZ);10tZOTzb!W&%2w)OoX&a>VYPut#+7h8Q&0(A)WL`4}z5R-`c7c#pZH3Ua zWE*-{TOniv*53oVNKe;R3H5Z%B80&<+w&6IyBycPPK=w{Dj};IFu8;~FW}FWfuBoM zYY{quEO3}fU7I6xN{0z@SqBPsb?uQ(=uQ&>_H}KZ&;uPG`uMQNA7=1jmOn)J5D$6C zt(nA!sUb6u1R)@eC2a!)yF!SsBbT!}fZT^46o$=6Pxm1UAdjH6f3M_D3 zDdKQ&U|fggaqGUe4#M|!(8w99c6C8ICG?uH0h_MdFto}v2HHZf)eynvBOT=0LbPBB zxW_uEniASv97VEu7yi78o4AG}*kpt*2EslqLYE)$tpeO?^%2+!-4U<`?26`S5xPzJ zbBoZM(#!@hwyOitgb&XX+LV|NsKop_A&#CZ#(bm;tx-a!S{=Ua9w%iVNoi}0kPZUa zlvA}r=wix%vBt$QPw2g=)T`;TShhlFSD&W*X^JDB)=`oNh_u<&N6K#*{+vdzuCXs< zvJP$s3wNZ2yQrbnqP0xXyxx6|!vNs>FyQD5ISubpLVD=xb45|z%_McSBqX&Y+!WyN zfC##}M+c*WaZeKBBOyib&YTz}f$@+uPv|ysYF|u3f;$xM;u2yGX^y?iI-z#av^GF} zfb7)_S*k5x(hCvl>zq#r7Og3IQ94@~R)Dy> z!G(!4V7j9hV`ssT&5bOyOx;RC%MziBHC@{2KI9pTw088}k->xOen-!gf7JAOj61?b ztK(Gb=!6C$Srts8LkVrKNH)EzXMAJQ<6gKrO(B2NJ>m9rlmQt+JC4phw5Cf`kdA&& z=nR(M=Pb?>dgUe$TLUa20PX@oayAK)1t^SR_!s=ZEqtIT^KXWJCQ=N@s;h&cK?Sr>zzAq=dW+6^=r1I$Km1$8fve)mQ=_=v=H5d}
    $P-e3+Crx={yR4 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 literal 0 HcmV?d00001 diff --git a/frontend-dist/js/529.e05f38bd.js b/frontend-dist/js/529.287c329f.js similarity index 99% rename from frontend-dist/js/529.e05f38bd.js rename to frontend-dist/js/529.287c329f.js index 26d34c9f..ecfafe7d 100644 --- a/frontend-dist/js/529.e05f38bd.js +++ b/frontend-dist/js/529.287c329f.js @@ -1,4 +1,4 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[529],{2893:function(t,e,s){s(85331)},3261:function(t,e,s){s(85331)},4885:function(t,e,s){s(85331)},5802:function(t,e,s){s(85331),s(38736),s(213),s(85970)},15616:function(t,e,s){s(85331),s(97197)},31529:function(t,e,s){s.r(e),s.d(e,{default:function(){return Qg}});var i=s(56768),n=s(24232);const a={class:"menu-list"},o=["onClick"],l={class:"menu-text"};function r(t,e,s,r,d,c){const h=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["sidebar-container",{"is-collapsed":s.isCollapse}]),ref:"sidebar",style:(0,n.Tr)(c.sidebarStyle)},[(0,i.Lk)("div",a,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.menuItems,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.index,class:(0,n.C4)(["menu-item",{"is-active":s.activeIndex===e.index}]),onClick:t=>c.handleSelect(e.index)},[(0,i.bF)(h,{icon:e.icon,class:"menu-icon"},null,8,["icon"]),(0,i.Lk)("span",l,(0,n.v_)(t.$t(e.titleKey)),1)],10,o))),128))]),(0,i.Lk)("div",{class:"toggle-button",onClick:e[0]||(e[0]=(...t)=>c.toggleCollapse&&c.toggleCollapse(...t))},[(0,i.bF)(h,{icon:s.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],6)}var d={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{expandedWidth:null,menuItems:[{index:"status",icon:"chart-bar",titleKey:"sysConfigTabs.systemStatus"},{index:"upload",icon:"cloud-upload",titleKey:"sysConfigTabs.uploadSettings"},{index:"security",icon:"shield",titleKey:"sysConfigTabs.securitySettings"},{index:"page",icon:"pager",titleKey:"sysConfigTabs.pageSettings"},{index:"others",icon:"cog",titleKey:"sysConfigTabs.otherSettings"}]}},computed:{collapsedWidth(){return window.innerWidth<=768?50:56},sidebarStyle(){return this.isCollapse?{width:this.collapsedWidth+"px"}:this.expandedWidth?{width:this.expandedWidth+"px"}:{}}},watch:{"$i18n.locale"(){this.$nextTick(()=>this.measureWidth())}},methods:{toggleCollapse(){this.$emit("update:isCollapse",!this.isCollapse)},checkMobile(){const t=window.innerWidth<=768;this.$emit("update:isCollapse",t)},handleSelect(t){this.$emit("update:activeIndex",t)},measureWidth(){const t=this.$refs.sidebar;if(!t)return;const e=t.style.width,s=t.style.transition,i=t.classList.contains("is-collapsed");t.style.transition="none",i&&t.classList.remove("is-collapsed"),t.style.width="auto",t.offsetWidth;const n=t.scrollWidth;t.style.width=e,i&&t.classList.add("is-collapsed"),t.offsetWidth,t.style.transition=s,this.expandedWidth=n}},mounted(){this.checkMobile(),this.$nextTick(()=>this.measureWidth()),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},c=s(71241);const h=(0,c.A)(d,[["render",r],["__scopeId","data-v-2718059d"]]);var u=h,p=s(54880),g=(s(85331),s(77128),s(78507)),f=(s(213),s(97247));const m={class:"container"},b={class:"header-content"},y={class:"header-action"};function x(t,e,s,a,o,l){const r=f.A,d=(0,i.g2)("font-awesome-icon"),c=g.R7,h=p.bZ,x=u;return(0,i.uX)(),(0,i.CE)("div",m,[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",b,[(0,i.bF)(r,{activeTab:"systemConfig"}),(0,i.Lk)("div",y,[(0,i.bF)(c,{disabled:l.disableTooltip,content:t.$t("sysConfig.logout"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{icon:"sign-out-alt",class:"header-icon",onClick:l.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,i.bF)(x,{activeIndex:o.activeIndex,"onUpdate:activeIndex":e[0]||(e[0]=t=>o.activeIndex=t),isCollapse:o.isSidebarCollapse,"onUpdate:isCollapse":e[1]||(e[1]=t=>o.isSidebarCollapse=t)},null,8,["activeIndex","isCollapse"]),((0,i.uX)(),(0,i.Wv)((0,i.$y)(l.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:o.isSidebarCollapse}])},null,8,["class"]))])}s(44114),s(33110);var v=s(99114),_=(s(30694),s(57009)),k=(s(78450),s(69655)),w=(s(2893),s(9267)),C=(s(15616),s(45130));const S={class:"date-range-calendar"},F={class:"selected-range"},T={class:"selected-range-inputs"},P=["aria-label"],M={class:"date-range-separator"},D=["aria-label"],A={class:"calendar-header"},$=["aria-label"],V={class:"calendar-title"},L=["aria-label"],E={class:"calendar-weekdays"},I={class:"calendar-grid"},U=["onClick"];function O(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",S,[(0,i.Lk)("div",F,[(0,i.Lk)("div",T,[(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[0]||(e[0]=t=>o.inputStart=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.startDateLabel,onChange:e[1]||(e[1]=(...t)=>l.handleManualInput&&l.handleManualInput(...t))},null,40,P),[[C.Jo,o.inputStart,void 0,{trim:!0}]]),(0,i.Lk)("span",M,(0,n.v_)(l.rangeSeparator),1),(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>o.inputEnd=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.endDateLabel,onChange:e[3]||(e[3]=(...t)=>l.handleManualInput&&l.handleManualInput(...t))},null,40,D),[[C.Jo,o.inputEnd,void 0,{trim:!0}]])])]),(0,i.Lk)("div",A,[(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.previousMonthLabel,onClick:e[4]||(e[4]=(...t)=>l.goToPreviousMonth&&l.goToPreviousMonth(...t))},[(0,i.bF)(r,{icon:"chevron-left"})],8,$),(0,i.Lk)("div",V,(0,n.v_)(l.monthTitle),1),(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.nextMonthLabel,onClick:e[5]||(e[5]=(...t)=>l.goToNextMonth&&l.goToNextMonth(...t))},[(0,i.bF)(r,{icon:"chevron-right"})],8,L)]),(0,i.Lk)("div",E,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.weekdayLabels,t=>((0,i.uX)(),(0,i.CE)("span",{key:t},(0,n.v_)(t),1))),128))]),(0,i.Lk)("div",I,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.calendarDays,t=>((0,i.uX)(),(0,i.CE)("button",{key:t.key,type:"button",class:(0,n.C4)(["calendar-day",{"is-muted":!t.isCurrentMonth,"is-today":t.isToday,"is-range-start":t.key===o.draftStart,"is-range-end":t.key===o.draftEnd,"is-in-range":l.isInRange(t.key)}]),onClick:e=>l.selectDay(t.key)},(0,n.v_)(t.dayOfMonth),11,U))),128))])])}const R=864e5;function W(t){return String(t).padStart(2,"0")}function B(t){return`${t.getFullYear()}-${W(t.getMonth()+1)}-${W(t.getDate())}`}function N(t){if("string"!==typeof t)return null;const e=t.trim().match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);if(!e)return null;const s=Number(e[1]),i=Number(e[2])-1,n=Number(e[3]),a=new Date(s,i,n);return a.getFullYear()!==s||a.getMonth()!==i||a.getDate()!==n?null:(a.setHours(0,0,0,0),a)}function z(t,e){return new Date(t.getFullYear(),t.getMonth()+e,1)}var j={name:"DateRangeCalendar",props:{modelValue:{type:Array,default:()=>[]}},emits:["update:modelValue","change"],data(){const t=new Date;return t.setHours(0,0,0,0),{displayYear:t.getFullYear(),displayMonth:t.getMonth(),draftStart:"",draftEnd:"",inputStart:"",inputEnd:"",awaitingEnd:!1}},computed:{previousMonthLabel(){return this.$t("dateRangeCalendar.previousMonth")},nextMonthLabel(){return this.$t("dateRangeCalendar.nextMonth")},startDateLabel(){return this.$t("dateRangeCalendar.startDate")},endDateLabel(){return this.$t("dateRangeCalendar.endDate")},rangeSeparator(){return this.$t("dateRangeCalendar.rangeSeparator")},monthTitle(){return this.$t("dateRangeCalendar.monthTitle",{year:this.displayYear,month:W(this.displayMonth+1)})},weekdayLabels(){return[this.$t("dateRangeCalendar.weekdaySun"),this.$t("dateRangeCalendar.weekdayMon"),this.$t("dateRangeCalendar.weekdayTue"),this.$t("dateRangeCalendar.weekdayWed"),this.$t("dateRangeCalendar.weekdayThu"),this.$t("dateRangeCalendar.weekdayFri"),this.$t("dateRangeCalendar.weekdaySat")]},calendarDays(){const t=new Date(this.displayYear,this.displayMonth,1),e=new Date(this.displayYear,this.displayMonth,1-t.getDay()),s=B(new Date);return Array.from({length:42},(t,i)=>{const n=new Date(e.getTime()+i*R),a=B(n);return{key:a,dayOfMonth:n.getDate(),isCurrentMonth:n.getMonth()===this.displayMonth,isToday:a===s}})}},watch:{modelValue:{immediate:!0,handler(t){this.syncFromModel(t)}}},methods:{syncFromModel(t){const e=N(t?.[0]),s=N(t?.[1]);this.draftStart=e?B(e):"",this.draftEnd=s?B(s):"",this.inputStart=this.draftStart,this.inputEnd=this.draftEnd,this.awaitingEnd=!1;const i=e||s;i&&(this.displayYear=i.getFullYear(),this.displayMonth=i.getMonth())},goToPreviousMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),-1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},goToNextMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},selectDay(t){if(!this.draftStart||this.draftEnd||!this.awaitingEnd)return this.draftStart=t,this.draftEnd="",this.inputStart=t,this.inputEnd="",void(this.awaitingEnd=!0);const e=tthis.draftStart&&tl.fetchIndexInfo&&l.fetchIndexInfo(...t))},[(0,i.Lk)("div",G,[(0,i.bF)(r,{icon:"database"})]),(0,i.Lk)("div",J,[(0,i.Lk)("div",Z,(0,n.v_)(t.$t("sysStatus.totalFiles")),1),(0,i.Lk)("div",tt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",et,(0,n.v_)(t.$t("sysStatus.clickToRefresh")),1)])]),(0,i.Lk)("div",st,[(0,i.Lk)("div",it,[(0,i.bF)(r,{icon:"clock"})]),(0,i.Lk)("div",nt,[(0,i.Lk)("div",at,(0,n.v_)(t.$t("sysStatus.indexUpdateTime")),1),(0,i.Lk)("div",ot,(0,n.v_)(l.formatTime(o.indexInfo.lastUpdated)),1),(0,i.Lk)("div",lt,(0,n.v_)(l.getTimeAgo(o.indexInfo.lastUpdated)),1)])]),(0,i.Lk)("div",{class:"overview-card system-version",onClick:e[1]||(e[1]=(...t)=>l.openReleases&&l.openReleases(...t))},[(0,i.Lk)("div",rt,[(0,i.bF)(r,{icon:"code-branch"})]),(0,i.Lk)("div",dt,[(0,i.Lk)("div",ct,(0,n.v_)(t.$t("sysStatus.systemVersion")),1),(0,i.Lk)("div",ht,"v"+(0,n.v_)(o.version),1),(0,i.Lk)("div",ut,(0,n.v_)(t.$t("sysStatus.clickToViewChangelog")),1)])])]),(0,i.Lk)("div",pt,[(0,i.Lk)("div",gt,[(0,i.Lk)("div",ft,[(0,i.Lk)("div",mt,[(0,i.bF)(r,{icon:"chart-line"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.uploadTrend")),1),(0,i.bF)(d,{class:"trend-calendar-btn",circle:"","aria-label":t.$t("sysStatus.selectDateRange"),onClick:l.openTrendDateDialog},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"calendar"})]),_:1},8,["aria-label","onClick"])]),(0,i.Lk)("div",bt,[(0,i.bF)(h,{modelValue:o.trendGroupBy,"onUpdate:modelValue":e[2]||(e[2]=t=>o.trendGroupBy=t),size:"small",class:"trend-group-switch","aria-label":t.$t("sysStatus.uploadTrendGroupBy")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:"channel"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelType")),1)]),_:1}),(0,i.bF)(c,{label:"channelName"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelName")),1)]),_:1})]),_:1},8,["modelValue","aria-label"])])]),(0,i.bF)(p,{modelValue:o.trendDatePickerVisible,"onUpdate:modelValue":e[4]||(e[4]=t=>o.trendDatePickerVisible=t),title:t.$t("sysStatus.selectDateRange"),width:l.trendDateDialogWidth,class:"trend-date-dialog","align-center":"","append-to-body":""},{default:(0,i.k6)(()=>[(0,i.Lk)("div",yt,[(0,i.bF)(u,{modelValue:o.trendDateRange,"onUpdate:modelValue":e[3]||(e[3]=t=>o.trendDateRange=t),onChange:l.handleTrendDateRangeChange},null,8,["modelValue","onChange"])])]),_:1},8,["modelValue","title","width"]),(0,i.Lk)("div",xt,[l.hasTrendData?((0,i.uX)(),(0,i.CE)("div",_t,[(0,i.bF)(f,{data:l.uploadTrendChartData,options:l.lineChartOptions},null,8,["data","options"])])):((0,i.uX)(),(0,i.CE)("div",vt,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)]))])]),(0,i.Lk)("div",kt,[(0,i.Lk)("div",wt,[(0,i.bF)(r,{icon:"share-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.channelDistribution")),1)]),(0,i.Lk)("div",Ct,[0===Object.keys(o.indexInfo.channelStats||{}).length?((0,i.uX)(),(0,i.CE)("div",St,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Ft,[(0,i.Lk)("div",Tt,[(0,i.bF)(m,{data:l.channelChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Pt,[(0,i.Lk)("div",Mt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",Dt,(0,n.v_)(t.$t("sysStatus.totalFilesLabel")),1)])]),(0,i.Lk)("div",At,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.indexInfo.channelStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getChartColor(s)})},null,4),(0,i.Lk)("span",$t,(0,n.v_)(e),1),(0,i.Lk)("span",Vt,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Lt,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,i.Lk)("div",Et,[(0,i.Lk)("div",It,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.fileStatusDistribution")),1)]),(0,i.Lk)("div",Ut,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,i.uX)(),(0,i.CE)("div",Ot,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Rt,[(0,i.Lk)("div",Wt,[(0,i.bF)(m,{data:l.typeChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Bt,[(0,i.Lk)("div",Nt,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),(0,i.Lk)("div",zt,(0,n.v_)(t.$t("sysStatus.statusTypes")),1)])]),(0,i.Lk)("div",jt,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.aggregatedTypeStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getTypeChartColor(s)})},null,4),(0,i.Lk)("span",qt,(0,n.v_)(e),1),(0,i.Lk)("span",Ht,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Xt,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,i.Lk)("div",Kt,[(0,i.Lk)("div",Qt,[(0,i.Lk)("div",Yt,[(0,i.bF)(r,{icon:"tools"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.systemMaintenance")),1)]),(0,i.Lk)("div",Gt,[o.isProcessing?((0,i.uX)(),(0,i.CE)("div",Jt,[(0,i.Lk)("div",Zt,[(0,i.Lk)("span",te,(0,n.v_)(l.phaseDescription),1),(0,i.Lk)("span",ee,(0,n.v_)(Math.round(o.processingProgress.percentage))+"%",1)]),(0,i.bF)(b,{percentage:o.processingProgress.percentage,"stroke-width":12,"show-text":!1,class:"progress-bar"},null,8,["percentage"]),(0,i.Lk)("div",se,[o.processingProgress.current>0?((0,i.uX)(),(0,i.CE)("span",ie,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.eW)(" "+(0,n.v_)(o.processingProgress.current.toLocaleString())+" ",1),o.processingProgress.total>0?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.eW)(" / "+(0,n.v_)(o.processingProgress.total.toLocaleString()),1)],64)):(0,i.Q3)("",!0),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.records")),1)])):(0,i.Q3)("",!0),l.estimatedTimeRemaining?((0,i.uX)(),(0,i.CE)("span",ne,[(0,i.bF)(r,{icon:"clock"}),(0,i.eW)(" "+(0,n.v_)(l.estimatedTimeRemaining),1)])):(0,i.Q3)("",!0)]),o.processingProgress.message?((0,i.uX)(),(0,i.CE)("div",ae,(0,n.v_)(o.processingProgress.message),1)):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"danger",plain:"",size:"small",onClick:l.cancelOperation,class:"cancel-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"times"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.cancelOperation")),1)]),_:1},8,["onClick"])])):o.processingError?((0,i.uX)(),(0,i.CE)("div",oe,[(0,i.Lk)("div",le,[(0,i.bF)(r,{icon:"exclamation-triangle"})]),(0,i.Lk)("div",re,[(0,i.Lk)("div",de,(0,n.v_)(o.processingError.message),1),o.processingError.suggestion?((0,i.uX)(),(0,i.CE)("div",ce,(0,n.v_)(o.processingError.suggestion),1)):(0,i.Q3)("",!0)]),(0,i.Lk)("div",he,[o.processingError.recoverable?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:"primary",size:"small",onClick:l.retryOperation},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"redo"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.retry")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"default",size:"small",onClick:l.dismissError},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.close")),1)]),_:1},8,["onClick"])])])):((0,i.uX)(),(0,i.CE)("div",ue,[(0,i.bF)(y,{content:t.$t("sysStatus.rebuildTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"primary",loading:o.rebuilding,disabled:o.isProcessing,onClick:l.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt"}),(0,i.eW)(" "+(0,n.v_)(o.rebuilding?t.$t("sysStatus.rebuilding"):t.$t("sysStatus.rebuildIndex")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.backupTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"success",loading:o.backing,disabled:o.isProcessing,onClick:l.backupData,class:"action-btn backup-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"download"}),(0,i.eW)(" "+(0,n.v_)(o.backing?t.$t("sysStatus.backingUp"):t.$t("sysStatus.backupData")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.restoreTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",pe,[(0,i.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:e[5]||(e[5]=(...t)=>l.handleFileSelect&&l.handleFileSelect(...t)),style:{display:"none"}},null,544),(0,i.bF)(d,{type:"warning",loading:o.restoring,disabled:o.isProcessing,onClick:l.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"upload"}),(0,i.eW)(" "+(0,n.v_)(o.restoring?t.$t("sysStatus.restoring"):t.$t("sysStatus.restoreData")),1)]),_:1},8,["loading","disabled","onClick"])])]),_:1},8,["content"])]))])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",ge,[o.indexInfo.newestFile?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"file-info-card info-card-newest",onClick:e[8]||(e[8]=t=>l.openFileInNewTab(o.indexInfo.newestFile))},[l.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[6]||(e[6]=t=>l.handleImageError("newest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[7]||(e[7]=t=>l.handleImageError("newest"))},null,40,fe)):((0,i.uX)(),(0,i.CE)("div",me,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",be,[(0,i.bF)(r,{icon:"arrow-up"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.latestUpload")),1)]),(0,i.Lk)("div",ye,[(0,i.Lk)("div",xe,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,i.Lk)("div",ve,(0,n.v_)(l.formatTime(o.indexInfo.newestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0),o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",{key:1,class:"file-info-card info-card-oldest",onClick:e[11]||(e[11]=t=>l.openFileInNewTab(o.indexInfo.oldestFile))},[l.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[9]||(e[9]=t=>l.handleImageError("oldest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[10]||(e[10]=t=>l.handleImageError("oldest"))},null,40,_e)):((0,i.uX)(),(0,i.CE)("div",ke,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",we,[(0,i.bF)(r,{icon:"arrow-down"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.earliestUpload")),1)]),(0,i.Lk)("div",Ce,[(0,i.Lk)("div",Se,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,i.Lk)("div",Fe,(0,n.v_)(l.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0)])):(0,i.Q3)("",!0)])),[[C,o.loading]])}s(18111),s(7588),s(61701),s(18237),s(17642),s(58004),s(33853),s(45876),s(32475),s(15024),s(31698),s(58335),s(14603),s(47566),s(98721);var Pe=s(70797),Me={rE:"2.7.4"},De=(s(20116),s(91114));s(22489),s(13579); +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[529],{2893:function(t,e,s){s(85331)},3261:function(t,e,s){s(85331)},4885:function(t,e,s){s(85331)},5802:function(t,e,s){s(85331),s(38736),s(213),s(85970)},15616:function(t,e,s){s(85331),s(97197)},31529:function(t,e,s){s.r(e),s.d(e,{default:function(){return Qg}});var i=s(56768),n=s(24232);const a={class:"menu-list"},o=["onClick"],l={class:"menu-text"};function r(t,e,s,r,d,c){const h=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["sidebar-container",{"is-collapsed":s.isCollapse}]),ref:"sidebar",style:(0,n.Tr)(c.sidebarStyle)},[(0,i.Lk)("div",a,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.menuItems,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.index,class:(0,n.C4)(["menu-item",{"is-active":s.activeIndex===e.index}]),onClick:t=>c.handleSelect(e.index)},[(0,i.bF)(h,{icon:e.icon,class:"menu-icon"},null,8,["icon"]),(0,i.Lk)("span",l,(0,n.v_)(t.$t(e.titleKey)),1)],10,o))),128))]),(0,i.Lk)("div",{class:"toggle-button",onClick:e[0]||(e[0]=(...t)=>c.toggleCollapse&&c.toggleCollapse(...t))},[(0,i.bF)(h,{icon:s.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],6)}var d={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{expandedWidth:null,menuItems:[{index:"status",icon:"chart-bar",titleKey:"sysConfigTabs.systemStatus"},{index:"upload",icon:"cloud-upload",titleKey:"sysConfigTabs.uploadSettings"},{index:"security",icon:"shield",titleKey:"sysConfigTabs.securitySettings"},{index:"page",icon:"pager",titleKey:"sysConfigTabs.pageSettings"},{index:"others",icon:"cog",titleKey:"sysConfigTabs.otherSettings"}]}},computed:{collapsedWidth(){return window.innerWidth<=768?50:56},sidebarStyle(){return this.isCollapse?{width:this.collapsedWidth+"px"}:this.expandedWidth?{width:this.expandedWidth+"px"}:{}}},watch:{"$i18n.locale"(){this.$nextTick(()=>this.measureWidth())}},methods:{toggleCollapse(){this.$emit("update:isCollapse",!this.isCollapse)},checkMobile(){const t=window.innerWidth<=768;this.$emit("update:isCollapse",t)},handleSelect(t){this.$emit("update:activeIndex",t)},measureWidth(){const t=this.$refs.sidebar;if(!t)return;const e=t.style.width,s=t.style.transition,i=t.classList.contains("is-collapsed");t.style.transition="none",i&&t.classList.remove("is-collapsed"),t.style.width="auto",t.offsetWidth;const n=t.scrollWidth;t.style.width=e,i&&t.classList.add("is-collapsed"),t.offsetWidth,t.style.transition=s,this.expandedWidth=n}},mounted(){this.checkMobile(),this.$nextTick(()=>this.measureWidth()),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},c=s(71241);const h=(0,c.A)(d,[["render",r],["__scopeId","data-v-2718059d"]]);var u=h,p=s(54880),g=(s(85331),s(77128),s(78507)),f=(s(213),s(36600));const m={class:"container"},b={class:"header-content"},y={class:"header-action"};function x(t,e,s,a,o,l){const r=f.A,d=(0,i.g2)("font-awesome-icon"),c=g.R7,h=p.bZ,x=u;return(0,i.uX)(),(0,i.CE)("div",m,[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",b,[(0,i.bF)(r,{activeTab:"systemConfig"}),(0,i.Lk)("div",y,[(0,i.bF)(c,{disabled:l.disableTooltip,content:t.$t("sysConfig.logout"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{icon:"sign-out-alt",class:"header-icon",onClick:l.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,i.bF)(x,{activeIndex:o.activeIndex,"onUpdate:activeIndex":e[0]||(e[0]=t=>o.activeIndex=t),isCollapse:o.isSidebarCollapse,"onUpdate:isCollapse":e[1]||(e[1]=t=>o.isSidebarCollapse=t)},null,8,["activeIndex","isCollapse"]),((0,i.uX)(),(0,i.Wv)((0,i.$y)(l.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:o.isSidebarCollapse}])},null,8,["class"]))])}s(44114),s(33110);var v=s(99114),_=(s(30694),s(57009)),k=(s(78450),s(69655)),w=(s(2893),s(9267)),C=(s(15616),s(45130));const S={class:"date-range-calendar"},F={class:"selected-range"},T={class:"selected-range-inputs"},P=["aria-label"],M={class:"date-range-separator"},D=["aria-label"],A={class:"calendar-header"},$=["aria-label"],V={class:"calendar-title"},L=["aria-label"],E={class:"calendar-weekdays"},I={class:"calendar-grid"},U=["onClick"];function O(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",S,[(0,i.Lk)("div",F,[(0,i.Lk)("div",T,[(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[0]||(e[0]=t=>o.inputStart=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.startDateLabel,onChange:e[1]||(e[1]=(...t)=>l.handleManualInput&&l.handleManualInput(...t))},null,40,P),[[C.Jo,o.inputStart,void 0,{trim:!0}]]),(0,i.Lk)("span",M,(0,n.v_)(l.rangeSeparator),1),(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>o.inputEnd=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.endDateLabel,onChange:e[3]||(e[3]=(...t)=>l.handleManualInput&&l.handleManualInput(...t))},null,40,D),[[C.Jo,o.inputEnd,void 0,{trim:!0}]])])]),(0,i.Lk)("div",A,[(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.previousMonthLabel,onClick:e[4]||(e[4]=(...t)=>l.goToPreviousMonth&&l.goToPreviousMonth(...t))},[(0,i.bF)(r,{icon:"chevron-left"})],8,$),(0,i.Lk)("div",V,(0,n.v_)(l.monthTitle),1),(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.nextMonthLabel,onClick:e[5]||(e[5]=(...t)=>l.goToNextMonth&&l.goToNextMonth(...t))},[(0,i.bF)(r,{icon:"chevron-right"})],8,L)]),(0,i.Lk)("div",E,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.weekdayLabels,t=>((0,i.uX)(),(0,i.CE)("span",{key:t},(0,n.v_)(t),1))),128))]),(0,i.Lk)("div",I,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.calendarDays,t=>((0,i.uX)(),(0,i.CE)("button",{key:t.key,type:"button",class:(0,n.C4)(["calendar-day",{"is-muted":!t.isCurrentMonth,"is-today":t.isToday,"is-range-start":t.key===o.draftStart,"is-range-end":t.key===o.draftEnd,"is-in-range":l.isInRange(t.key)}]),onClick:e=>l.selectDay(t.key)},(0,n.v_)(t.dayOfMonth),11,U))),128))])])}const R=864e5;function W(t){return String(t).padStart(2,"0")}function B(t){return`${t.getFullYear()}-${W(t.getMonth()+1)}-${W(t.getDate())}`}function N(t){if("string"!==typeof t)return null;const e=t.trim().match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);if(!e)return null;const s=Number(e[1]),i=Number(e[2])-1,n=Number(e[3]),a=new Date(s,i,n);return a.getFullYear()!==s||a.getMonth()!==i||a.getDate()!==n?null:(a.setHours(0,0,0,0),a)}function z(t,e){return new Date(t.getFullYear(),t.getMonth()+e,1)}var j={name:"DateRangeCalendar",props:{modelValue:{type:Array,default:()=>[]}},emits:["update:modelValue","change"],data(){const t=new Date;return t.setHours(0,0,0,0),{displayYear:t.getFullYear(),displayMonth:t.getMonth(),draftStart:"",draftEnd:"",inputStart:"",inputEnd:"",awaitingEnd:!1}},computed:{previousMonthLabel(){return this.$t("dateRangeCalendar.previousMonth")},nextMonthLabel(){return this.$t("dateRangeCalendar.nextMonth")},startDateLabel(){return this.$t("dateRangeCalendar.startDate")},endDateLabel(){return this.$t("dateRangeCalendar.endDate")},rangeSeparator(){return this.$t("dateRangeCalendar.rangeSeparator")},monthTitle(){return this.$t("dateRangeCalendar.monthTitle",{year:this.displayYear,month:W(this.displayMonth+1)})},weekdayLabels(){return[this.$t("dateRangeCalendar.weekdaySun"),this.$t("dateRangeCalendar.weekdayMon"),this.$t("dateRangeCalendar.weekdayTue"),this.$t("dateRangeCalendar.weekdayWed"),this.$t("dateRangeCalendar.weekdayThu"),this.$t("dateRangeCalendar.weekdayFri"),this.$t("dateRangeCalendar.weekdaySat")]},calendarDays(){const t=new Date(this.displayYear,this.displayMonth,1),e=new Date(this.displayYear,this.displayMonth,1-t.getDay()),s=B(new Date);return Array.from({length:42},(t,i)=>{const n=new Date(e.getTime()+i*R),a=B(n);return{key:a,dayOfMonth:n.getDate(),isCurrentMonth:n.getMonth()===this.displayMonth,isToday:a===s}})}},watch:{modelValue:{immediate:!0,handler(t){this.syncFromModel(t)}}},methods:{syncFromModel(t){const e=N(t?.[0]),s=N(t?.[1]);this.draftStart=e?B(e):"",this.draftEnd=s?B(s):"",this.inputStart=this.draftStart,this.inputEnd=this.draftEnd,this.awaitingEnd=!1;const i=e||s;i&&(this.displayYear=i.getFullYear(),this.displayMonth=i.getMonth())},goToPreviousMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),-1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},goToNextMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},selectDay(t){if(!this.draftStart||this.draftEnd||!this.awaitingEnd)return this.draftStart=t,this.draftEnd="",this.inputStart=t,this.inputEnd="",void(this.awaitingEnd=!0);const e=tthis.draftStart&&tl.fetchIndexInfo&&l.fetchIndexInfo(...t))},[(0,i.Lk)("div",G,[(0,i.bF)(r,{icon:"database"})]),(0,i.Lk)("div",J,[(0,i.Lk)("div",Z,(0,n.v_)(t.$t("sysStatus.totalFiles")),1),(0,i.Lk)("div",tt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",et,(0,n.v_)(t.$t("sysStatus.clickToRefresh")),1)])]),(0,i.Lk)("div",st,[(0,i.Lk)("div",it,[(0,i.bF)(r,{icon:"clock"})]),(0,i.Lk)("div",nt,[(0,i.Lk)("div",at,(0,n.v_)(t.$t("sysStatus.indexUpdateTime")),1),(0,i.Lk)("div",ot,(0,n.v_)(l.formatTime(o.indexInfo.lastUpdated)),1),(0,i.Lk)("div",lt,(0,n.v_)(l.getTimeAgo(o.indexInfo.lastUpdated)),1)])]),(0,i.Lk)("div",{class:"overview-card system-version",onClick:e[1]||(e[1]=(...t)=>l.openReleases&&l.openReleases(...t))},[(0,i.Lk)("div",rt,[(0,i.bF)(r,{icon:"code-branch"})]),(0,i.Lk)("div",dt,[(0,i.Lk)("div",ct,(0,n.v_)(t.$t("sysStatus.systemVersion")),1),(0,i.Lk)("div",ht,"v"+(0,n.v_)(o.version),1),(0,i.Lk)("div",ut,(0,n.v_)(t.$t("sysStatus.clickToViewChangelog")),1)])])]),(0,i.Lk)("div",pt,[(0,i.Lk)("div",gt,[(0,i.Lk)("div",ft,[(0,i.Lk)("div",mt,[(0,i.bF)(r,{icon:"chart-line"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.uploadTrend")),1),(0,i.bF)(d,{class:"trend-calendar-btn",circle:"","aria-label":t.$t("sysStatus.selectDateRange"),onClick:l.openTrendDateDialog},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"calendar"})]),_:1},8,["aria-label","onClick"])]),(0,i.Lk)("div",bt,[(0,i.bF)(h,{modelValue:o.trendGroupBy,"onUpdate:modelValue":e[2]||(e[2]=t=>o.trendGroupBy=t),size:"small",class:"trend-group-switch","aria-label":t.$t("sysStatus.uploadTrendGroupBy")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:"channel"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelType")),1)]),_:1}),(0,i.bF)(c,{label:"channelName"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelName")),1)]),_:1})]),_:1},8,["modelValue","aria-label"])])]),(0,i.bF)(p,{modelValue:o.trendDatePickerVisible,"onUpdate:modelValue":e[4]||(e[4]=t=>o.trendDatePickerVisible=t),title:t.$t("sysStatus.selectDateRange"),width:l.trendDateDialogWidth,class:"trend-date-dialog","align-center":"","append-to-body":""},{default:(0,i.k6)(()=>[(0,i.Lk)("div",yt,[(0,i.bF)(u,{modelValue:o.trendDateRange,"onUpdate:modelValue":e[3]||(e[3]=t=>o.trendDateRange=t),onChange:l.handleTrendDateRangeChange},null,8,["modelValue","onChange"])])]),_:1},8,["modelValue","title","width"]),(0,i.Lk)("div",xt,[l.hasTrendData?((0,i.uX)(),(0,i.CE)("div",_t,[(0,i.bF)(f,{data:l.uploadTrendChartData,options:l.lineChartOptions},null,8,["data","options"])])):((0,i.uX)(),(0,i.CE)("div",vt,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)]))])]),(0,i.Lk)("div",kt,[(0,i.Lk)("div",wt,[(0,i.bF)(r,{icon:"share-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.channelDistribution")),1)]),(0,i.Lk)("div",Ct,[0===Object.keys(o.indexInfo.channelStats||{}).length?((0,i.uX)(),(0,i.CE)("div",St,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Ft,[(0,i.Lk)("div",Tt,[(0,i.bF)(m,{data:l.channelChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Pt,[(0,i.Lk)("div",Mt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",Dt,(0,n.v_)(t.$t("sysStatus.totalFilesLabel")),1)])]),(0,i.Lk)("div",At,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.indexInfo.channelStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getChartColor(s)})},null,4),(0,i.Lk)("span",$t,(0,n.v_)(e),1),(0,i.Lk)("span",Vt,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Lt,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,i.Lk)("div",Et,[(0,i.Lk)("div",It,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.fileStatusDistribution")),1)]),(0,i.Lk)("div",Ut,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,i.uX)(),(0,i.CE)("div",Ot,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Rt,[(0,i.Lk)("div",Wt,[(0,i.bF)(m,{data:l.typeChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Bt,[(0,i.Lk)("div",Nt,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),(0,i.Lk)("div",zt,(0,n.v_)(t.$t("sysStatus.statusTypes")),1)])]),(0,i.Lk)("div",jt,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.aggregatedTypeStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getTypeChartColor(s)})},null,4),(0,i.Lk)("span",qt,(0,n.v_)(e),1),(0,i.Lk)("span",Ht,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Xt,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,i.Lk)("div",Kt,[(0,i.Lk)("div",Qt,[(0,i.Lk)("div",Yt,[(0,i.bF)(r,{icon:"tools"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.systemMaintenance")),1)]),(0,i.Lk)("div",Gt,[o.isProcessing?((0,i.uX)(),(0,i.CE)("div",Jt,[(0,i.Lk)("div",Zt,[(0,i.Lk)("span",te,(0,n.v_)(l.phaseDescription),1),(0,i.Lk)("span",ee,(0,n.v_)(Math.round(o.processingProgress.percentage))+"%",1)]),(0,i.bF)(b,{percentage:o.processingProgress.percentage,"stroke-width":12,"show-text":!1,class:"progress-bar"},null,8,["percentage"]),(0,i.Lk)("div",se,[o.processingProgress.current>0?((0,i.uX)(),(0,i.CE)("span",ie,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.eW)(" "+(0,n.v_)(o.processingProgress.current.toLocaleString())+" ",1),o.processingProgress.total>0?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.eW)(" / "+(0,n.v_)(o.processingProgress.total.toLocaleString()),1)],64)):(0,i.Q3)("",!0),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.records")),1)])):(0,i.Q3)("",!0),l.estimatedTimeRemaining?((0,i.uX)(),(0,i.CE)("span",ne,[(0,i.bF)(r,{icon:"clock"}),(0,i.eW)(" "+(0,n.v_)(l.estimatedTimeRemaining),1)])):(0,i.Q3)("",!0)]),o.processingProgress.message?((0,i.uX)(),(0,i.CE)("div",ae,(0,n.v_)(o.processingProgress.message),1)):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"danger",plain:"",size:"small",onClick:l.cancelOperation,class:"cancel-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"times"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.cancelOperation")),1)]),_:1},8,["onClick"])])):o.processingError?((0,i.uX)(),(0,i.CE)("div",oe,[(0,i.Lk)("div",le,[(0,i.bF)(r,{icon:"exclamation-triangle"})]),(0,i.Lk)("div",re,[(0,i.Lk)("div",de,(0,n.v_)(o.processingError.message),1),o.processingError.suggestion?((0,i.uX)(),(0,i.CE)("div",ce,(0,n.v_)(o.processingError.suggestion),1)):(0,i.Q3)("",!0)]),(0,i.Lk)("div",he,[o.processingError.recoverable?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:"primary",size:"small",onClick:l.retryOperation},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"redo"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.retry")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"default",size:"small",onClick:l.dismissError},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.close")),1)]),_:1},8,["onClick"])])])):((0,i.uX)(),(0,i.CE)("div",ue,[(0,i.bF)(y,{content:t.$t("sysStatus.rebuildTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"primary",loading:o.rebuilding,disabled:o.isProcessing,onClick:l.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt"}),(0,i.eW)(" "+(0,n.v_)(o.rebuilding?t.$t("sysStatus.rebuilding"):t.$t("sysStatus.rebuildIndex")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.backupTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"success",loading:o.backing,disabled:o.isProcessing,onClick:l.backupData,class:"action-btn backup-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"download"}),(0,i.eW)(" "+(0,n.v_)(o.backing?t.$t("sysStatus.backingUp"):t.$t("sysStatus.backupData")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.restoreTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",pe,[(0,i.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:e[5]||(e[5]=(...t)=>l.handleFileSelect&&l.handleFileSelect(...t)),style:{display:"none"}},null,544),(0,i.bF)(d,{type:"warning",loading:o.restoring,disabled:o.isProcessing,onClick:l.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"upload"}),(0,i.eW)(" "+(0,n.v_)(o.restoring?t.$t("sysStatus.restoring"):t.$t("sysStatus.restoreData")),1)]),_:1},8,["loading","disabled","onClick"])])]),_:1},8,["content"])]))])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",ge,[o.indexInfo.newestFile?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"file-info-card info-card-newest",onClick:e[8]||(e[8]=t=>l.openFileInNewTab(o.indexInfo.newestFile))},[l.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[6]||(e[6]=t=>l.handleImageError("newest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[7]||(e[7]=t=>l.handleImageError("newest"))},null,40,fe)):((0,i.uX)(),(0,i.CE)("div",me,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",be,[(0,i.bF)(r,{icon:"arrow-up"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.latestUpload")),1)]),(0,i.Lk)("div",ye,[(0,i.Lk)("div",xe,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,i.Lk)("div",ve,(0,n.v_)(l.formatTime(o.indexInfo.newestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0),o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",{key:1,class:"file-info-card info-card-oldest",onClick:e[11]||(e[11]=t=>l.openFileInNewTab(o.indexInfo.oldestFile))},[l.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[9]||(e[9]=t=>l.handleImageError("oldest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[10]||(e[10]=t=>l.handleImageError("oldest"))},null,40,_e)):((0,i.uX)(),(0,i.CE)("div",ke,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",we,[(0,i.bF)(r,{icon:"arrow-down"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.earliestUpload")),1)]),(0,i.Lk)("div",Ce,[(0,i.Lk)("div",Se,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,i.Lk)("div",Fe,(0,n.v_)(l.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0)])):(0,i.Q3)("",!0)])),[[C,o.loading]])}s(18111),s(7588),s(61701),s(18237),s(17642),s(58004),s(33853),s(45876),s(32475),s(15024),s(31698),s(58335),s(14603),s(47566),s(98721);var Pe=s(70797),Me={rE:"2.7.4"},De=(s(20116),s(91114));s(22489),s(13579); /*! * @kurkle/color v0.3.4 * https://github.com/kurkle/color#readme @@ -20,4 +20,4 @@ function ks(){}const ws=(()=>{let t=0;return()=>t++})();function Cs(t){return nu * Released under the MIT License */ class eo{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,s,i){const n=e.listeners[i],a=e.duration;n.forEach(i=>i({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(s-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=$i.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((s,i)=>{if(!s.running||!s.items.length)return;const n=s.items;let a,o=n.length-1,l=!1;for(;o>=0;--o)a=n[o],a._active?(a._total>s.duration&&(s.duration=a._total),a.tick(t),l=!0):(n[o]=n[n.length-1],n.pop());l&&(i.draw(),this._notify(i,s,t,"progress")),n.length||(s.running=!1,this._notify(i,s,t,"complete"),s.initial=!1),e+=n.length}),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let s=e.get(t);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,s)),s}listen(t,e,s){this._getAnims(t).listeners[e].push(s)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((t,e)=>Math.max(t,e._duration),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const s=e.items;let i=s.length-1;for(;i>=0;--i)s[i].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var so=new eo;const io="transparent",no={boolean(t,e,s){return s>.5?e:t},color(t,e,s){const i=qi(t||io),n=i.valid&&qi(e||io);return n&&n.valid?n.mix(i,s).hexString():e},number(t,e,s){return t+(e-t)*s}};class ao{constructor(t,e,s,i){const n=e[s];i=Un([t.to,i,n,t.from]);const a=Un([t.from,n,i]);this._active=!0,this._fn=t.fn||no[t.type||typeof a],this._easing=zi[t.easing]||zi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=s,this._from=a,this._to=i,this._promises=void 0}active(){return this._active}update(t,e,s){if(this._active){this._notify(!1);const i=this._target[this._prop],n=s-this._start,a=this._duration-n;this._start=s,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Un([t.to,e,i,t.from]),this._from=Un([t.from,i,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,s=this._duration,i=this._prop,n=this._from,a=this._loop,o=this._to;let l;if(this._active=n!==o&&(a||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[i]=this._fn(n,o,l))}wait(){const t=this._promises||(this._promises=[]);return new Promise((e,s)=>{t.push({res:e,rej:s})})}_notify(t){const e=t?"res":"rej",s=this._promises||[];for(let i=0;i{const n=t[i];if(!Fs(n))return;const a={};for(const t of e)a[t]=n[t];(Ss(n.properties)&&n.properties||[i]).forEach(t=>{t!==i&&s.has(t)||s.set(t,a)})})}_animateOptions(t,e){const s=e.options,i=ro(t,s);if(!i)return[];const n=this._createAnimations(i,s);return s.$shared&&lo(t.options.$animations,s).then(()=>{t.options=s},()=>{}),n}_createAnimations(t,e){const s=this._properties,i=[],n=t.$animations||(t.$animations={}),a=Object.keys(e),o=Date.now();let l;for(l=a.length-1;l>=0;--l){const r=a[l];if("$"===r.charAt(0))continue;if("options"===r){i.push(...this._animateOptions(t,e));continue}const d=e[r];let c=n[r];const h=s.get(r);if(c){if(h&&c.active()){c.update(h,d,o);continue}c.cancel()}h&&h.duration?(n[r]=c=new ao(h,t,r,d),i.push(c)):t[r]=d}return i}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const s=this._createAnimations(t,e);return s.length?(so.add(this._chart,s),!0):void 0}}function lo(t,e){const s=[],i=Object.keys(e);for(let n=0;n0||!s&&e<0)return n.index}return null}function _o(t,e){const{chart:s,_cachedMeta:i}=t,n=s._stacks||(s._stacks={}),{iScale:a,vScale:o,index:l}=i,r=a.axis,d=o.axis,c=bo(a,o,i),h=e.length;let u;for(let p=0;ps[t].axis===e).shift()}function wo(t,e){return Rn(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function Co(t,e,s){return Rn(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:s,index:e,mode:"default",type:"data"})}function So(t,e){const s=t.controller.index,i=t.vScale&&t.vScale.axis;if(i){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[i]||void 0===e[i][s])return;delete e[i][s],void 0!==e[i]._visualValues&&void 0!==e[i]._visualValues[s]&&delete e[i]._visualValues[s]}}}const Fo=t=>"reset"===t||"none"===t,To=(t,e)=>e?t:Object.assign({},t),Po=(t,e,s)=>t&&!e.hidden&&e._stacked&&{keys:po(s,!0),values:null};class Mo{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=mo(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&So(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,s=this.getDataset(),i=(t,e,s,i)=>"x"===t?e:"r"===t?i:s,n=e.xAxisID=Ms(s.xAxisID,ko(t,"x")),a=e.yAxisID=Ms(s.yAxisID,ko(t,"y")),o=e.rAxisID=Ms(s.rAxisID,ko(t,"r")),l=e.indexAxis,r=e.iAxisID=i(l,n,a,o),d=e.vAxisID=i(l,a,n,o);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(o),e.iScale=this.getScaleForId(r),e.vScale=this.getScaleForId(d)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&Di(this._data,this),t._stacked&&So(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),s=this._data;if(Fs(e)){const t=this._cachedMeta;this._data=fo(e,t)}else if(s!==e){if(s){Di(s,this);const t=this._cachedMeta;So(t),t._parsed=[]}e&&Object.isExtensible(e)&&Mi(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,s=this.getDataset();let i=!1;this._dataCheck();const n=e._stacked;e._stacked=mo(e.vScale,e),e.stack!==s.stack&&(i=!0,So(e),e.stack=s.stack),this._resyncElements(t),(i||n!==e._stacked)&&(_o(this,e._parsed),e._stacked=mo(e.vScale,e))}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),s=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:s,_data:i}=this,{iScale:n,_stacked:a}=s,o=n.axis;let l,r,d,c=0===t&&e===i.length||s._sorted,h=t>0&&s._parsed[t-1];if(!1===this._parsing)s._parsed=i,s._sorted=!0,d=i;else{d=Ss(i[t])?this.parseArrayData(s,i,t,e):Fs(i[t])?this.parseObjectData(s,i,t,e):this.parsePrimitiveData(s,i,t,e);const n=()=>null===r[o]||h&&r[o]e||c=0;--h)if(!p()){this.updateRangeFromParsed(r,t,u,l);break}return r}getAllParsedValues(t){const e=this._cachedMeta._parsed,s=[];let i,n,a;for(i=0,n=e.length;i=0&&tthis.getContext(s,i,e),g=r.resolveNamedOptions(h,u,p,c);return g.$shared&&(g.$shared=l,n[a]=Object.freeze(To(g,l))),g}_resolveAnimations(t,e,s){const i=this.chart,n=this._cachedDataOpts,a=`animation-${e}`,o=n[a];if(o)return o;let l;if(!1!==i.options.animation){const i=this.chart.config,n=i.datasetAnimationScopeKeys(this._type,e),a=i.getOptionScopes(this.getDataset(),n);l=i.createResolver(a,this.getContext(t,s,e))}const r=new oo(i,l&&l.animations);return l&&l._cacheable&&(n[a]=Object.freeze(r)),r}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Fo(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const s=this.resolveDataElementOptions(t,e),i=this._sharedOptions,n=this.getSharedOptions(s),a=this.includeOptions(e,n)||n!==i;return this.updateSharedOptions(n,e,s),{sharedOptions:n,includeOptions:a}}updateElement(t,e,s,i){Fo(i)?Object.assign(t,s):this._resolveAnimations(e,i).update(t,s)}updateSharedOptions(t,e,s){t&&!Fo(e)&&this._resolveAnimations(void 0,e).update(t,s)}_setStyle(t,e,s,i){t.active=i;const n=this.getStyle(e,i);this._resolveAnimations(e,s,i).update(t,{options:!i&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,s){this._setStyle(t,s,"active",!1)}setHoverStyle(t,e,s){this._setStyle(t,s,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,s=this._cachedMeta.data;for(const[o,l,r]of this._syncList)this[o](l,r);this._syncList=[];const i=s.length,n=e.length,a=Math.min(n,i);a&&this.parse(0,a),n>i?this._insertElements(i,n-i,t):n{for(t.length+=e,o=t.length-1;o>=a;o--)t[o]=t[o-e]};for(l(n),o=t;ot-e))}return t._cache.$bar}function Ao(t){const e=t.iScale,s=Do(e,t.type);let i,n,a,o,l=e._length;const r=()=>{32767!==a&&-32768!==a&&(Hs(o)&&(l=Math.min(l,Math.abs(a-o)||l)),o=a)};for(i=0,n=s.length;i0?n[t-1]:null,l=tMath.abs(l)&&(r=l,d=o),e[s.axis]=d,e._custom={barStart:r,barEnd:d,start:n,end:a,min:o,max:l}}function Eo(t,e,s,i){return Ss(t)?Lo(t,e,s,i):e[s.axis]=s.parse(t,i),e}function Io(t,e,s,i){const n=t.iScale,a=t.vScale,o=n.getLabels(),l=n===a,r=[];let d,c,h,u;for(d=s,c=s+i;d=s?1:-1)}function Ro(t){let e,s,i,n,a;return t.horizontal?(e=t.base>t.x,s="left",i="right"):(e=t.baset.controller.options.grouped),n=s.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(e),l=o&&o[s.axis],r=t=>{const e=t._parsed.find(t=>t[s.axis]===l),i=e&&e[t.vScale.axis];if(Cs(i)||isNaN(i))return!0};for(const d of i)if((void 0===e||!r(d))&&((!1===n||-1===a.indexOf(d.stack)||void 0===n&&void 0===d.stack)&&a.push(d.stack),d.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(s=>t[s].axis===e).shift()}_getAxis(){const t={},e=this.getFirstScaleIdForIndexAxis();for(const s of this.chart.data.datasets)t[Ms("x"===this.chart.options.indexAxis?s.xAxisID:s.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,s){const i=this._getStacks(t,s),n=void 0!==e?i.indexOf(e):-1;return-1===n?i.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,s=e.iScale,i=[];let n,a;for(n=0,a=e.data.length;n=0;--s)e=Math.max(e,t[s].size(this.resolveDataElementOptions(s))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart.data.labels||[],{xScale:i,yScale:n}=e,a=this.getParsed(t),o=i.getLabelForValue(a.x),l=n.getLabelForValue(a.y),r=a._custom;return{label:s[t]||"",value:"("+o+", "+l+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:l,includeOptions:r}=this._getSharedOptions(e,i),d=a.axis,c=o.axis;for(let h=e;hvi(t,l,r,!0)?1:Math.max(e,e*s,i,i*s),g=(t,e,i)=>vi(t,l,r,!0)?-1:Math.min(e,e*s,i,i*s),f=p(0,d,h),m=p(ei,c,u),b=g(Ys,d,h),y=g(Ys+ei,c,u);i=(f-b)/2,n=(m-y)/2,a=-(f+b)/2,o=-(m+y)/2}return{ratioX:i,ratioY:n,offsetX:a,offsetY:o}}(0,De.A)(Ho,"id","bubble"),(0,De.A)(Ho,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),(0,De.A)(Ho,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class Ko extends Mo{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const s=this.getDataset().data,i=this._cachedMeta;if(!1===this._parsing)i._parsed=s;else{let n,a,o=t=>+s[t];if(Fs(s[t])){const{key:t="value"}=this._parsing;o=e=>+js(s[e],t)}for(n=t,a=t+e;n0&&!isNaN(t)?Gs*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(e._parsed[t],s.options.locale);return{label:i[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const s=this.chart;let i,n,a,o,l;if(!t)for(i=0,n=s.data.datasets.length;i"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),(0,De.A)(Ko,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data,{labels:{pointStyle:s,textAlign:i,color:n,useBorderRadius:a,borderRadius:o}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((e,l)=>{const r=t.getDatasetMeta(0),d=r.controller.getStyle(l);return{text:e,fillStyle:d.backgroundColor,fontColor:n,hidden:!t.getDataVisibility(l),lineDash:d.borderDash,lineDashOffset:d.borderDashOffset,lineJoin:d.borderJoinStyle,lineWidth:d.borderWidth,strokeStyle:d.borderColor,textAlign:i,pointStyle:s,borderRadius:a&&(o||d.borderRadius),index:l}}):[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}}});class Qo extends Mo{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:s,data:i=[],_dataset:n}=e,a=this.chart._animationsDisabled;let{start:o,count:l}=Oi(e,i,a);this._drawStart=o,this._drawCount=l,Ri(e)&&(o=0,l=i.length),s._chart=this.chart,s._datasetIndex=this.index,s._decimated=!!n._decimated,s.points=i;const r=this.resolveDatasetElementOptions(t);this.options.showLine||(r.borderWidth=0),r.segment=this.options.segment,this.updateElement(s,void 0,{animated:!a,options:r},t),this.updateElements(i,o,l,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o,_stacked:l,_dataset:r}=this._cachedMeta,{sharedOptions:d,includeOptions:c}=this._getSharedOptions(e,i),h=a.axis,u=o.axis,{spanGaps:p,segment:g}=this.options,f=ci(p)?p:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===i,b=e+s,y=t.length;let x=e>0&&this.getParsed(e-1);for(let v=0;v=b){p.skip=!0;continue}const y=this.getParsed(v),_=Cs(y[u]),k=p[h]=a.getPixelForValue(y[h],v),w=p[u]=n||_?o.getBasePixel():o.getPixelForValue(l?this.applyStack(o,y,l):y[u],v);p.skip=isNaN(k)||isNaN(w)||_,p.stop=v>0&&Math.abs(y[h]-x[h])>f,g&&(p.parsed=y,p.raw=r.data[v]),c&&(p.options=d||this.resolveDataElementOptions(v,s.active?"active":i)),m||this.updateElement(s,v,p,i),x=y}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,s=e.options&&e.options.borderWidth||0,i=t.data||[];if(!i.length)return s;const n=i[0].size(this.resolveDataElementOptions(0)),a=i[i.length-1].size(this.resolveDataElementOptions(i.length-1));return Math.max(s,n,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}(0,De.A)(Qo,"id","line"),(0,De.A)(Qo,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,De.A)(Qo,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class Yo extends Mo{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(e._parsed[t].r,s.options.locale);return{label:i[t]||"",value:n}}parseObjectData(t,e,s,i){return aa.bind(this)(t,e,s,i)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((t,s)=>{const i=this.getParsed(s).r;!isNaN(i)&&this.chart.getDataVisibility(s)&&(ie.max&&(e.max=i))}),e}_updateRadius(){const t=this.chart,e=t.chartArea,s=t.options,i=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(i/2,0),a=Math.max(s.cutoutPercentage?n/100*s.cutoutPercentage:1,0),o=(n-a)/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,s,i){const n="reset"===i,a=this.chart,o=a.options,l=o.animation,r=this._cachedMeta.rScale,d=r.xCenter,c=r.yCenter,h=r.getIndexAngle(0)-.5*Ys;let u,p=h;const g=360/this.countVisibleElements();for(u=0;u{!isNaN(this.getParsed(s).r)&&this.chart.getDataVisibility(s)&&e++}),e}_computeAngle(t,e,s){return this.chart.getDataVisibility(t)?pi(this.resolveDataElementOptions(t,e).angle||s):0}}(0,De.A)(Yo,"id","polarArea"),(0,De.A)(Yo,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),(0,De.A)(Yo,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:s,color:i}}=t.legend.options;return e.labels.map((e,n)=>{const a=t.getDatasetMeta(0),o=a.controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:i,lineWidth:o.borderWidth,pointStyle:s,hidden:!t.getDataVisibility(n),index:n}})}return[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class Go extends Ko{}(0,De.A)(Go,"id","pie"),(0,De.A)(Go,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class Jo extends Mo{getLabelAndValue(t){const e=this._cachedMeta.vScale,s=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(s[e.axis])}}parseObjectData(t,e,s,i){return aa.bind(this)(t,e,s,i)}update(t){const e=this._cachedMeta,s=e.dataset,i=e.data||[],n=e.iScale.getLabels();if(s.points=i,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const a={_loop:!0,_fullLoop:n.length===i.length,options:e};this.updateElement(s,void 0,a,t)}this.updateElements(i,0,i.length,t)}updateElements(t,e,s,i){const n=this._cachedMeta.rScale,a="reset"===i;for(let o=e;o0&&this.getParsed(e-1);for(let x=e;x0&&Math.abs(s[u]-y[u])>m,f&&(d.parsed=s,d.raw=r.data[x]),h&&(d.options=c||this.resolveDataElementOptions(x,e.active?"active":i)),b||this.updateElement(e,x,d,i),y=s}this.updateSharedOptions(c,i,d)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let s=e.length-1;s>=0;--s)t=Math.max(t,e[s].size(this.resolveDataElementOptions(s))/2);return t>0&&t}const s=t.dataset,i=s.options&&s.options.borderWidth||0;if(!e.length)return i;const n=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(i,n,a)/2}}(0,De.A)(Zo,"id","scatter"),(0,De.A)(Zo,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,De.A)(Zo,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function tl(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class el{static override(t){Object.assign(el.prototype,t)}constructor(t){(0,De.A)(this,"options",void 0),this.options=t||{}}init(){}formats(){return tl()}parse(){return tl()}format(){return tl()}add(){return tl()}diff(){return tl()}startOf(){return tl()}endOf(){return tl()}}var sl={_date:el};function il(t,e,s,i){const{controller:n,data:a,_sorted:o}=t,l=n._cachedMeta.iScale,r=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null;if(l&&e===l.axis&&"r"!==e&&o&&a.length){const o=l._reversePixels?Fi:Si;if(!i){const i=o(a,e,s);if(r){const{vScale:e}=n._cachedMeta,{_parsed:s}=t,a=s.slice(0,i.lo+1).reverse().findIndex(t=>!Cs(t[e.axis]));i.lo-=Math.max(0,a);const o=s.slice(i.hi).findIndex(t=>!Cs(t[e.axis]));i.hi+=Math.max(0,o)}return i}if(n._sharedOptions){const t=a[0],i="function"===typeof t.getRange&&t.getRange(e);if(i){const t=o(a,e,s-i),n=o(a,e,s+i);return{lo:t.lo,hi:n.hi}}}}return{lo:0,hi:a.length-1}}function nl(t,e,s,i,n){const a=t.getSortedVisibleDatasetMetas(),o=s[e];for(let l=0,r=a.length;l{t[o]&&t[o](e[s],n)&&(a.push({element:t,datasetIndex:i,index:r}),l=l||t.inRange(e.x,e.y,n))}),i&&!l?[]:a}var hl={evaluateInteractionItems:nl,modes:{index(t,e,s,i){const n=Sa(e,t),a=s.axis||"x",o=s.includeInvisible||!1,l=s.intersect?ol(t,n,a,i,o):dl(t,n,a,!1,i,o),r=[];return l.length?(t.getSortedVisibleDatasetMetas().forEach(t=>{const e=l[0].index,s=t.data[e];s&&!s.skip&&r.push({element:s,datasetIndex:t.index,index:e})}),r):[]},dataset(t,e,s,i){const n=Sa(e,t),a=s.axis||"xy",o=s.includeInvisible||!1;let l=s.intersect?ol(t,n,a,i,o):dl(t,n,a,!1,i,o);if(l.length>0){const e=l[0].datasetIndex,s=t.getDatasetMeta(e).data;l=[];for(let t=0;tt.pos===e)}function gl(t,e){return t.filter(t=>-1===ul.indexOf(t.pos)&&t.box.axis===e)}function fl(t,e){return t.sort((t,s)=>{const i=e?s:t,n=e?t:s;return i.weight===n.weight?i.index-n.index:i.weight-n.weight})}function ml(t){const e=[];let s,i,n,a,o,l;for(s=0,i=(t||[]).length;st.box.fullSize),!0),i=fl(pl(e,"left"),!0),n=fl(pl(e,"right")),a=fl(pl(e,"top"),!0),o=fl(pl(e,"bottom")),l=gl(e,"x"),r=gl(e,"y");return{fullSize:s,leftAndTop:i.concat(a),rightAndBottom:n.concat(r).concat(o).concat(l),chartArea:pl(e,"chartArea"),vertical:i.concat(n).concat(r),horizontal:a.concat(o).concat(l)}}function vl(t,e,s,i){return Math.max(t[s],e[s])+Math.max(t[i],e[i])}function _l(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function kl(t,e,s,i){const{pos:n,box:a}=s,o=t.maxPadding;if(!Fs(n)){s.size&&(t[n]-=s.size);const e=i[s.stack]||{size:0,count:1};e.size=Math.max(e.size,s.horizontal?a.height:a.width),s.size=e.size/e.count,t[n]+=s.size}a.getPadding&&_l(o,a.getPadding());const l=Math.max(0,e.outerWidth-vl(o,t,"left","right")),r=Math.max(0,e.outerHeight-vl(o,t,"top","bottom")),d=l!==t.w,c=r!==t.h;return t.w=l,t.h=r,s.horizontal?{same:d,other:c}:{same:c,other:d}}function wl(t){const e=t.maxPadding;function s(s){const i=Math.max(e[s]-t[s],0);return t[s]+=i,i}t.y+=s("top"),t.x+=s("left"),s("right"),s("bottom")}function Cl(t,e){const s=e.maxPadding;function i(t){const i={left:0,top:0,right:0,bottom:0};return t.forEach(t=>{i[t]=Math.max(e[t],s[t])}),i}return i(t?["left","right"]:["top","bottom"])}function Sl(t,e,s,i){const n=[];let a,o,l,r,d,c;for(a=0,o=t.length,d=0;a{"function"===typeof t.beforeLayout&&t.beforeLayout()});const c=r.reduce((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1,0)||1,h=Object.freeze({outerWidth:e,outerHeight:s,padding:n,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/c,hBoxMaxHeight:o/2}),u=Object.assign({},n);_l(u,En(i));const p=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),g=yl(r.concat(d),h);Sl(l.fullSize,p,h,g),Sl(r,p,h,g),Sl(d,p,h,g)&&Sl(r,p,h,g),wl(p),Tl(l.leftAndTop,p,h,g),p.x+=p.w,p.y+=p.h,Tl(l.rightAndBottom,p,h,g),t.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},Vs(l.chartArea,e=>{const s=e.box;Object.assign(s,t.chartArea),s.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}};class Ml{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,s){}removeEventListener(t,e,s){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,s,i){return e=Math.max(0,e||t.width),s=s||t.height,{width:e,height:Math.max(0,i?Math.floor(e/i):s)}}isAttached(t){return!0}updateConfig(t){}}class Dl extends Ml{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Al="$chartjs",$l={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Vl=t=>null===t||""===t;function Ll(t,e){const s=t.style,i=t.getAttribute("height"),n=t.getAttribute("width");if(t[Al]={initial:{height:i,width:n,style:{display:s.display,height:s.height,width:s.width}}},s.display=s.display||"block",s.boxSizing=s.boxSizing||"border-box",Vl(n)){const e=Aa(t,"width");void 0!==e&&(t.width=e)}if(Vl(i))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Aa(t,"height");void 0!==e&&(t.height=e)}return t}const El=!!Da&&{passive:!0};function Il(t,e,s){t&&t.addEventListener(e,s,El)}function Ul(t,e,s){t&&t.canvas&&t.canvas.removeEventListener(e,s,El)}function Ol(t,e){const s=$l[t.type]||t.type,{x:i,y:n}=Sa(t,e);return{type:s,chart:e,native:t,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Rl(t,e){for(const s of t)if(s===e||s.contains(e))return!0}function Wl(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||Rl(s.addedNodes,i),e=e&&!Rl(s.removedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}function Bl(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||Rl(s.removedNodes,i),e=e&&!Rl(s.addedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}const Nl=new Map;let zl=0;function jl(){const t=window.devicePixelRatio;t!==zl&&(zl=t,Nl.forEach((e,s)=>{s.currentDevicePixelRatio!==t&&e()}))}function ql(t,e){Nl.size||window.addEventListener("resize",jl),Nl.set(t,e)}function Hl(t){Nl.delete(t),Nl.size||window.removeEventListener("resize",jl)}function Xl(t,e,s){const i=t.canvas,n=i&&ba(i);if(!n)return;const a=Vi((t,e)=>{const i=n.clientWidth;s(t,e),i{const e=t[0],s=e.contentRect.width,i=e.contentRect.height;0===s&&0===i||a(s,i)});return o.observe(n),ql(t,a),o}function Kl(t,e,s){s&&s.disconnect(),"resize"===e&&Hl(t)}function Ql(t,e,s){const i=t.canvas,n=Vi(e=>{null!==t.ctx&&s(Ol(e,t))},t);return Il(i,e,n),n}class Yl extends Ml{acquireContext(t,e){const s=t&&t.getContext&&t.getContext("2d");return s&&s.canvas===t?(Ll(t,e),s):null}releaseContext(t){const e=t.canvas;if(!e[Al])return!1;const s=e[Al].initial;["height","width"].forEach(t=>{const i=s[t];Cs(i)?e.removeAttribute(t):e.setAttribute(t,i)});const i=s.style||{};return Object.keys(i).forEach(t=>{e.style[t]=i[t]}),e.width=e.width,delete e[Al],!0}addEventListener(t,e,s){this.removeEventListener(t,e);const i=t.$proxies||(t.$proxies={}),n={attach:Wl,detach:Bl,resize:Xl},a=n[e]||Ql;i[e]=a(t,e,s)}removeEventListener(t,e){const s=t.$proxies||(t.$proxies={}),i=s[e];if(!i)return;const n={attach:Kl,detach:Kl,resize:Kl},a=n[e]||Ul;a(t,e,i),s[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,s,i){return Pa(t,e,s,i)}isAttached(t){const e=t&&ba(t);return!(!e||!e.isConnected)}}function Gl(t){return!ma()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Dl:Yl}class Jl{constructor(){(0,De.A)(this,"x",void 0),(0,De.A)(this,"y",void 0),(0,De.A)(this,"active",!1),(0,De.A)(this,"options",void 0),(0,De.A)(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:s}=this.getProps(["x","y"],t);return{x:e,y:s}}hasValue(){return ci(this.x)&&ci(this.y)}getProps(t,e){const s=this.$animations;if(!e||!s)return this;const i={};return t.forEach(t=>{i[t]=s[t]&&s[t].active()?s[t]._to:this[t]}),i}}function Zl(t,e){const s=t.options.ticks,i=tr(t),n=Math.min(s.maxTicksLimit||i,i),a=s.major.enabled?sr(e):[],o=a.length,l=a[0],r=a[o-1],d=[];if(o>n)return ir(e,d,a,o/n),d;const c=er(a,e,n);if(o>0){let t,s;const i=o>1?Math.round((r-l)/(o-1)):null;for(nr(e,d,c,Cs(i)?0:l-i,l),t=0,s=o-1;tn)return t}return Math.max(n,1)}function sr(t){const e=[];let s,i;for(s=0,i=t.length;s"left"===t?"right":"right"===t?"left":t,lr=(t,e,s)=>"top"===e||"left"===e?t[e]+s:t[e]-s,rr=(t,e)=>Math.min(e||t,t);function dr(t,e){const s=[],i=t.length/e,n=t.length;let a=0;for(;ao+l)))return d}function hr(t,e){Vs(t,t=>{const s=t.gc,i=s.length/2;let n;if(i>e){for(n=0;ni?i:s,i=n&&s>i?s:i,{min:Ps(s,Ps(i,s)),max:Ps(i,Ps(s,i))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){const e=this._labelItems||(this._labelItems=this._computeLabelItems(t));return e}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){$s(this.options.beforeUpdate,[this])}update(t,e,s){const{beginAtZero:i,grace:n,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=On(this,n,i),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const l=o=n||s<=1||!this.isHorizontal())return void(this.labelRotation=i);const d=this._getLabelSizes(),c=d.widest.width,h=d.highest.height,u=_i(this.chart.width-c,0,this.maxWidth);a=t.offset?this.maxWidth/s:u/(s-1),c+6>a&&(a=u/(s-(t.offset?.5:1)),o=this.maxHeight-ur(t.grid)-e.padding-pr(t.title,this.chart.options.font),l=Math.sqrt(c*c+h*h),r=gi(Math.min(Math.asin(_i((d.highest.height+6)/a,-1,1)),Math.asin(_i(o/l,-1,1))-Math.asin(_i(h/l,-1,1)))),r=Math.max(i,Math.min(n,r))),this.labelRotation=r}afterCalculateLabelRotation(){$s(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){$s(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:s,title:i,grid:n}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){const a=pr(i,e.options.font);if(o?(t.width=this.maxWidth,t.height=ur(n)+a):(t.height=this.maxHeight,t.width=ur(n)+a),s.display&&this.ticks.length){const{first:e,last:i,widest:n,highest:a}=this._getLabelSizes(),l=2*s.padding,r=pi(this.labelRotation),d=Math.cos(r),c=Math.sin(r);if(o){const e=s.mirror?0:c*n.width+d*a.height;t.height=Math.min(this.maxHeight,t.height+e+l)}else{const e=s.mirror?0:d*n.width+c*a.height;t.width=Math.min(this.maxWidth,t.width+e+l)}this._calculatePadding(e,i,c,d)}}this._handleMargins(),o?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,s,i){const{ticks:{align:n,padding:a},position:o}=this.options,l=0!==this.labelRotation,r="top"!==o&&"x"===this.axis;if(this.isHorizontal()){const o=this.getPixelForTick(0)-this.left,d=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,h=0;l?r?(c=i*t.width,h=s*e.height):(c=s*t.height,h=i*e.width):"start"===n?h=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,h=e.width/2),this.paddingLeft=Math.max((c-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((h-d+a)*this.width/(this.width-d),0)}else{let s=e.height/2,i=t.height/2;"start"===n?(s=0,i=t.height):"end"===n&&(s=e.height,i=0),this.paddingTop=s+a,this.paddingBottom=i+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){$s(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,s;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,s=t.length;e({width:a[t]||0,height:o[t]||0});return{first:w(0),last:w(e-1),widest:w(_),highest:w(k),widths:a,heights:o}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return ki(this._alignToPixels?gn(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&to*i?o/s:l/i:l*i0}_computeGridLineItems(t){const e=this.axis,s=this.chart,i=this.options,{grid:n,position:a,border:o}=i,l=n.offset,r=this.isHorizontal(),d=this.ticks,c=d.length+(l?1:0),h=ur(n),u=[],p=o.setContext(this.getContext()),g=p.display?p.width:0,f=g/2,m=function(t){return gn(s,t,g)};let b,y,x,v,_,k,w,C,S,F,T,P;if("top"===a)b=m(this.bottom),k=this.bottom-h,C=b-f,F=m(t.top)+f,P=t.bottom;else if("bottom"===a)b=m(this.top),F=t.top,P=m(t.bottom)-f,k=b+f,C=this.top+h;else if("left"===a)b=m(this.right),_=this.right-h,w=b-f,S=m(t.left)+f,T=t.right;else if("right"===a)b=m(this.left),S=t.left,T=m(t.right)-f,_=b+f,w=this.left+h;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(Fs(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}F=t.top,P=t.bottom,k=b+f,C=k+h}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(Fs(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}_=b-f,w=_-h,S=t.left,T=t.right}const M=Ms(i.ticks.maxTicksLimit,c),D=Math.max(1,Math.ceil(c/M));for(y=0;y0&&(a-=i/2);break}h={left:a,top:n,width:i+e.width,height:s+e.height,color:t.backdropColor}}f.push({label:x,font:C,textOffset:T,options:{rotation:g,color:s,strokeColor:l,strokeWidth:d,textAlign:u,textBaseline:P,translation:[v,_],backdrop:h}})}return f}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options,s=-pi(this.labelRotation);if(s)return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:s,mirror:i,padding:n}}=this.options,a=this._getLabelSizes(),o=t+n,l=a.widest.width;let r,d;return"left"===e?i?(d=this.right+n,"near"===s?r="left":"center"===s?(r="center",d+=l/2):(r="right",d+=l)):(d=this.right-o,"near"===s?r="right":"center"===s?(r="center",d-=l/2):(r="left",d=this.left)):"right"===e?i?(d=this.left+n,"near"===s?r="right":"center"===s?(r="center",d-=l/2):(r="left",d-=l)):(d=this.left+o,"near"===s?r="left":"center"===s?(r="center",d+=l/2):(r="right",d=this.right)):r="right",{textAlign:r,x:d}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:s,top:i,width:n,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(s,i,n,a),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const s=this.ticks,i=s.findIndex(e=>e.value===t);if(i>=0){const t=e.setContext(this.getContext(i));return t.lineWidth}return 0}drawGrid(t){const e=this.options.grid,s=this.ctx,i=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,a;const o=(t,e,i)=>{i.width&&i.color&&(s.save(),s.lineWidth=i.width,s.strokeStyle=i.color,s.setLineDash(i.borderDash||[]),s.lineDashOffset=i.borderDashOffset,s.beginPath(),s.moveTo(t.x,t.y),s.lineTo(e.x,e.y),s.stroke(),s.restore())};if(e.display)for(n=0,a=i.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+"AxisID",i=[];let n,a;for(n=0,a=e.length;n{const i=s.split("."),n=i.pop(),a=[t].concat(i).join("."),o=e[s].split("."),l=o.pop(),r=o.join(".");cn.route(a,n,r,l)})}function kr(t){return"id"in t&&"defaults"in t}class wr{constructor(){this.controllers=new xr(Mo,"datasets",!0),this.elements=new xr(Jl,"elements"),this.plugins=new xr(Object,"plugins"),this.scales=new xr(yr,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,s){[...e].forEach(e=>{const i=s||this._getRegistryForType(e);s||i.isForType(e)||i===this.plugins&&e.id?this._exec(t,i,e):Vs(e,e=>{const i=s||this._getRegistryForType(e);this._exec(t,i,e)})})}_exec(t,e,s){const i=qs(t);$s(s["before"+i],[],s),e[t](s),$s(s["after"+i],[],s)}_getRegistryForType(t){for(let e=0;et.filter(t=>!e.some(e=>t.plugin.id===e.plugin.id));this._notify(i(e,s),t,"stop"),this._notify(i(s,e),t,"start")}}function Fr(t){const e={},s=[],i=Object.keys(Cr.plugins.items);for(let a=0;a1&&Vr(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Ir(t,e,s){if(s[e+"AxisID"]===t)return{axis:e}}function Ur(t,e){if(e.data&&e.data.datasets){const s=e.data.datasets.filter(e=>e.xAxisID===t||e.yAxisID===t);if(s.length)return Ir(t,"x",s[0])||Ir(t,"y",s[0])}return{}}function Or(t,e){const s=an[t.type]||{scales:{}},i=e.scales||{},n=Dr(t.type,e),a=Object.create(null);return Object.keys(i).forEach(e=>{const o=i[e];if(!Fs(o))return console.error(`Invalid scale configuration for scale: ${e}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const l=Er(e,o,Ur(e,t),cn.scales[o.type]),r=$r(l,n),d=s.scales||{};a[e]=Rs(Object.create(null),[{axis:l},o,d[l],d[r]])}),t.data.datasets.forEach(s=>{const n=s.type||t.type,o=s.indexAxis||Dr(n,e),l=an[n]||{},r=l.scales||{};Object.keys(r).forEach(t=>{const e=Ar(t,o),n=s[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),Rs(a[n],[{axis:e},i[n],r[t]])})}),Object.keys(a).forEach(t=>{const e=a[t];Rs(e,[cn.scales[e.type],cn.scale])}),a}function Rr(t){const e=t.options||(t.options={});e.plugins=Ms(e.plugins,{}),e.scales=Or(t,e)}function Wr(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function Br(t){return t=t||{},t.data=Wr(t.data),Rr(t),t}const Nr=new Map,zr=new Set;function jr(t,e){let s=Nr.get(t);return s||(s=e(),Nr.set(t,s),zr.add(s)),s}const qr=(t,e,s)=>{const i=js(e,s);void 0!==i&&t.add(i)};class Hr{constructor(t){this._config=Br(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Wr(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Rr(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return jr(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return jr(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return jr(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,s=this.type;return jr(`${s}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){const s=this._scopeCache;let i=s.get(t);return i&&!e||(i=new Map,s.set(t,i)),i}getOptionScopes(t,e,s){const{options:i,type:n}=this,a=this._cachedScopes(t,s),o=a.get(e);if(o)return o;const l=new Set;e.forEach(e=>{t&&(l.add(t),e.forEach(e=>qr(l,t,e))),e.forEach(t=>qr(l,i,t)),e.forEach(t=>qr(l,an[n]||{},t)),e.forEach(t=>qr(l,cn,t)),e.forEach(t=>qr(l,on,t))});const r=Array.from(l);return 0===r.length&&r.push(Object.create(null)),zr.has(e)&&a.set(e,r),r}chartOptionScopes(){const{options:t,type:e}=this;return[t,an[e]||{},cn.datasets[e]||{},{type:e},cn,on]}resolveNamedOptions(t,e,s,i=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=Xr(this._resolverCache,t,i);let l=a;if(Qr(a,e)){n.$shared=!1,s=Xs(s)?s():s;const e=this.createResolver(t,s,o);l=Bn(a,s,e)}for(const r of e)n[r]=l[r];return n}createResolver(t,e,s=[""],i){const{resolver:n}=Xr(this._resolverCache,t,s);return Fs(e)?Bn(n,e,void 0,i):n}}function Xr(t,e,s){let i=t.get(e);i||(i=new Map,t.set(e,i));const n=s.join();let a=i.get(n);if(!a){const t=Wn(e,s);a={resolver:t,subPrefixes:s.filter(t=>!t.toLowerCase().includes("hover"))},i.set(n,a)}return a}const Kr=t=>Fs(t)&&Object.getOwnPropertyNames(t).some(e=>Xs(t[e]));function Qr(t,e){const{isScriptable:s,isIndexable:i}=Nn(t);for(const n of e){const e=s(n),a=i(n),o=(a||e)&&t[n];if(e&&(Xs(o)||Kr(o))||a&&Ss(o))return!0}return!1}var Yr="4.5.1";const Gr=["top","bottom","left","right","chartArea"];function Jr(t,e){return"top"===t||"bottom"===t||-1===Gr.indexOf(t)&&"x"===e}function Zr(t,e){return function(s,i){return s[t]===i[t]?s[e]-i[e]:s[t]-i[t]}}function td(t){const e=t.chart,s=e.options.animation;e.notifyPlugins("afterRender"),$s(s&&s.onComplete,[t],e)}function ed(t){const e=t.chart,s=e.options.animation;$s(s&&s.onProgress,[t],e)}function sd(t){return ma()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const id={},nd=t=>{const e=sd(t);return Object.values(id).filter(t=>t.canvas===e).pop()};function ad(t,e,s){const i=Object.keys(t);for(const n of i){const i=+n;if(i>=e){const a=t[n];delete t[n],(s>0||i>e)&&(t[i+s]=a)}}}function od(t,e,s,i){return s&&"mouseout"!==t.type?i?e:t:null}class ld{static register(...t){Cr.add(...t),rd()}static unregister(...t){Cr.remove(...t),rd()}constructor(t,e){const s=this.config=new Hr(e),i=sd(t),n=nd(i);if(n)throw new Error("Canvas is already in use. Chart with ID '"+n.id+"' must be destroyed before the canvas with ID '"+n.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||Gl(i)),this.platform.updateConfig(s);const o=this.platform.acquireContext(i,a.aspectRatio),l=o&&o.canvas,r=l&&l.height,d=l&&l.width;this.id=ws(),this.ctx=o,this.canvas=l,this.width=d,this.height=r,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Sr,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Li(t=>this.update(t),a.resizeDelay||0),this._dataChanges=[],id[this.id]=this,o&&l?(so.listen(this,"complete",td),so.listen(this,"progress",ed),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:s,height:i,_aspectRatio:n}=this;return Cs(t)?e&&n?n:i?s/i:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Cr}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Ma(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return fn(this.canvas,this.ctx),this}stop(){return so.stop(this),this}resize(t,e){so.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const s=this.options,i=this.canvas,n=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(i,t,e,n),o=s.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Ma(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),$s(s.onResize,[this,a],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};Vs(e,(t,e)=>{t.id=e})}buildOrUpdateScales(){const t=this.options,e=t.scales,s=this.scales,i=Object.keys(s).reduce((t,e)=>(t[e]=!1,t),{});let n=[];e&&(n=n.concat(Object.keys(e).map(t=>{const s=e[t],i=Er(t,s),n="r"===i,a="x"===i;return{options:s,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),Vs(n,e=>{const n=e.options,a=n.id,o=Er(a,n),l=Ms(n.type,e.dtype);void 0!==n.position&&Jr(n.position,o)===Jr(e.dposition)||(n.position=e.dposition),i[a]=!0;let r=null;if(a in s&&s[a].type===l)r=s[a];else{const t=Cr.getScale(l);r=new t({id:a,type:l,ctx:this.ctx,chart:this}),s[r.id]=r}r.init(n,t)}),Vs(i,(t,e)=>{t||delete s[e]}),Vs(s,t=>{Pl.configure(this,t,t.options),Pl.addBox(this,t)})}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,s=t.length;if(t.sort((t,e)=>t.index-e.index),s>e){for(let t=e;te.length&&delete this._stacks,t.forEach((t,s)=>{0===e.filter(e=>e===t._dataset).length&&this._destroyDatasetMeta(s)})}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let s,i;for(this._removeUnreferencedMetasets(),s=0,i=e.length;s{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const s=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),i=this._animationsDisabled=!s.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let a=0;for(let r=0,d=this.data.datasets.length;r{t.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Zr("z","_idx"));const{_active:o,_lastEvent:l}=this;l?this._eventHandler(l,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){Vs(this.scales,t=>{Pl.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),s=new Set(t.events);Ks(e,s)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:s,start:i,count:n}of e){const e="_removeElements"===s?-n:n;ad(t,i,e)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,s=e=>new Set(t.filter(t=>t[0]===e).map((t,e)=>e+","+t.splice(1).join(","))),i=s(0);for(let n=1;nt.split(",")).map(t=>({method:t[1],start:+t[2],count:+t[3]}))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;Pl.update(this,this.width,this.height,t);const e=this.chartArea,s=e.width<=0||e.height<=0;this._layers=[],Vs(this.boxes,t=>{s&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))},this),this._layers.forEach((t,e)=>{t._idx=e}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,s={meta:t,index:t.index,cancelable:!0},i=to(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",s)&&(i&&xn(e,i),t.controller.draw(),i&&vn(e),s.cancelable=!1,this.notifyPlugins("afterDatasetDraw",s))}isPointInArea(t){return yn(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,s,i){const n=hl.modes[e];return"function"===typeof n?n(this,t,s,i):[]}getDatasetMeta(t){const e=this.data.datasets[t],s=this._metasets;let i=s.filter(t=>t&&t._dataset===e).pop();return i||(i={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},s.push(i)),i}getContext(){return this.$context||(this.$context=Rn(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const s=this.getDatasetMeta(t);return"boolean"===typeof s.hidden?!s.hidden:!e.hidden}setDatasetVisibility(t,e){const s=this.getDatasetMeta(t);s.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,s){const i=s?"show":"hide",n=this.getDatasetMeta(t),a=n.controller._resolveAnimations(void 0,i);Hs(e)?(n.data[e].hidden=!s,this.update()):(this.setDatasetVisibility(t,s),a.update(n,{visible:s}),this.update(e=>e.datasetIndex===t?i:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),so.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,s,i),t[s]=i},i=(t,e,s)=>{t.offsetX=e,t.offsetY=s,this._eventHandler(t)};Vs(this.options.events,t=>s(t,i))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,s=(s,i)=>{e.addEventListener(this,s,i),t[s]=i},i=(s,i)=>{t[s]&&(e.removeEventListener(this,s,i),delete t[s])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let a;const o=()=>{i("attach",o),this.attached=!0,this.resize(),s("resize",n),s("detach",a)};a=()=>{this.attached=!1,i("resize",n),this._stop(),this._resize(0,0),s("attach",o)},e.isAttached(this.canvas)?o():a()}unbindEvents(){Vs(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},Vs(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,s){const i=s?"set":"remove";let n,a,o,l;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+i+"DatasetHoverStyle"]()),o=0,l=t.length;o{const s=this.getDatasetMeta(t);if(!s)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),i=!Ls(s,e);i&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,e))}notifyPlugins(t,e,s){return this._plugins.notify(this,t,e,s)}isPluginEnabled(t){return 1===this._plugins._cache.filter(e=>e.plugin.id===t).length}_updateHoverStyles(t,e,s){const i=this.options.hover,n=(t,e)=>t.filter(t=>!e.some(e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)),a=n(e,t),o=s?t:n(t,e);a.length&&this.updateHoverStyle(a,i.mode,!1),o.length&&i.mode&&this.updateHoverStyle(o,i.mode,!0)}_eventHandler(t,e){const s={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},i=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",s,i))return;const n=this._handleEvent(t,e,s.inChartArea);return s.cancelable=!1,this.notifyPlugins("afterEvent",s,i),(n||s.changed)&&this.render(),this}_handleEvent(t,e,s){const{_active:i=[],options:n}=this,a=e,o=this._getActiveElements(t,i,s,a),l=Qs(t),r=od(t,this._lastEvent,s,l);s&&(this._lastEvent=null,$s(n.onHover,[t,o,this],this),l&&$s(n.onClick,[t,o,this],this));const d=!Ls(o,i);return(d||e)&&(this._active=o,this._updateHoverStyles(o,i,e)),this._lastEvent=r,d}_getActiveElements(t,e,s,i){if("mouseout"===t.type)return[];if(!s)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,i)}}function rd(){return Vs(ld.instances,t=>t._plugins.invalidate())}function dd(t,e,s){const{startAngle:i,x:n,y:a,outerRadius:o,innerRadius:l,options:r}=e,{borderWidth:d,borderJoinStyle:c}=r,h=Math.min(d/o,xi(i-s));if(t.beginPath(),t.arc(n,a,o-d/2,i+h/2,s-h/2),l>0){const e=Math.min(d/l,xi(i-s));t.arc(n,a,l+d/2,s-e/2,i+e/2,!0)}else{const e=Math.min(d/2,o*xi(i-s));if("round"===c)t.arc(n,a,e,s-Ys/2,i+Ys/2,!0);else if("bevel"===c){const o=2*e*e,l=-o*Math.cos(s+Ys/2)+n,r=-o*Math.sin(s+Ys/2)+a,d=o*Math.cos(i+Ys/2)+n,c=o*Math.sin(i+Ys/2)+a;t.lineTo(l,r),t.lineTo(d,c)}}t.closePath(),t.moveTo(0,0),t.rect(0,0,t.canvas.width,t.canvas.height),t.clip("evenodd")}function cd(t,e,s){const{startAngle:i,pixelMargin:n,x:a,y:o,outerRadius:l,innerRadius:r}=e;let d=n/l;t.beginPath(),t.arc(a,o,l,i-d,s+d),r>n?(d=n/r,t.arc(a,o,r,s+d,i-d,!0)):t.arc(a,o,n,s+ei,i-ei),t.closePath(),t.clip()}function hd(t){return $n(t,["outerStart","outerEnd","innerStart","innerEnd"])}function ud(t,e,s,i){const n=hd(t.options.borderRadius),a=(s-e)/2,o=Math.min(a,i*e/2),l=t=>{const e=(s-Math.min(a,t))*i/2;return _i(t,0,Math.min(a,e))};return{outerStart:l(n.outerStart),outerEnd:l(n.outerEnd),innerStart:_i(n.innerStart,0,o),innerEnd:_i(n.innerEnd,0,o)}}function pd(t,e,s,i){return{x:s+t*Math.cos(e),y:i+t*Math.sin(e)}}function gd(t,e,s,i,n,a){const{x:o,y:l,startAngle:r,pixelMargin:d,innerRadius:c}=e,h=Math.max(e.outerRadius+i+s-d,0),u=c>0?c+i+s+d:0;let p=0;const g=n-r;if(i){const t=c>0?c-i:0,e=h>0?h-i:0,s=(t+e)/2,n=0!==s?g*s/(s+i):g;p=(g-n)/2}const f=Math.max(.001,g*h-s/Ys)/h,m=(g-f)/2,b=r+m+p,y=n-m-p,{outerStart:x,outerEnd:v,innerStart:_,innerEnd:k}=ud(e,u,h,y-b),w=h-x,C=h-v,S=b+x/w,F=y-v/C,T=u+_,P=u+k,M=b+_/T,D=y-k/P;if(t.beginPath(),a){const e=(S+F)/2;if(t.arc(o,l,h,S,e),t.arc(o,l,h,e,F),v>0){const e=pd(C,F,o,l);t.arc(e.x,e.y,v,F,y+ei)}const s=pd(P,y,o,l);if(t.lineTo(s.x,s.y),k>0){const e=pd(P,D,o,l);t.arc(e.x,e.y,k,y+ei,D+Math.PI)}const i=(y-k/u+(b+_/u))/2;if(t.arc(o,l,u,y-k/u,i,!0),t.arc(o,l,u,i,b+_/u,!0),_>0){const e=pd(T,M,o,l);t.arc(e.x,e.y,_,M+Math.PI,b-ei)}const n=pd(w,b,o,l);if(t.lineTo(n.x,n.y),x>0){const e=pd(w,S,o,l);t.arc(e.x,e.y,x,b-ei,S)}}else{t.moveTo(o,l);const e=Math.cos(S)*h+o,s=Math.sin(S)*h+l;t.lineTo(e,s);const i=Math.cos(F)*h+o,n=Math.sin(F)*h+l;t.lineTo(i,n)}t.closePath()}function fd(t,e,s,i,n){const{fullCircles:a,startAngle:o,circumference:l}=e;let r=e.endAngle;if(a){gd(t,e,s,i,r,n);for(let e=0;e=Ys&&0===p&&"miter"!==c&&dd(t,e,f),a||(gd(t,e,s,i,f,n),t.stroke())}(0,De.A)(ld,"defaults",cn),(0,De.A)(ld,"instances",id),(0,De.A)(ld,"overrides",an),(0,De.A)(ld,"registry",Cr),(0,De.A)(ld,"version",Yr),(0,De.A)(ld,"getChart",nd);class bd extends Jl{constructor(t){super(),(0,De.A)(this,"circumference",void 0),(0,De.A)(this,"endAngle",void 0),(0,De.A)(this,"fullCircles",void 0),(0,De.A)(this,"innerRadius",void 0),(0,De.A)(this,"outerRadius",void 0),(0,De.A)(this,"pixelMargin",void 0),(0,De.A)(this,"startAngle",void 0),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,s){const i=this.getProps(["x","y"],s),{angle:n,distance:a}=mi(i,{x:t,y:e}),{startAngle:o,endAngle:l,innerRadius:r,outerRadius:d,circumference:c}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],s),h=(this.options.spacing+this.options.borderWidth)/2,u=Ms(c,l-o),p=vi(n,o,l)&&o!==l,g=u>=Gs||p,f=wi(a,r+h,d+h);return g&&f}getCenterPoint(t){const{x:e,y:s,startAngle:i,endAngle:n,innerRadius:a,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:l,spacing:r}=this.options,d=(i+n)/2,c=(a+o+r+l)/2;return{x:e+Math.cos(d)*c,y:s+Math.sin(d)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:s}=this,i=(e.offset||0)/4,n=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=s>Gs?Math.floor(s/Gs):0,0===s||this.innerRadius<0||this.outerRadius<0)return;t.save();const o=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(o)*i,Math.sin(o)*i);const l=1-Math.sin(Math.min(Ys,s||0)),r=i*l;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,fd(t,this,r,n,a),md(t,this,r,n,a),t.restore()}}function yd(t,e,s=e){t.lineCap=Ms(s.borderCapStyle,e.borderCapStyle),t.setLineDash(Ms(s.borderDash,e.borderDash)),t.lineDashOffset=Ms(s.borderDashOffset,e.borderDashOffset),t.lineJoin=Ms(s.borderJoinStyle,e.borderJoinStyle),t.lineWidth=Ms(s.borderWidth,e.borderWidth),t.strokeStyle=Ms(s.borderColor,e.borderColor)}function xd(t,e,s){t.lineTo(s.x,s.y)}function vd(t){return t.stepped?_n:t.tension||"monotone"===t.cubicInterpolationMode?kn:xd}function _d(t,e,s={}){const i=t.length,{start:n=0,end:a=i-1}=s,{start:o,end:l}=e,r=Math.max(n,o),d=Math.min(a,l),c=nl&&a>l;return{count:i,start:r,loop:e.loop,ilen:d(o+(d?l-t:t))%a,x=()=>{p!==g&&(t.lineTo(m,g),t.lineTo(m,p),t.lineTo(m,f))};for(r&&(h=n[y(0)],t.moveTo(h.x,h.y)),c=0;c<=l;++c){if(h=n[y(c)],h.skip)continue;const e=h.x,s=h.y,i=0|e;i===u?(sg&&(g=s),m=(b*m+e)/++b):(x(),t.lineTo(e,s),u=i,b=0,p=g=s),f=s}x()}function Cd(t){const e=t.options,s=e.borderDash&&e.borderDash.length,i=!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!s;return i?wd:kd}function Sd(t){return t.stepped?Va:t.tension||"monotone"===t.cubicInterpolationMode?La:$a}function Fd(t,e,s,i){let n=e._path;n||(n=e._path=new Path2D,e.path(n,s,i)&&n.closePath()),yd(t,e.options),t.stroke(n)}function Td(t,e,s,i){const{segments:n,options:a}=e,o=Cd(e);for(const l of n)yd(t,a,l.style),t.beginPath(),o(t,e,l,{start:s,end:s+i-1})&&t.closePath(),t.stroke()}(0,De.A)(bd,"id","arc"),(0,De.A)(bd,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),(0,De.A)(bd,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,De.A)(bd,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Pd="function"===typeof Path2D;function Md(t,e,s,i){Pd&&!e.options.segment?Fd(t,e,s,i):Td(t,e,s,i)}class Dd extends Jl{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const s=this.options;if((s.tension||"monotone"===s.cubicInterpolationMode)&&!s.stepped&&!this._pointsUpdated){const i=s.spanGaps?this._loop:this._fullLoop;fa(this._points,s,t,i,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Xa(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,s=t.length;return s&&e[t[s-1].end]}interpolate(t,e){const s=this.options,i=t[e],n=this.points,a=ja(this,{property:e,start:i,end:i});if(!a.length)return;const o=[],l=Sd(s);let r,d;for(r=0,d=a.length;r"borderDash"!==t&&"fill"!==t});class $d extends Jl{constructor(t){super(),(0,De.A)(this,"parsed",void 0),(0,De.A)(this,"skip",void 0),(0,De.A)(this,"stop",void 0),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,s){const i=this.options,{x:n,y:a}=this.getProps(["x","y"],s);return Math.pow(t-n,2)+Math.pow(e-a,2){e=Hd(t,e,n);const o=n[t],l=n[e];null!==i?(a.push({x:o.x,y:i}),a.push({x:l.x,y:i})):null!==s&&(a.push({x:s,y:o.y}),a.push({x:s,y:l.y}))}),a}function Hd(t,e,s){for(;e>t;e--){const t=s[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function Xd(t,e,s,i){return t&&e?i(t[s],e[s]):t?t[s]:e?e[s]:0}function Kd(t,e){let s=[],i=!1;return Ss(t)?(i=!0,s=t):s=qd(t,e),s.length?new Dd({points:s,options:{tension:0},_loop:i,_fullLoop:i}):null}function Qd(t){return t&&!1!==t.fill}function Yd(t,e,s){const i=t[e];let n=i.fill;const a=[e];let o;if(!s)return n;while(!1!==n&&-1===a.indexOf(n)){if(!Ts(n))return n;if(o=t[n],!o)return!1;if(o.visible)return n;a.push(n),n=o.fill}return!1}function Gd(t,e,s){const i=ec(t);if(Fs(i))return!isNaN(i.value)&&i;let n=parseFloat(i);return Ts(n)&&Math.floor(n)===n?Jd(i[0],e,n,s):["origin","start","end","stack","shape"].indexOf(i)>=0&&i}function Jd(t,e,s,i){return"-"!==t&&"+"!==t||(s=e+s),!(s===e||s<0||s>=i)&&s}function Zd(t,e){let s=null;return"start"===t?s=e.bottom:"end"===t?s=e.top:Fs(t)?s=e.getPixelForValue(t.value):e.getBasePixel&&(s=e.getBasePixel()),s}function tc(t,e,s){let i;return i="start"===t?s:"end"===t?e.options.reverse?e.min:e.max:Fs(t)?t.value:e.getBaseValue(),i}function ec(t){const e=t.options,s=e.fill;let i=Ms(s&&s.target,s);return void 0===i&&(i=!!e.backgroundColor),!1!==i&&null!==i&&(!0===i?"origin":i)}function sc(t){const{scale:e,index:s,line:i}=t,n=[],a=i.segments,o=i.points,l=ic(e,s);l.push(Kd({x:null,y:e.bottom},i));for(let r=0;r=0;--o){const e=n[o].$filler;e&&(e.line.updateControlPoints(a,e.axis),i&&e.fill&&uc(t.ctx,e,a))}},beforeDatasetsDraw(t,e,s){if("beforeDatasetsDraw"!==s.drawTime)return;const i=t.getSortedVisibleDatasetMetas();for(let n=i.length-1;n>=0;--n){const e=i[n].$filler;Qd(e)&&uc(t.ctx,e,t.chartArea)}},beforeDatasetDraw(t,e,s){const i=e.meta.$filler;Qd(i)&&"beforeDatasetDraw"===s.drawTime&&uc(t.ctx,i,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const vc=(t,e)=>{let{boxHeight:s=e,boxWidth:i=e}=t;return t.usePointStyle&&(s=Math.min(s,e),i=t.pointStyleWidth||Math.min(i,e)),{boxWidth:i,boxHeight:s,itemHeight:Math.max(e,s)}},_c=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class kc extends Jl{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,s){this.maxWidth=t,this.maxHeight=e,this._margins=s,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=$s(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(e=>t.filter(e,this.chart.data))),t.sort&&(e=e.sort((e,s)=>t.sort(e,s,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const s=t.labels,i=In(s.font),n=i.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:l}=vc(s,n);let r,d;e.font=i.string,this.isHorizontal()?(r=this.maxWidth,d=this._fitRows(a,n,o,l)+10):(d=this.maxHeight,r=this._fitCols(a,i,o,l)+10),this.width=Math.min(r,t.maxWidth||this.maxWidth),this.height=Math.min(d,t.maxHeight||this.maxHeight)}_fitRows(t,e,s,i){const{ctx:n,maxWidth:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.lineWidths=[0],d=i+o;let c=t;n.textAlign="left",n.textBaseline="middle";let h=-1,u=-d;return this.legendItems.forEach((t,p)=>{const g=s+e/2+n.measureText(t.text).width;(0===p||r[r.length-1]+g+2*o>a)&&(c+=d,r[r.length-(p>0?0:1)]=0,u+=d,h++),l[p]={left:0,top:u,row:h,width:g,height:i},r[r.length-1]+=g+o}),c}_fitCols(t,e,s,i){const{ctx:n,maxHeight:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.columnSizes=[],d=a-t;let c=o,h=0,u=0,p=0,g=0;return this.legendItems.forEach((t,a)=>{const{itemWidth:f,itemHeight:m}=wc(s,e,n,t,i);a>0&&u+m+2*o>d&&(c+=h+o,r.push({width:h,height:u}),p+=h+o,g++,h=u=0),l[a]={left:p,top:u,col:g,width:f,height:m},h=Math.max(h,f),u+=m+o}),c+=h,r.push({width:h,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:s,labels:{padding:i},rtl:n}}=this,a=Ua(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=Ii(s,this.left+i,this.right-this.lineWidths[n]);for(const l of e)n!==l.row&&(n=l.row,o=Ii(s,this.left+i,this.right-this.lineWidths[n])),l.top+=this.top+t+i,l.left=a.leftForLtr(a.x(o),l.width),o+=l.width+i}else{let n=0,o=Ii(s,this.top+t+i,this.bottom-this.columnSizes[n].height);for(const l of e)l.col!==n&&(n=l.col,o=Ii(s,this.top+t+i,this.bottom-this.columnSizes[n].height)),l.top=o,l.left+=this.left+i,l.left=a.leftForLtr(a.x(l.left),l.width),o+=l.height+i}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;xn(t,this),this._draw(),vn(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:s,ctx:i}=this,{align:n,labels:a}=t,o=cn.color,l=Ua(t.rtl,this.left,this.width),r=In(a.font),{padding:d}=a,c=r.size,h=c/2;let u;this.drawTitle(),i.textAlign=l.textAlign("left"),i.textBaseline="middle",i.lineWidth=.5,i.font=r.string;const{boxWidth:p,boxHeight:g,itemHeight:f}=vc(a,c),m=function(t,e,s){if(isNaN(p)||p<=0||isNaN(g)||g<0)return;i.save();const n=Ms(s.lineWidth,1);if(i.fillStyle=Ms(s.fillStyle,o),i.lineCap=Ms(s.lineCap,"butt"),i.lineDashOffset=Ms(s.lineDashOffset,0),i.lineJoin=Ms(s.lineJoin,"miter"),i.lineWidth=n,i.strokeStyle=Ms(s.strokeStyle,o),i.setLineDash(Ms(s.lineDash,[])),a.usePointStyle){const o={radius:g*Math.SQRT2/2,pointStyle:s.pointStyle,rotation:s.rotation,borderWidth:n},r=l.xPlus(t,p/2),d=e+h;bn(i,o,r,d,a.pointStyleWidth&&p)}else{const a=e+Math.max((c-g)/2,0),o=l.leftForLtr(t,p),r=Ln(s.borderRadius);i.beginPath(),Object.values(r).some(t=>0!==t)?Tn(i,{x:o,y:a,w:p,h:g,radius:r}):i.rect(o,a,p,g),i.fill(),0!==n&&i.stroke()}i.restore()},b=function(t,e,s){Fn(i,s.text,t,e+f/2,r,{strikethrough:s.hidden,textAlign:l.textAlign(s.textAlign)})},y=this.isHorizontal(),x=this._computeTitleHeight();u=y?{x:Ii(n,this.left+d,this.right-s[0]),y:this.top+d+x,line:0}:{x:this.left+d,y:Ii(n,this.top+x+d,this.bottom-e[0].height),line:0},Oa(this.ctx,t.textDirection);const v=f+d;this.legendItems.forEach((o,c)=>{i.strokeStyle=o.fontColor,i.fillStyle=o.fontColor;const g=i.measureText(o.text).width,f=l.textAlign(o.textAlign||(o.textAlign=a.textAlign)),_=p+h+g;let k=u.x,w=u.y;l.setWidth(this.width),y?c>0&&k+_+d>this.right&&(w=u.y+=v,u.line++,k=u.x=Ii(n,this.left+d,this.right-s[u.line])):c>0&&w+v>this.bottom&&(k=u.x=k+e[u.line].width+d,u.line++,w=u.y=Ii(n,this.top+x+d,this.bottom-e[u.line].height));const C=l.x(k);if(m(C,w,o),k=Ui(f,k+p+h,y?k+_:this.right,t.rtl),b(l.x(k),w,o),y)u.x+=_+d;else if("string"!==typeof o.text){const t=r.lineHeight;u.y+=Fc(o,t)+d}else u.y+=v}),Ra(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,s=In(e.font),i=En(e.padding);if(!e.display)return;const n=Ua(t.rtl,this.left,this.width),a=this.ctx,o=e.position,l=s.size/2,r=i.top+l;let d,c=this.left,h=this.width;if(this.isHorizontal())h=Math.max(...this.lineWidths),d=this.top+r,c=Ii(t.align,c,this.right-h);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);d=r+Ii(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=Ii(o,c,c+h);a.textAlign=n.textAlign(Ei(o)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=s.string,Fn(a,e.text,u,d,s)}_computeTitleHeight(){const t=this.options.title,e=In(t.font),s=En(t.padding);return t.display?e.lineHeight+s.height:0}_getLegendItemAt(t,e){let s,i,n;if(wi(t,this.left,this.right)&&wi(e,this.top,this.bottom))for(n=this.legendHitBoxes,s=0;st.length>e.length?t:e)),e+s.size/2+i.measureText(n).width}function Sc(t,e,s){let i=t;return"string"!==typeof e.text&&(i=Fc(e,s)),i}function Fc(t,e){const s=t.text?t.text.length:0;return e*s}function Tc(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var Pc={id:"legend",_element:kc,start(t,e,s){const i=t.legend=new kc({ctx:t.ctx,options:s,chart:t});Pl.configure(t,i,s),Pl.addBox(t,i)},stop(t){Pl.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,s){const i=t.legend;Pl.configure(t,i,s),i.options=s},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,s){const i=e.datasetIndex,n=s.chart;n.isDatasetVisible(i)?(n.hide(i),e.hidden=!0):(n.show(i),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:s,pointStyle:i,textAlign:n,color:a,useBorderRadius:o,borderRadius:l}}=t.legend.options;return t._getSortedDatasetMetas().map(t=>{const r=t.controller.getStyle(s?0:void 0),d=En(r.borderWidth);return{text:e[t.index].label,fillStyle:r.backgroundColor,fontColor:a,hidden:!t.visible,lineCap:r.borderCapStyle,lineDash:r.borderDash,lineDashOffset:r.borderDashOffset,lineJoin:r.borderJoinStyle,lineWidth:(d.width+d.height)/4,strokeStyle:r.borderColor,pointStyle:i||r.pointStyle,rotation:r.rotation,textAlign:n||r.textAlign,borderRadius:o&&(l||r.borderRadius),datasetIndex:t.index}},this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};new WeakMap;const Mc={average(t){if(!t.length)return!1;let e,s,i=new Set,n=0,a=0;for(e=0,s=t.length;et+e)/i.size;return{x:o,y:n/a}},nearest(t,e){if(!t.length)return!1;let s,i,n,a=e.x,o=e.y,l=Number.POSITIVE_INFINITY;for(s=0,i=t.length;s-1?t.split("\n"):t}function $c(t,e){const{element:s,datasetIndex:i,index:n}=e,a=t.getDatasetMeta(i).controller,{label:o,value:l}=a.getLabelAndValue(n);return{chart:t,label:o,parsed:a.getParsed(n),raw:t.data.datasets[i].data[n],formattedValue:l,dataset:a.getDataset(),dataIndex:n,datasetIndex:i,element:s}}function Vc(t,e){const s=t.chart.ctx,{body:i,footer:n,title:a}=t,{boxWidth:o,boxHeight:l}=e,r=In(e.bodyFont),d=In(e.titleFont),c=In(e.footerFont),h=a.length,u=n.length,p=i.length,g=En(e.padding);let f=g.height,m=0,b=i.reduce((t,e)=>t+e.before.length+e.lines.length+e.after.length,0);if(b+=t.beforeBody.length+t.afterBody.length,h&&(f+=h*d.lineHeight+(h-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(l,r.lineHeight):r.lineHeight;f+=p*t+(b-p)*r.lineHeight+(b-1)*e.bodySpacing}u&&(f+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let y=0;const x=function(t){m=Math.max(m,s.measureText(t).width+y)};return s.save(),s.font=d.string,Vs(t.title,x),s.font=r.string,Vs(t.beforeBody.concat(t.afterBody),x),y=e.displayColors?o+2+e.boxPadding:0,Vs(i,t=>{Vs(t.before,x),Vs(t.lines,x),Vs(t.after,x)}),y=0,s.font=c.string,Vs(t.footer,x),s.restore(),m+=g.width,{width:m,height:f}}function Lc(t,e){const{y:s,height:i}=e;return st.height-i/2?"bottom":"center"}function Ec(t,e,s,i){const{x:n,width:a}=i,o=s.caretSize+s.caretPadding;return"left"===t&&n+a+o>e.width||("right"===t&&n-a-o<0||void 0)}function Ic(t,e,s,i){const{x:n,width:a}=s,{width:o,chartArea:{left:l,right:r}}=t;let d="center";return"center"===i?d=n<=(l+r)/2?"left":"right":n<=a/2?d="left":n>=o-a/2&&(d="right"),Ec(d,t,e,s)&&(d="center"),d}function Uc(t,e,s){const i=s.yAlign||e.yAlign||Lc(t,s);return{xAlign:s.xAlign||e.xAlign||Ic(t,e,s,i),yAlign:i}}function Oc(t,e){let{x:s,width:i}=t;return"right"===e?s-=i:"center"===e&&(s-=i/2),s}function Rc(t,e,s){let{y:i,height:n}=t;return"top"===e?i+=s:i-="bottom"===e?n+s:n/2,i}function Wc(t,e,s,i){const{caretSize:n,caretPadding:a,cornerRadius:o}=t,{xAlign:l,yAlign:r}=s,d=n+a,{topLeft:c,topRight:h,bottomLeft:u,bottomRight:p}=Ln(o);let g=Oc(e,l);const f=Rc(e,r,d);return"center"===r?"left"===l?g+=d:"right"===l&&(g-=d):"left"===l?g-=Math.max(c,u)+n:"right"===l&&(g+=Math.max(h,p)+n),{x:_i(g,0,i.width-e.width),y:_i(f,0,i.height-e.height)}}function Bc(t,e,s){const i=En(s.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-i.right:t.x+i.left}function Nc(t){return Dc([],Ac(t))}function zc(t,e,s){return Rn(t,{tooltip:e,tooltipItems:s,type:"tooltip"})}function jc(t,e){const s=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return s?t.override(s):t}const qc={beforeTitle:ks,title(t){if(t.length>0){const e=t[0],s=e.chart.data.labels,i=s?s.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(i>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=jc(s,t);Dc(e.before,Ac(Hc(n,"beforeLabel",this,t))),Dc(e.lines,Hc(n,"label",this,t)),Dc(e.after,Ac(Hc(n,"afterLabel",this,t))),i.push(e)}),i}getAfterBody(t,e){return Nc(Hc(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:s}=e,i=Hc(s,"beforeFooter",this,t),n=Hc(s,"footer",this,t),a=Hc(s,"afterFooter",this,t);let o=[];return o=Dc(o,Ac(i)),o=Dc(o,Ac(n)),o=Dc(o,Ac(a)),o}_createItems(t){const e=this._active,s=this.chart.data,i=[],n=[],a=[];let o,l,r=[];for(o=0,l=e.length;ot.filter(e,i,n,s))),t.itemSort&&(r=r.sort((e,i)=>t.itemSort(e,i,s))),Vs(r,e=>{const s=jc(t.callbacks,e);i.push(Hc(s,"labelColor",this,e)),n.push(Hc(s,"labelPointStyle",this,e)),a.push(Hc(s,"labelTextColor",this,e))}),this.labelColors=i,this.labelPointStyles=n,this.labelTextColors=a,this.dataPoints=r,r}update(t,e){const s=this.options.setContext(this.getContext()),i=this._active;let n,a=[];if(i.length){const t=Mc[s.position].call(this,i,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);const e=this._size=Vc(this,s),o=Object.assign({},t,e),l=Uc(this.chart,s,o),r=Wc(s,o,l,this.chart);this.xAlign=l.xAlign,this.yAlign=l.yAlign,n={opacity:1,x:r.x,y:r.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=a,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,s,i){const n=this.getCaretPosition(t,s,i);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,s){const{xAlign:i,yAlign:n}=this,{caretSize:a,cornerRadius:o}=s,{topLeft:l,topRight:r,bottomLeft:d,bottomRight:c}=Ln(o),{x:h,y:u}=t,{width:p,height:g}=e;let f,m,b,y,x,v;return"center"===n?(x=u+g/2,"left"===i?(f=h,m=f-a,y=x+a,v=x-a):(f=h+p,m=f+a,y=x-a,v=x+a),b=f):(m="left"===i?h+Math.max(l,d)+a:"right"===i?h+p-Math.max(r,c)-a:this.caretX,"top"===n?(y=u,x=y-a,f=m-a,b=m+a):(y=u+g,x=y+a,f=m+a,b=m-a),v=y),{x1:f,x2:m,x3:b,y1:y,y2:x,y3:v}}drawTitle(t,e,s){const i=this.title,n=i.length;let a,o,l;if(n){const r=Ua(s.rtl,this.x,this.width);for(t.x=Bc(this,s.titleAlign,s),e.textAlign=r.textAlign(s.titleAlign),e.textBaseline="middle",a=In(s.titleFont),o=s.titleSpacing,e.fillStyle=s.titleColor,e.font=a.string,l=0;l0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,Tn(t,{x:e,y:p,w:r,h:l,radius:o}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),Tn(t,{x:s,y:p+1,w:r-2,h:l-2,radius:o}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,p,r,l),t.strokeRect(e,p,r,l),t.fillStyle=a.backgroundColor,t.fillRect(s,p+1,r-2,l-2))}t.fillStyle=this.labelTextColors[s]}drawBody(t,e,s){const{body:i}=this,{bodySpacing:n,bodyAlign:a,displayColors:o,boxHeight:l,boxWidth:r,boxPadding:d}=s,c=In(s.bodyFont);let h=c.lineHeight,u=0;const p=Ua(s.rtl,this.x,this.width),g=function(s){e.fillText(s,p.x(t.x+u),t.y+h/2),t.y+=h+n},f=p.textAlign(a);let m,b,y,x,v,_,k;for(e.textAlign=a,e.textBaseline="middle",e.font=c.string,t.x=Bc(this,f,s),e.fillStyle=s.bodyColor,Vs(this.beforeBody,g),u=o&&"right"!==f?"center"===a?r/2+d:r+2+d:0,x=0,_=i.length;x<_;++x){for(m=i[x],b=this.labelTextColors[x],e.fillStyle=b,Vs(m.before,g),y=m.lines,o&&y.length&&(this._drawColorBox(e,t,x,p,s),h=Math.max(c.lineHeight,l)),v=0,k=y.length;v0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,s=this.$animations,i=s&&s.x,n=s&&s.y;if(i||n){const s=Mc[t.position].call(this,this._active,this._eventPosition);if(!s)return;const a=this._size=Vc(this,t),o=Object.assign({},s,this._size),l=Uc(e,t,o),r=Wc(t,o,l,e);i._to===r.x&&n._to===r.y||(this.xAlign=l.xAlign,this.yAlign=l.yAlign,this.width=a.width,this.height=a.height,this.caretX=s.x,this.caretY=s.y,this._resolveAnimations().update(this,r))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let s=this.opacity;if(!s)return;this._updateAnimationTarget(e);const i={width:this.width,height:this.height},n={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;const a=En(e.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&o&&(t.save(),t.globalAlpha=s,this.drawBackground(n,t,i,e),Oa(t,e.textDirection),n.y+=a.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ra(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const s=this._active,i=t.map(({datasetIndex:t,index:e})=>{const s=this.chart.getDatasetMeta(t);if(!s)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),n=!Ls(s,i),a=this._positionChanged(i,e);(n||a)&&(this._active=i,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,s=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const i=this.options,n=this._active||[],a=this._getActiveElements(t,n,e,s),o=this._positionChanged(a,t),l=e||!Ls(a,n)||o;return l&&(this._active=a,(i.enabled||i.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,s,i){const n=this.options;if("mouseout"===t.type)return[];if(!i)return e.filter(t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index));const a=this.chart.getElementsAtEventForMode(t,n.mode,n,s);return n.reverse&&a.reverse(),a}_positionChanged(t,e){const{caretX:s,caretY:i,options:n}=this,a=Mc[n.position].call(this,t,e);return!1!==a&&(s!==a.x||i!==a.y)}}(0,De.A)(Xc,"positioners",Mc);var Kc={id:"tooltip",_element:Xc,positioners:Mc,afterInit(t,e,s){s&&(t.tooltip=new Xc({chart:t,options:s}))},beforeUpdate(t,e,s){t.tooltip&&t.tooltip.initialize(s)},reset(t,e,s){t.tooltip&&t.tooltip.initialize(s)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const s={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...s,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",s)}},afterEvent(t,e){if(t.tooltip){const s=e.replay;t.tooltip.handleEvent(e.event,s,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:qc},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};const Qc=(t,e,s,i)=>("string"===typeof e?(s=t.push(e)-1,i.unshift({index:s,label:e})):isNaN(e)&&(s=null),s);function Yc(t,e,s,i){const n=t.indexOf(e);if(-1===n)return Qc(t,e,s,i);const a=t.lastIndexOf(e);return n!==a?s:n}const Gc=(t,e)=>null===t?null:_i(Math.round(t),0,e);function Jc(t){const e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function th(t,e){const s=[],i=1e-14,{bounds:n,step:a,min:o,max:l,precision:r,count:d,maxTicks:c,maxDigits:h,includeBounds:u}=t,p=a||1,g=c-1,{min:f,max:m}=e,b=!Cs(o),y=!Cs(l),x=!Cs(d),v=(m-f)/(h+1);let _,k,w,C,S=li((m-f)/g/p)*p;if(Sg&&(S=li(C*S/g/p)*p),Cs(r)||(_=Math.pow(10,r),S=Math.ceil(S*_)/_),"ticks"===n?(k=Math.floor(f/S)*S,w=Math.ceil(m/S)*S):(k=f,w=m),b&&y&&a&&hi((l-o)/a,S/1e3)?(C=Math.round(Math.min((l-o)/S,c)),S=(l-o)/C,k=o,w=l):x?(k=b?o:k,w=y?l:w,C=d-1,S=(w-k)/C):(C=(w-k)/S,C=oi(C,Math.round(C),S/1e3)?Math.round(C):Math.ceil(C));const F=Math.max(fi(S),fi(k));_=Math.pow(10,Cs(r)?F:r),k=Math.round(k*_)/_,w=Math.round(w*_)/_;let T=0;for(b&&(u&&k!==o?(s.push({value:o}),kl)break;s.push({value:t})}return y&&u&&w!==l?s.length&&oi(s[s.length-1].value,l,eh(l,v,t))?s[s.length-1].value=l:s.push({value:l}):y&&w!==l||s.push({value:w}),s}function eh(t,e,{horizontal:s,minRotation:i}){const n=pi(i),a=(s?Math.sin(n):Math.cos(n))||.001,o=.75*e*(""+t).length;return Math.min(e/a,o)}(0,De.A)(Zc,"id","category"),(0,De.A)(Zc,"defaults",{ticks:{callback:Jc}});class sh extends yr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return Cs(t)||("number"===typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:s}=this.getUserBounds();let{min:i,max:n}=this;const a=t=>i=e?i:t,o=t=>n=s?n:t;if(t){const t=ai(i),e=ai(n);t<0&&e<0?o(0):t>0&&e>0&&a(0)}if(i===n){let e=0===n?1:Math.abs(.05*n);o(n+e),t||a(i-e)}this.min=i,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:s,stepSize:i}=t;return i?(e=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),s=s||11),s&&(e=Math.min(s,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let s=this.getTickLimit();s=Math.max(2,s);const i={maxTicks:s,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},n=this._range||this,a=th(i,n);return"ticks"===t.bounds&&ui(a,this,"value"),t.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}configure(){const t=this.ticks;let e=this.min,s=this.max;if(super.configure(),this.options.offset&&t.length){const i=(s-e)/Math.max(t.length-1,1)/2;e-=i,s+=i}this._startValue=e,this._endValue=s,this._valueRange=s-e}getLabelForValue(t){return Zi(t,this.chart.options.locale,this.options.ticks.format)}}class ih extends sh{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ts(t)?t:0,this.max=Ts(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,s=pi(this.options.ticks.minRotation),i=(t?Math.sin(s):Math.cos(s))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/i))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}(0,De.A)(ih,"id","linear"),(0,De.A)(ih,"defaults",{ticks:{callback:sn.formatters.numeric}});const nh=t=>Math.floor(ni(t)),ah=(t,e)=>Math.pow(10,nh(t)+e);function oh(t){const e=t/Math.pow(10,nh(t));return 1===e}function lh(t,e,s){const i=Math.pow(10,s),n=Math.floor(t/i),a=Math.ceil(e/i);return a-n}function rh(t,e){const s=e-t;let i=nh(s);while(lh(t,e,i)>10)i++;while(lh(t,e,i)<10)i--;return Math.min(i,nh(t))}function dh(t,{min:e,max:s}){e=Ps(t.min,e);const i=[],n=nh(e);let a=rh(e,s),o=a<0?Math.pow(10,Math.abs(a)):1;const l=Math.pow(10,a),r=n>a?Math.pow(10,n):0,d=Math.round((e-r)*o)/o,c=Math.floor((e-r)/l/10)*l*10;let h=Math.floor((d-c)/Math.pow(10,a)),u=Ps(t.min,Math.round((r+c+h*Math.pow(10,a))*o)/o);while(u=10?h=h<15?15:20:h++,h>=20&&(a++,h=2,o=a>=0?1:o),u=Math.round((r+c+h*Math.pow(10,a))*o)/o;const p=Ps(t.max,u);return i.push({value:p,major:oh(p),significand:h}),i}class ch extends yr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const s=sh.prototype.parse.apply(this,[t,e]);if(0!==s)return Ts(s)&&s>0?s:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ts(t)?Math.max(0,t):null,this.max=Ts(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Ts(this._userMin)&&(this.min=t===ah(this.min,0)?ah(this.min,-1):ah(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let s=this.min,i=this.max;const n=e=>s=t?s:e,a=t=>i=e?i:t;s===i&&(s<=0?(n(1),a(10)):(n(ah(s,-1)),a(ah(i,1)))),s<=0&&n(ah(i,-1)),i<=0&&a(ah(s,1)),this.min=s,this.max=i}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},s=dh(e,this);return"ticks"===t.bounds&&ui(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}getLabelForValue(t){return void 0===t?"0":Zi(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=ni(t),this._valueRange=ni(this.max)-ni(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(ni(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function hh(t){const e=t.ticks;if(e.display&&t.display){const t=En(e.backdropPadding);return Ms(e.font&&e.font.size,cn.font.size)+t.height}return 0}function uh(t,e,s){return s=Ss(s)?s:[s],{w:pn(t,e.string,s),h:s.length*e.lineHeight}}function ph(t,e,s,i,n){return t===i||t===n?{start:e-s/2,end:e+s/2}:tn?{start:e-s,end:e}:{start:e,end:e+s}}function gh(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},s=Object.assign({},e),i=[],n=[],a=t._pointLabels.length,o=t.options.pointLabels,l=o.centerPointLabels?Ys/a:0;for(let r=0;re.r&&(l=(i.end-e.r)/a,t.r=Math.max(t.r,e.r+l)),n.starte.b&&(r=(n.end-e.b)/o,t.b=Math.max(t.b,e.b+r))}function mh(t,e,s){const i=t.drawingArea,{extra:n,additionalAngle:a,padding:o,size:l}=s,r=t.getPointPosition(e,i+n+o,a),d=Math.round(gi(xi(r.angle+ei))),c=_h(r.y,l.h,d),h=xh(d),u=vh(r.x,l.w,h);return{visible:!0,x:r.x,y:c,textAlign:h,left:u,top:c,right:u+l.w,bottom:c+l.h}}function bh(t,e){if(!e)return!0;const{left:s,top:i,right:n,bottom:a}=t,o=yn({x:s,y:i},e)||yn({x:s,y:a},e)||yn({x:n,y:i},e)||yn({x:n,y:a},e);return!o}function yh(t,e,s){const i=[],n=t._pointLabels.length,a=t.options,{centerPointLabels:o,display:l}=a.pointLabels,r={extra:hh(a)/2,additionalAngle:o?Ys/n:0};let d;for(let c=0;c270||s<90)&&(t-=e),t}function kh(t,e,s){const{left:i,top:n,right:a,bottom:o}=s,{backdropColor:l}=e;if(!Cs(l)){const s=Ln(e.borderRadius),r=En(e.backdropPadding);t.fillStyle=l;const d=i-r.left,c=n-r.top,h=a-i+r.width,u=o-n+r.height;Object.values(s).some(t=>0!==t)?(t.beginPath(),Tn(t,{x:d,y:c,w:h,h:u,radius:s}),t.fill()):t.fillRect(d,c,h,u)}}function wh(t,e){const{ctx:s,options:{pointLabels:i}}=t;for(let n=e-1;n>=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const a=i.setContext(t.getPointLabelContext(n));kh(s,a,e);const o=In(a.font),{x:l,y:r,textAlign:d}=e;Fn(s,t._pointLabels[n],l,r+o.lineHeight/2,o,{color:a.color,textAlign:d,textBaseline:"middle"})}}function Ch(t,e,s,i){const{ctx:n}=t;if(s)n.arc(t.xCenter,t.yCenter,e,0,Gs);else{let s=t.getPointPosition(0,e);n.moveTo(s.x,s.y);for(let a=1;a{const s=$s(this.options.pointLabels.callback,[t,e],this);return s||0===s?s:""}).filter((t,e)=>this.chart.getDataVisibility(e))}fit(){const t=this.options;t.display&&t.pointLabels.display?gh(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,s,i){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((s-i)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,s,i))}getIndexAngle(t){const e=Gs/(this._pointLabels.length||1),s=this.options.startAngle||0;return xi(t*e+pi(s))}getDistanceFromCenterForValue(t){if(Cs(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(Cs(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t{if(0!==e||0===e&&this.min<0){l=this.getDistanceFromCenterForValue(t.value);const s=this.getContext(e),o=i.setContext(s),r=n.setContext(s);Sh(this,o,l,a,r)}}),s.display){for(t.save(),o=a-1;o>=0;o--){const i=s.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:a}=i;a&&n&&(t.lineWidth=a,t.strokeStyle=n,t.setLineDash(i.borderDash),t.lineDashOffset=i.borderDashOffset,l=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),r=this.getPointPosition(o,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(r.x,r.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,s=e.ticks;if(!s.display)return;const i=this.getIndexAngle(0);let n,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(i),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((i,o)=>{if(0===o&&this.min>=0&&!e.reverse)return;const l=s.setContext(this.getContext(o)),r=In(l.font);if(n=this.getDistanceFromCenterForValue(this.ticks[o].value),l.showLabelBackdrop){t.font=r.string,a=t.measureText(i.label).width,t.fillStyle=l.backdropColor;const e=En(l.backdropPadding);t.fillRect(-a/2-e.left,-n-r.size/2-e.top,a+e.width,r.size+e.height)}Fn(t,i.label,0,-n,r,{color:l.color,strokeColor:l.textStrokeColor,strokeWidth:l.textStrokeWidth})}),t.restore()}drawTitle(){}}(0,De.A)(Th,"id","radialLinear"),(0,De.A)(Th,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:sn.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),(0,De.A)(Th,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,De.A)(Th,"descriptors",{angleLines:{_fallback:"grid"}});const Ph={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Mh=Object.keys(Ph);function Dh(t,e){return t-e}function Ah(t,e){if(Cs(e))return null;const s=t._adapter,{parser:i,round:n,isoWeekday:a}=t._parseOpts;let o=e;return"function"===typeof i&&(o=i(o)),Ts(o)||(o="string"===typeof i?s.parse(o,i):s.parse(o)),null===o?null:(n&&(o="week"!==n||!ci(a)&&!0!==a?s.startOf(o,n):s.startOf(o,"isoWeek",a)),+o)}function $h(t,e,s,i){const n=Mh.length;for(let a=Mh.indexOf(t);a=Mh.indexOf(s);a--){const s=Mh[a];if(Ph[s].common&&t._adapter.diff(n,i,s)>=e-1)return s}return Mh[s?Mh.indexOf(s):0]}function Lh(t){for(let e=Mh.indexOf(t)+1,s=Mh.length;e=e?s[i]:s[n];t[a]=!0}}else t[e]=!0}function Ih(t,e,s,i){const n=t._adapter,a=+n.startOf(e[0].value,i),o=e[e.length-1].value;let l,r;for(l=a;l<=o;l=+n.add(l,1,i))r=s[l],r>=0&&(e[r].major=!0);return e}function Uh(t,e,s){const i=[],n={},a=e.length;let o,l;for(o=0;o+t.value))}initOffsets(t=[]){let e,s,i=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),i=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,s=this.getDecimalForValue(t[t.length-1]),n=1===t.length?s:(s-this.getDecimalForValue(t[t.length-2]))/2);const a=t.length<3?.5:.25;i=_i(i,0,a),n=_i(n,0,a),this._offsets={start:i,end:n,factor:1/(i+1+n)}}_generate(){const t=this._adapter,e=this.min,s=this.max,i=this.options,n=i.time,a=n.unit||$h(n.minUnit,e,s,this._getLabelCapacity(e)),o=Ms(i.ticks.stepSize,1),l="week"===a&&n.isoWeekday,r=ci(l)||!0===l,d={};let c,h,u=e;if(r&&(u=+t.startOf(u,"isoWeek",l)),u=+t.startOf(u,r?"day":a),t.diff(s,e,a)>1e5*o)throw new Error(e+" and "+s+" are too far apart with stepSize of "+o+" "+a);const p="data"===i.ticks.source&&this.getDataTimestamps();for(c=u,h=0;c+t)}getLabelForValue(t){const e=this._adapter,s=this.options.time;return s.tooltipFormat?e.format(t,s.tooltipFormat):e.format(t,s.displayFormats.datetime)}format(t,e){const s=this.options,i=s.time.displayFormats,n=this._unit,a=e||i[n];return this._adapter.format(t,a)}_tickFormatFunction(t,e,s,i){const n=this.options,a=n.ticks.callback;if(a)return $s(a,[t,e,s],this);const o=n.time.displayFormats,l=this._unit,r=this._majorUnit,d=l&&o[l],c=r&&o[r],h=s[e],u=r&&c&&h&&h.major;return this._adapter.format(t,i||(u?c:d))}generateTickLabels(t){let e,s,i;for(e=0,s=t.length;e0?o:1}getDataTimestamps(){let t,e,s=this._cache.data||[];if(s.length)return s;const i=this.getMatchingVisibleMetas();if(this._normalized&&i.length)return this._cache.data=i[0].controller.getAllParsedValues(this);for(t=0,e=i.length;t=t[l].pos&&e<=t[r].pos&&({lo:l,hi:r}=Si(t,"pos",e)),({pos:i,time:a}=t[l]),({pos:n,time:o}=t[r])):(e>=t[l].time&&e<=t[r].time&&({lo:l,hi:r}=Si(t,"time",e)),({time:i,pos:a}=t[l]),({time:n,pos:o}=t[r]));const d=n-i;return d?a+(o-a)*(e-i)/d:a}(0,De.A)(Oh,"id","time"),(0,De.A)(Oh,"defaults",{bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}});class Wh extends Oh{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Rh(e,this.min),this._tableRange=Rh(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:s}=this,i=[],n=[];let a,o,l,r,d;for(a=0,o=t.length;a=e&&r<=s&&i.push(r);if(i.length<2)return[{time:e,pos:0},{time:s,pos:1}];for(a=0,o=i.length;at-e)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),s=this.getLabelTimestamps();return t=e.length&&s.length?this.normalize(e.concat(s)):e.length?e:s,t=this._cache.all=t,t}getDecimalForValue(t){return(Rh(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,s=this.getDecimalForPixel(t)/e.factor-e.end;return Rh(this._table,s*this._tableRange+this._minPos,!0)}}(0,De.A)(Wh,"id","timeseries"),(0,De.A)(Wh,"defaults",Oh.defaults);var Bh=s(90144);const Nh={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},zh={ariaLabel:{type:String},ariaDescribedby:{type:String}},jh={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},...Nh,...zh},qh="2"===i.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function Hh(t){return(0,Bh.ju)(t)?(0,Bh.ux)(t):t}function Xh(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,Bh.ju)(e)?new Proxy(t,{}):t}function Kh(t,e){const s=t.options;s&&e&&Object.assign(s,e)}function Qh(t,e){t.labels=e}function Yh(t,e,s){const i=[];t.datasets=e.map(e=>{const n=t.datasets.find(t=>t[s]===e[s]);return n&&e.data&&!i.includes(n)?(i.push(n),Object.assign(n,e),n):{...e}})}function Gh(t,e){const s={labels:[],datasets:[]};return Qh(s,t.labels),Yh(s,t.datasets,e),s}const Jh=(0,i.pM)({props:jh,setup(t,e){let{expose:s,slots:n}=e;const a=(0,Bh.KR)(null),o=(0,Bh.IJ)(null);s({chart:o});const l=()=>{if(!a.value)return;const{type:e,data:s,options:i,plugins:n,datasetIdKey:l}=t,r=Gh(s,l),d=Xh(r,s);o.value=new ld(a.value,{type:e,data:d,options:{...i},plugins:n})},r=()=>{const e=(0,Bh.ux)(o.value);e&&(t.destroyDelay>0?setTimeout(()=>{e.destroy(),o.value=null},t.destroyDelay):(e.destroy(),o.value=null))},d=e=>{e.update(t.updateMode)};return(0,i.sV)(l),(0,i.hi)(r),(0,i.wB)([()=>t.options,()=>t.data],(e,s)=>{let[n,a]=e,[l,r]=s;const c=(0,Bh.ux)(o.value);if(!c)return;let h=!1;if(n){const t=Hh(n),e=Hh(l);t&&t!==e&&(Kh(c,t),h=!0)}if(a){const e=Hh(a.labels),s=Hh(r.labels),i=Hh(a.datasets),n=Hh(r.datasets);e!==s&&(Qh(c.config.data,e),h=!0),i&&i!==n&&(Yh(c.config.data,i,t.datasetIdKey),h=!0)}h&&(0,i.dY)(()=>{d(c)})},{deep:!0}),()=>(0,i.h)("canvas",{role:"img","aria-label":t.ariaLabel,"aria-describedby":t.ariaDescribedby,ref:a},[(0,i.h)("p",{},[n.default?n.default():""])])}});function Zh(t,e){return ld.register(e),(0,i.pM)({props:Nh,setup(e,s){let{expose:n}=s;const a=(0,Bh.IJ)(null),o=t=>{a.value=t?.chart};return n({chart:a}),()=>(0,i.h)(Jh,qh({ref:o},{type:t,...e}))}})}const tu=Zh("doughnut",Ko),eu=Zh("line",Qo);s(16573),s(78100),s(77936),s(79577),s(41549),s(49797),s(49631),s(35623);class su extends Error{constructor(t,e,s=!1,i=""){super(t),this.name="BatchOperationError",this.code=e,this.recoverable=s,this.suggestion=i}}const iu={401:()=>new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录"),403:()=>new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限"),400:t=>new su(`请求数据无效: ${t}`,"INVALID_DATA",!0,"请检查数据格式后重试"),500:()=>new su("服务器内部错误","SERVER_ERROR",!0,"请稍后重试,如果问题持续请联系管理员"),NETWORK:()=>new su("网络连接失败","NETWORK_ERROR",!0,"请检查网络连接后重试"),ABORT:()=>new su("操作已取消","ABORTED",!1,"")};function nu(t,e=""){if("AbortError"===t.name)return iu.ABORT();if(t instanceof Response||t&&"number"===typeof t.status){const s=iu[t.status];return s?s(e):new su(`请求失败: ${t.status}`,"HTTP_ERROR",!0,"请稍后重试")}return t instanceof TypeError&&t.message.includes("fetch")?iu.NETWORK():new su(t.message||"未知错误","UNKNOWN_ERROR",!0,"请稍后重试")}class au{constructor(t={}){this.batchSize=t.batchSize||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.abortController=null}async fetchAllRecords(t=!1){this.abortController=new AbortController;const e=[];let s=null,i=0,n=0;try{do{if(this.abortController.signal.aborted)break;const a=await this.fetchBatch(s,t);e.push(...a.records),s=a.nextCursor,i+=a.records.length,n++,this.onProgress({phase:"fetching",current:i,batchCount:n,message:`已获取 ${i} 条记录...`})}while(s&&!this.abortController.signal.aborted);if(this.abortController.signal.aborted)throw iu.ABORT();return e}catch(a){const t=a instanceof su?a:nu(a);throw this.onError(t),t}}async fetchBatch(t,e){const s=new URLSearchParams;t&&s.set("cursor",t),e&&s.set("includeValue","true"),s.set("limit",String(this.batchSize));try{const t=await(0,Pe.A)(`/api/manage/batch/list?${s}`,{signal:this.abortController.signal});if(!t.ok){let e="";try{const s=await t.json();e=s.error||""}catch{}throw nu(t,e)}const e=await t.json();if(!e.success)throw new su(e.error||"请求失败","API_ERROR",!0,"请稍后重试");return{records:e.records||[],nextCursor:e.nextCursor||null,totalProcessed:e.totalProcessed||0}}catch(i){if(i instanceof su)throw i;throw nu(i)}}abort(){this.abortController&&this.abortController.abort()}isAborted(){return!!this.abortController&&this.abortController.signal.aborted}reset(){this.abortController=null}}var ou=au;class lu{constructor(t={}){this.chunkSize=t.chunkSize||null,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.sessionId=this.generateSessionId(),this.aborted=!1}async fetchConfig(){try{const t=await(0,Pe.A)("/api/manage/batch/index/config");if(!t.ok)throw new Error("获取配置失败");const e=await t.json();if(e.success)return{chunkSize:e.chunkSize||500,databaseType:e.databaseType||"unknown"};throw new Error(e.error||"获取配置失败")}catch(t){return console.warn("Failed to fetch index config, using default:",t),{chunkSize:500,databaseType:"unknown"}}}async rebuild(){this.aborted=!1;try{if(!this.chunkSize){const t=await this.fetchConfig();this.chunkSize=t.chunkSize}this.onProgress({phase:"fetching",message:"正在获取数据...",current:0});const t=new ou({onProgress:t=>this.onProgress({...t,phase:"fetching"}),onError:t=>this.onError(t)}),e=await t.fetchAllRecords(!1);if(this.aborted)throw new su("操作已取消","ABORTED",!1,"");if(this.onProgress({phase:"sorting",message:"正在排序...",current:0,total:e.length}),this.sortByTimestampDescending(e),this.aborted)throw new su("操作已取消","ABORTED",!1,"");const s=this.splitIntoChunks(e);for(let i=0;i{const s=t.metadata&&t.metadata.TimeStamp||0,i=e.metadata&&e.metadata.TimeStamp||0;return i-s})}splitIntoChunks(t){const e=[];for(let s=0;st.toString(16).padStart(2,"0")).join("")}let n=2166136261,a=2166136261;for(let o=0;o>>0,a=Math.imul(a^i[o],16777635)>>>0;return n.toString(16).padStart(8,"0")+a.toString(16).padStart(8,"0")}createHttpError(t,e=""){switch(t){case 401:return new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录");case 403:return new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限");case 400:return new su(`请求数据无效: ${e}`,"INVALID_DATA",!0,"请检查数据格式后重试");case 404:return new su("会话不存在","SESSION_NOT_FOUND",!1,"请重新开始索引重建");case 410:return new su("会话已过期","SESSION_EXPIRED",!1,"请重新开始索引重建");case 500:default:return new su(`服务器错误: ${e||t}`,"SERVER_ERROR",!0,"请稍后重试")}}sleep(t){return new Promise(e=>setTimeout(e,t))}abort(){this.aborted=!0}reset(){this.aborted=!1,this.sessionId=this.generateSessionId()}}var ru=lu;class du{constructor(t={}){this.onProgress=t.onProgress||(()=>{}),this.processor=null}async generateBackup(){this.processor=new ou({onProgress:t=>this.onProgress({...t,phase:"fetching"})});const t=await this.processor.fetchAllRecords(!0);this.onProgress({phase:"building",message:"正在构建备份数据..."});const e={timestamp:Date.now(),version:Me.rE,data:{fileCount:t.length,files:{},settings:{}}};for(const n of t)e.data.files[n.id]={metadata:n.metadata,value:n.value||null};const s=await this.fetchSettings();e.data.settings=s,this.onProgress({phase:"downloading",message:"正在生成下载..."}),this.downloadBackup(e);const i=Object.keys(s).length;return{success:!0,fileCount:t.length,settingsCount:i}}async fetchSettings(){try{const t=await(0,Pe.A)("/api/manage/batch/settings");if(!t.ok)return console.warn("Failed to fetch settings:",t.status),{};const e=await t.json();return e.settings||{}}catch(t){return console.warn("Failed to fetch settings:",t),{}}}downloadBackup(t){const e=JSON.stringify(t,null,2),s=new Blob([e],{type:"application/json"}),i=URL.createObjectURL(s),n=document.createElement("a");n.href=i,n.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i)}abort(){this.processor&&this.processor.abort()}isAborted(){return!!this.processor&&this.processor.isAborted()}}var cu=du;class hu{constructor(t={}){this.chunkSize=t.chunkSize||50,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.aborted=!1}async restore(t){if(this.aborted=!1,!t||!t.data)throw new su("备份文件格式无效","INVALID_BACKUP",!1,"请选择有效的备份文件");const{files:e={},settings:s={}}=t.data,i=Object.entries(e),n=Object.entries(s),a=i.length,o=n.length,l=a+o;let r=0,d=0,c=0,h=0;try{this.onProgress({phase:"restoring_files",message:"正在恢复文件数据...",current:0,total:l});const e=this.splitIntoChunks(i,this.chunkSize);for(let t=0;tsetTimeout(e,t))}abort(){this.aborted=!0}}var uu=hu;ld.register(bd,Kc,Pc,Zc,ih,$d,Dd,xc);const pu=864e5;function gu(t){return String(t).padStart(2,"0")}function fu(t){return`${t.getFullYear()}-${gu(t.getMonth()+1)}-${gu(t.getDate())}`}function mu(){const t=new Date;t.setHours(0,0,0,0);const e=new Date(t.getTime()-6*pu);return[fu(e),fu(t)]}var bu={name:"SysCogStatus",components:{Doughnut:tu,Line:eu,DateRangeCalendar:H},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:Me.rE,loadErrors:{newest:!1,oldest:!1},trendGroupBy:"channel",trendDatePickerVisible:!1,trendDateRange:mu(),channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#6366F1","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"],trendColors:["#2563EB","#10B981","#F59E0B","#EF4444","#8B5CF6","#06B6D4","#EC4899","#84CC16","#64748B"],isProcessing:!1,processingPhase:"",processingProgress:{current:0,total:0,message:"",percentage:0},processingError:null,processingStartTime:null,currentRebuilder:null,currentBackupGenerator:null,currentRestoreProcessor:null}},computed:{channelChartData(){const t=this.indexInfo.channelStats||{};return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.channelColors.slice(0,Object.keys(t).length),borderWidth:0}]}},typeChartData(){const t=this.aggregatedTypeStats;return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},aggregatedTypeStats(){const t=this.indexInfo.typeStats||{},e={};for(const[s,i]of Object.entries(t)){const t="Block"===s?this.$t("sysStatus.blocked"):this.$t("sysStatus.normalStatus");e[t]=(e[t]||0)+i}return e},currentTrendGroup(){const t=this.indexInfo.uploadTrend||{},e=t.groupBy||{};return e[this.trendGroupBy]||{series:[]}},trendRawLabels(){const t=this.indexInfo.uploadTrend||{};return t.labels||[]},trendRangeCrossesYear(){const t=new Set;return this.trendRawLabels.forEach(e=>{this.extractTrendLabelDates(e).forEach(e=>t.add(e.year))}),t.size>1},trendDisplayLabels(){return this.trendRawLabels.map(t=>this.formatTrendAxisLabel(t))},hasTrendData(){const t=this.indexInfo.uploadTrend||{};return(t.labels||[]).length>0},trendDateDialogWidth(){return window.innerWidth>768?"420px":"90%"},uploadTrendChartData(){const t=this.indexInfo.uploadTrend||{},e=this.currentTrendGroup.series||[],s="#F97316";return{labels:this.trendDisplayLabels,datasets:[{label:this.$t("sysStatus.totalUploads"),data:t.total||[],borderColor:s,backgroundColor:this.hexToRgba(s,.1),pointBackgroundColor:s,pointBorderColor:s,borderWidth:3,pointRadius:2,pointHoverRadius:5,tension:.28,fill:!1},...e.map((t,e)=>{const s=this.getTrendColor(e);return{label:this.formatTrendSeriesName(t),data:t.data||[],borderColor:s,backgroundColor:this.hexToRgba(s,.12),pointBackgroundColor:s,pointBorderColor:s,borderWidth:2,pointRadius:2,pointHoverRadius:5,tension:.32,fill:!1}})]}},lineChartOptions(){const t="#64748B";return{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},plugins:{legend:{display:!0,position:"bottom",labels:{usePointStyle:!0,boxWidth:8,boxHeight:8,padding:16,color:t}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,callbacks:{title:t=>{const e=t?.[0]?.dataIndex;return this.trendRawLabels[e]||""},label:t=>{const e=t.parsed||{},s=void 0!==e.y?e.y:t.raw;return` ${t.dataset.label}: ${Number(s||0).toLocaleString()} ${this.$t("sysStatus.uploadsUnit")}`}}}},scales:{x:{grid:{display:!1},ticks:{color:t,maxTicksLimit:8,autoSkip:!0}},y:{beginAtZero:!0,grid:{color:"rgba(148, 163, 184, 0.18)"},ticks:{color:t,precision:0,callback:t=>Number(t).toLocaleString()}}}}},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",hoverOffset:8,layout:{padding:10},plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,z:100,callbacks:{label:t=>{const e=t.raw,s=t.dataset.data.reduce((t,e)=>t+e,0),i=(e/s*100).toFixed(1);return` ${e.toLocaleString()} (${i}%)`}}}},animation:{animateRotate:!0,animateScale:!0}}},estimatedTimeRemaining(){if(!this.isProcessing||!this.processingStartTime)return"";if(0===this.processingProgress.current||0===this.processingProgress.percentage)return"";const t=Date.now()-this.processingStartTime,e=this.processingProgress.percentage/100;if(e<=0)return"";const s=t/e,i=s-t;if(i<=0)return this.$t("sysStatus.aboutToComplete");const n=Math.ceil(i/1e3);if(n<60)return this.$t("sysStatus.seconds",{count:n});const a=Math.ceil(n/60);if(a<60)return this.$t("sysStatus.minutes",{count:a});const o=Math.floor(a/60),l=a%60;return this.$t("sysStatus.hoursMinutes",{hours:o,minutes:l})},phaseDescription(){const t={fetching:this.$t("sysStatus.phaseFetching"),sorting:this.$t("sysStatus.phaseSorting"),uploading:this.$t("sysStatus.phaseUploading"),finalizing:this.$t("sysStatus.phaseFinalizing"),building:this.$t("sysStatus.phaseBuilding"),downloading:this.$t("sysStatus.phaseDownloading"),restoring_files:this.$t("sysStatus.phaseRestoringFiles"),restoring_settings:this.$t("sysStatus.phaseRestoringSettings"),completed:this.$t("sysStatus.phaseCompleted"),retrying:this.$t("sysStatus.phaseRetrying")};return t[this.processingPhase]||this.processingPhase}},mounted(){this.fetchIndexInfo()},methods:{getChartColor(t){return this.channelColors[t%this.channelColors.length]},getTypeChartColor(t){return this.typeColors[t%this.typeColors.length]},getTrendColor(t){return this.trendColors[t%this.trendColors.length]},formatTrendSeriesName(t){return t?.isOther||"__other__"===t?.name?this.$t("sysStatus.otherChannels"):t?.name||this.$t("sysStatus.unknown")},hexToRgba(t,e){const s=(t||"").replace("#","");if(6!==s.length)return`rgba(37, 99, 235, ${e})`;const i=parseInt(s.slice(0,2),16),n=parseInt(s.slice(2,4),16),a=parseInt(s.slice(4,6),16);return`rgba(${i}, ${n}, ${a}, ${e})`},extractTrendLabelDates(t){const e=String(t||"").match(/\d{4}-\d{2}-\d{2}/g)||[];return e.map(t=>{const[e,s,i]=t.split("-").map(Number);return{year:e,month:s,day:i}})},formatTrendAxisLabel(t){const e=this.extractTrendLabelDates(t);if(0===e.length)return t;const s=(t,e)=>{const s=`${t.month}/${t.day}`;return e?`${t.year}/${s}`:s};if(1===e.length)return s(e[0],this.trendRangeCrossesYear);const[i,n]=e;if(!this.trendRangeCrossesYear)return`${s(i,!1)}-${s(n,!1)}`;const a=i.year===n.year?s(n,!1):s(n,!0);return`${s(i,!0)}-${a}`},openTrendDateDialog(){this.trendDatePickerVisible=!0},handleTrendDateRangeChange(t){Array.isArray(t)&&2===t.length&&t[0]&&t[1]&&(this.trendDatePickerVisible=!1,this.fetchIndexInfo())},getTrendDateRangeParams(){return Array.isArray(this.trendDateRange)&&2===this.trendDateRange.length||(this.trendDateRange=mu()),{startDate:this.trendDateRange[0],endDate:this.trendDateRange[1]}},async fetchIndexInfo(){this.loading=!0;try{const{startDate:t,endDate:e}=this.getTrendDateRangeParams(),s=new URLSearchParams({action:"info",timezoneOffset:String((new Date).getTimezoneOffset()),trendMaxPoints:"90",trendSeriesLimit:"8",trendStartDate:t,trendEndDate:e}),i=await(0,Pe.A)(`/api/manage/list?${s.toString()}`,{method:"GET"});if(!i.ok)throw new Error("API请求失败");{const t=await i.json();this.indexInfo=t}}catch(t){console.error("获取索引信息失败:",t),this.$message.error(this.$t("sysStatus.fetchIndexFailed"))}finally{this.loading=!1}},async rebuildIndex(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.rebuilding=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentRebuilder=new ru({onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});try{const t=await this.currentRebuilder.rebuild();this.$message.success(this.$t("sysStatus.rebuildSuccess",{count:t.totalFiles.toLocaleString()})),setTimeout(()=>{this.fetchIndexInfo()},1e3)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.rebuilding=!1,this.isProcessing=!1,this.currentRebuilder=null,this.processingStartTime=null}}},async backupData(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.backing=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentBackupGenerator=new cu({onProgress:t=>this.handleProgress(t)});try{const t=await this.currentBackupGenerator.generateBackup(),e=t.settingsCount>0?this.$t("sysStatus.backupSuccessWithSettings",{fileCount:t.fileCount.toLocaleString(),settingsCount:t.settingsCount}):this.$t("sysStatus.backupSuccess",{count:t.fileCount.toLocaleString()});this.$message.success(e)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.backing=!1,this.isProcessing=!1,this.currentBackupGenerator=null,this.processingStartTime=null}}},selectRestoreFile(){this.restoring||this.$refs.fileInput.click()},async handleFileSelect(t){const e=t.target.files[0];if(e)if(e.name.endsWith(".json")){try{await this.$confirm(this.$t("sysStatus.restoreConfirmMessage"),this.$t("sysStatus.restoreConfirmTitle"),{confirmButtonText:this.$t("sysStatus.restoreConfirmOk"),cancelButtonText:this.$t("sysStatus.restoreConfirmCancel"),type:"warning"}),await this.restoreData(e)}catch(s){"cancel"!==s&&console.error("确认恢复失败:",s)}t.target.value=""}else this.$message.error(this.$t("sysStatus.selectJsonFile"))},async restoreData(t){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.restoring=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0};try{const s=await t.text();let i;try{i=JSON.parse(s)}catch(e){throw new Error(this.$t("sysStatus.invalidBackupFile"))}this.currentRestoreProcessor=new uu({chunkSize:100,onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});const n=await this.currentRestoreProcessor.restore(i);this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,this.$message.success(this.$t("sysStatus.restoreSuccess",{files:n.restoredFiles,settings:n.restoredSettings})),await new Promise(t=>setTimeout(t,500)),await this.rebuildIndex()}catch(s){if(console.error("恢复数据失败:",s),this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,"ABORTED"!==s.code){const t=s.suggestion?`${s.message}。${s.suggestion}`:s.message;this.$message.error(this.$t("sysStatus.restoreFailed")+": "+t),this.processingError={message:s.message,suggestion:s.suggestion,recoverable:s.recoverable}}}}},formatTime(t){if(!t)return this.$t("sysStatus.unknown");const e=new Date(t);return e.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})},getPercentage(t,e){return e&&0!==e?Math.round(t/e*100):0},getTimeAgo(t){if(!t)return"";const e=Date.now(),s=e-t,i=Math.floor(s/6e4),n=Math.floor(s/36e5),a=Math.floor(s/864e5);return a>0?this.$t("sysStatus.daysAgo",{count:a}):n>0?this.$t("sysStatus.hoursAgo",{count:n}):i>0?this.$t("sysStatus.minutesAgo",{count:i}):this.$t("sysStatus.justNow")},handleImageError(t){this.loadErrors[t]=!0},isValidPreview(t,e){return!this.loadErrors[t]&&(!!e?.metadata?.FileType&&(e.metadata.FileType.includes("image")||e.metadata.FileType.includes("video")))},openReleases(){window.open("https://github.com/MarSeventh/CloudFlare-ImgBed/releases","_blank")},isImageFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("image"))return!0;const e=t.metadata?.FileName||t.id||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","avif","heic","heif"];return i.includes(s)},isVideoFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("video"))return!0;const e=t.metadata?.FileName||t.id||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","m4v","3gp","mpeg","mpg"];return i.includes(s)},openFileInNewTab(t){t?.id&&window.open("/file/"+t.id+"?from=admin","_blank")},handleProgress(t){this.processingPhase=t.phase,this.processingProgress.message=t.message||"",this.processingProgress.current=t.current||0,"fetching"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0?this.processingProgress.percentage=Math.min(60,t.current/t.total*60):this.processingProgress.percentage=Math.min(50,15*Math.log10(t.current+1))):"sorting"===t.phase?(this.processingProgress.percentage=65,this.processingProgress.total=t.total||this.processingProgress.total):"uploading"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0&&(this.processingProgress.percentage=70+t.current/t.total*25)):"finalizing"===t.phase?this.processingProgress.percentage=97:"building"===t.phase?this.processingProgress.percentage=80:"downloading"===t.phase?this.processingProgress.percentage=95:"restoring_files"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||0):"restoring_settings"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||80):"completed"===t.phase?this.processingProgress.percentage=100:"retrying"===t.phase&&(this.processingProgress.message=t.message)},handleError(t){console.error("批量操作错误:",t),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}},cancelOperation(){this.currentRebuilder&&(this.currentRebuilder.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentBackupGenerator&&(this.currentBackupGenerator.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentRestoreProcessor&&(this.currentRestoreProcessor.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild")))},retryOperation(){this.processingError=null,this.rebuilding?(this.rebuilding=!1,this.isProcessing=!1,this.$nextTick(()=>{this.rebuildIndex()})):this.backing&&(this.backing=!1,this.isProcessing=!1,this.$nextTick(()=>{this.backupData()}))},dismissError(){this.processingError=null}}};const yu=(0,c.A)(bu,[["render",Te],["__scopeId","data-v-90d03e30"]]);var xu=yu,vu=s(59869),_u=(s(70415),s(73565),s(82006)),ku=(s(98642),s(81418)),wu=(s(50333),s(39623)),Cu=(s(29092),s(63003),s(76018)),Su=(s(96808),s(67819),s(55558)),Fu=(s(10456),s(12687)),Tu=(s(18785),s(53676));const Pu=["onClick"];function Mu(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=Tu.A;return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["custom-select",{"is-open":o.isOpen}]),style:(0,n.Tr)({width:s.width})},[(0,i.Lk)("div",{class:"custom-select-trigger",onClick:e[0]||(e[0]=(...t)=>l.toggleDropdown&&l.toggleDropdown(...t))},[(0,i.Lk)("span",{class:(0,n.C4)(["custom-select-value",{"is-placeholder":!s.modelValue}])},(0,n.v_)(l.displayLabel),3),(0,i.bF)(r,{icon:"chevron-down",class:"custom-select-arrow"})]),(0,i.bF)(C.eB,{name:"dropdown-fade"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:"custom-select-dropdown",onClick:e[1]||(e[1]=(0,C.D$)(()=>{},["stop"]))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.value,class:(0,n.C4)(["custom-select-option",{"is-selected":s.modelValue===e.value}]),onClick:t=>l.selectOption(e.value)},[(0,i.RG)(t.$slots,"option",{option:e},()=>[e.channelType?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:e.channelType,class:(0,n.C4)(["option-icon",e.iconClass])},null,8,["type","class"])):e.icon?((0,i.uX)(),(0,i.Wv)(r,{key:1,icon:e.icon,class:(0,n.C4)(["option-icon",e.iconClass])},null,8,["icon","class"])):(0,i.Q3)("",!0),(0,i.Lk)("span",null,(0,n.v_)(e.label),1)],!0)],10,Pu))),128))],512),[[C.aG,o.isOpen]])]),_:3})],6)}var Du={name:"CustomSelect",components:{ChannelIcon:Tu.A},props:{modelValue:{type:[String,Number],default:""},options:{type:Array,required:!0},placeholder:{type:String,default:""},width:{type:String,default:"160px"}},emits:["update:modelValue","change"],data(){return{isOpen:!1}},computed:{resolvedPlaceholder(){return this.placeholder||this.$t("common.select")},displayLabel(){const t=this.options.find(t=>t.value===this.modelValue);return t?t.label:this.resolvedPlaceholder}},mounted(){document.addEventListener("click",this.handleClickOutside)},beforeUnmount(){document.removeEventListener("click",this.handleClickOutside)},methods:{toggleDropdown(){this.isOpen=!this.isOpen},selectOption(t){this.$emit("update:modelValue",t),this.$emit("change",t),this.isOpen=!1},handleClickOutside(t){this.$el.contains(t.target)||(this.isOpen=!1)}}};const Au=(0,c.A)(Du,[["render",Mu],["__scopeId","data-v-3c680cc7"]]);var $u=Au;const Vu={class:"upload-settings"},Lu={class:"page-header"},Eu={class:"first-title"},Iu={class:"header-actions"},Uu={class:"group-header"},Ou={class:"group-title"},Ru={key:0,class:"load-balance-switch"},Wu={class:"switch-label"},Bu={key:0,class:"channel-cards"},Nu=["onMousemove","onMouseleave"],zu={class:"card-header"},ju={class:"card-title"},qu={class:"channel-name"},Hu={class:"card-body"},Xu={class:"card-info"},Ku={class:"info-item"},Qu={class:"info-text"},Yu={key:0,class:"info-item"},Gu={class:"info-text"},Ju={key:1,class:"info-item"},Zu=["title"],tp={class:"info-item"},ep={class:"info-text"},sp={key:0,class:"info-item"},ip=["title"],np={class:"info-item"},ap={class:"info-text"},op={class:"info-item"},lp={class:"info-text"},rp={class:"info-item"},dp={class:"info-text"},cp={class:"info-item"},hp=["title"],up={key:0,class:"info-item"},pp=["title"],gp={key:0,class:"quota-mini"},fp={class:"quota-text"},mp={class:"card-actions"},bp={key:1,class:"empty-tip"},yp={class:"channel-type-option"},xp={key:0,class:"form-warning",style:{"margin-top":"0"}},vp=["innerHTML"],_p={class:"form-warning"},kp={class:"quota-label"},wp={class:"quota-status"};function Cp(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=$u,h=K.S2,u=Tu.A,p=Fu.u,f=Su.qi,m=k.ve,b=Cu.P9,y=Cu.AV,x=_u.xE,_=wu.WK,S=ku.lq,F=_u.US,T=w.kZ,P=vu.MF,M=vu.TS,D=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Vu,[(0,i.Lk)("div",Lu,[(0,i.Lk)("h3",Eu,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.title"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.titleTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Iu,[(0,i.bF)(c,{modelValue:o.channelFilter,"onUpdate:modelValue":e[0]||(e[0]=t=>o.channelFilter=t),options:l.filterOptions,placeholder:t.$t("sysUpload.filterPlaceholder"),width:"160px"},null,8,["modelValue","options","placeholder"]),(0,i.bF)(h,{type:"primary",onClick:e[1]||(e[1]=t=>o.showAddDialog=!0),class:"add-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"plus",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.addChannel")),1)]),_:1})])]),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.filteredChannels,s=>((0,i.uX)(),(0,i.CE)("div",{key:s.value,class:"channel-group"},[(0,i.Lk)("div",Uu,[(0,i.Lk)("div",Ou,[(0,i.bF)(u,{type:s.value,class:(0,n.C4)(["group-icon",l.getChannelIconClass(s.value)])},null,8,["type","class"]),(0,i.Lk)("span",null,(0,n.v_)(s.label),1),(0,i.bF)(p,{size:"small",type:"info",class:"channel-count"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelList(s.value).length),1)]),_:2},1024)]),l.hasLoadBalance(s.value)?((0,i.uX)(),(0,i.CE)("div",Ru,[(0,i.Lk)("span",Wu,(0,n.v_)(t.$t("sysUpload.loadBalance")),1),(0,i.bF)(f,{modelValue:l.getSettings(s.value).loadBalance.enabled,"onUpdate:modelValue":t=>l.getSettings(s.value).loadBalance.enabled=t,size:"small",onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])])):(0,i.Q3)("",!0)]),l.getChannelList(s.value).length>0?((0,i.uX)(),(0,i.CE)("div",Bu,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.getChannelList(s.value),(a,o)=>((0,i.uX)(),(0,i.CE)("div",{key:a.name||o,class:(0,n.C4)(["channel-card",[s.value,{disabled:!a.enabled,fixed:a.fixed}]]),onMousemove:t=>l.handleCardMouseMove(t,s.value,o),onMouseleave:t=>l.handleCardMouseLeave(s.value,o)},[(0,i.Lk)("div",{class:"card-glow",ref_for:!0,ref:`glow-${s.value}-${o}`},null,512),(0,i.Lk)("div",zu,[(0,i.Lk)("div",ju,[(0,i.Lk)("span",qu,(0,n.v_)(a.name||t.$t("sysUpload.unnamedChannel")),1),a.fixed?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})):(0,i.Q3)("",!0)]),(0,i.bF)(f,{modelValue:a.enabled,"onUpdate:modelValue":t=>a.enabled=t,size:"small",onClick:e[2]||(e[2]=(0,C.D$)(()=>{},["stop"])),onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])]),(0,i.Lk)("div",Hu,[(0,i.Lk)("div",Xu,["telegram"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.Lk)("div",Ku,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",Qu,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),a.chatId?((0,i.uX)(),(0,i.CE)("div",Yu,[(0,i.bF)(r,{icon:"comments",class:"info-icon"}),(0,i.Lk)("span",Gu,"Channel: "+(0,n.v_)(l.maskText(a.chatId)),1)])):(0,i.Q3)("",!0)],64)):"cfr2"===s.value?((0,i.uX)(),(0,i.CE)("div",Ju,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl||t.$t("sysUpload.notSet")),9,Zu)])):"s3"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.Lk)("div",tp,[(0,i.bF)(r,{icon:"server",class:"info-icon"}),(0,i.Lk)("span",ep,(0,n.v_)(a.bucketName||t.$t("sysUpload.notSet")),1)]),a.endpoint?((0,i.uX)(),(0,i.CE)("div",sp,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.endpoint},(0,n.v_)(a.endpoint),9,ip)])):(0,i.Q3)("",!0)],64)):"discord"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.Lk)("div",np,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",ap,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),(0,i.Lk)("div",op,[(0,i.bF)(r,{icon:"hashtag",class:"info-icon"}),(0,i.Lk)("span",lp,"Channel: "+(0,n.v_)(l.maskText(a.channelId)),1)]),a.isNitro?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"success"},{default:(0,i.k6)(()=>[...e[78]||(e[78]=[(0,i.eW)("Nitro",-1)])]),_:1})):(0,i.Q3)("",!0)],64)):"huggingface"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.Lk)("div",rp,[(0,i.bF)(r,{icon:"database",class:"info-icon"}),(0,i.Lk)("span",dp,(0,n.v_)(a.repo||t.$t("sysUpload.notSet")),1)]),a.isPrivate?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo")),1)]),_:1})):(0,i.Q3)("",!0)],64)):"webdav"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.Lk)("div",cp,[(0,i.bF)(r,{icon:"folder",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.baseUrl},(0,n.v_)(a.baseUrl||t.$t("sysUpload.notSet")),9,hp)]),a.publicUrl?((0,i.uX)(),(0,i.CE)("div",up,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl),9,pp)])):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),a.quota?.enabled?((0,i.uX)(),(0,i.CE)("div",gp,[(0,i.bF)(m,{percentage:l.getQuotaPercentage(a),status:l.getQuotaStatus(a),"stroke-width":6},null,8,["percentage","status"]),(0,i.Lk)("span",fp,(0,n.v_)(l.getQuotaText(a)),1)])):(0,i.Q3)("",!0)]),(0,i.Lk)("div",mp,[(0,i.bF)(h,{text:"",type:"primary",size:"small",onClick:t=>l.openDetailDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"eye",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.detail")),1)]),_:1},8,["onClick"]),(0,i.bF)(h,{text:"",type:"primary",size:"small",onClick:t=>l.openEditDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"edit",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(h,{text:"",type:"danger",size:"small",onClick:t=>l.deleteChannel(s.value,o),disabled:a.fixed},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"trash-alt",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.deleteBtn")),1)]),_:1},8,["onClick","disabled"])])],42,Nu))),128))])):((0,i.uX)(),(0,i.CE)("div",bp,[(0,i.bF)(r,{icon:"inbox",class:"empty-icon"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysUpload.noChannels",{type:s.label})),1)]))]))),128)),(0,i.bF)(T,{modelValue:o.showAddDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showAddDialog=t),title:t.$t("sysUpload.addDialogTitle"),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetAddForm},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[34]||(e[34]=t=>o.showAddDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),"cfr2"!==o.newChannel.type?((0,i.uX)(),(0,i.Wv)(h,{key:0,type:"primary",onClick:l.confirmAddChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.confirmAdd")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>[(0,i.bF)(F,{model:o.newChannel,"label-position":"top",ref:"addForm",rules:l.addRules},{default:(0,i.k6)(()=>[(0,i.bF)(x,{label:t.$t("sysUpload.channelTypeLabel"),prop:"type"},{default:(0,i.k6)(()=>[(0,i.bF)(y,{modelValue:o.newChannel.type,"onUpdate:modelValue":e[3]||(e[3]=t=>o.newChannel.type=t),placeholder:t.$t("sysUpload.channelTypePlaceholder"),style:{width:"100%"},onChange:l.onChannelTypeChange},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.addableChannels,t=>((0,i.uX)(),(0,i.Wv)(b,{key:t.value,label:t.label,value:t.value},{default:(0,i.k6)(()=>[(0,i.Lk)("span",yp,[(0,i.bF)(u,{type:t.value,class:(0,n.C4)(["select-option-icon",l.getChannelIconClass(t.value)])},null,8,["type","class"]),(0,i.Lk)("span",null,(0,n.v_)(t.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue","placeholder","onChange"])]),_:1},8,["label"]),"cfr2"===o.newChannel.type?((0,i.uX)(),(0,i.CE)("div",xp,[(0,i.bF)(r,{icon:"info-circle",style:{"margin-right":"6px"}}),(0,i.Lk)("span",{innerHTML:t.$t("sysUpload.r2ConfigNote")},null,8,vp)])):((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{prop:"name"},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.channelNameLabel"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.channelNameImmutableTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"exclamation-triangle",class:"inline-warning-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.name,"onUpdate:modelValue":e[4]||(e[4]=t=>o.newChannel.name=t),placeholder:t.$t("sysUpload.channelNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),"telegram"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[5]||(e[5]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.chatId,"onUpdate:modelValue":e[6]||(e[6]=t=>o.newChannel.chatId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.chatIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[7]||(e[7]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"s3"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.endpoint,"onUpdate:modelValue":e[8]||(e[8]=t=>o.newChannel.endpoint=t),placeholder:t.$t("sysUpload.endpointPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cdnDomain"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.cdnDomainTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.cdnDomain,"onUpdate:modelValue":e[9]||(e[9]=t=>o.newChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.bucketName,"onUpdate:modelValue":e[10]||(e[10]=t=>o.newChannel.bucketName=t),placeholder:t.$t("sysUpload.bucketNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.region,"onUpdate:modelValue":e[11]||(e[11]=t=>o.newChannel.region=t),placeholder:t.$t("sysUpload.bucketRegionPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.accessKeyId,"onUpdate:modelValue":e[12]||(e[12]=t=>o.newChannel.accessKeyId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessKeyIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.secretAccessKey,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newChannel.secretAccessKey=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.secretAccessKeyPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.pathStyle"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.pathStyleTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.pathStyle,"onUpdate:modelValue":e[14]||(e[14]=t=>o.newChannel.pathStyle=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[15]||(e[15]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[16]||(e[16]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[17]||(e[17]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[18]||(e[18]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.channelId,"onUpdate:modelValue":e[19]||(e[19]=t=>o.newChannel.channelId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.channelIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.nitroMember"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.nitroTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.isNitro,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newChannel.isNitro=t)},null,8,["modelValue"])]),_:1}),(0,i.Lk)("div",_p,[(0,i.bF)(r,{icon:"exclamation-triangle",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.discordWarning")),1)])],64)):"huggingface"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(x,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.repo,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newChannel.repo=t),placeholder:t.$t("sysUpload.repoNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.token,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newChannel.token=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.privateRepoTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.isPrivate,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newChannel.isPrivate=t)},null,8,["modelValue"])]),_:1})],64)):"webdav"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(x,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.baseUrl,"onUpdate:modelValue":e[25]||(e[25]=t=>o.newChannel.baseUrl=t),placeholder:t.$t("sysUpload.webdavBaseUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.username,"onUpdate:modelValue":e[26]||(e[26]=t=>o.newChannel.username=t),placeholder:t.$t("sysUpload.webdavUsernamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.password,"onUpdate:modelValue":e[27]||(e[27]=t=>o.newChannel.password=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.webdavPasswordPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.publicUrl"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavPublicUrlTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.publicUrl,"onUpdate:modelValue":e[28]||(e[28]=t=>o.newChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.headersText,"onUpdate:modelValue":e[29]||(e[29]=t=>o.newChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.webdavCreateDirectory"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavCreateDirectoryTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.createDirectory,"onUpdate:modelValue":e[30]||(e[30]=t=>o.newChannel.createDirectory=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[31]||(e[31]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[32]||(e[32]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[33]||(e[33]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)],64))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(T,{modelValue:o.showDetailDialog,"onUpdate:modelValue":e[37]||(e[37]=t=>o.showDetailDialog=t),title:t.$t("sysUpload.detailDialogTitle",{name:o.currentChannel?.name||""}),class:"channel-dialog",onClosed:l.resetDetailData},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[36]||(e[36]=t=>o.showDetailDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.closeBtn")),1)]),_:1}),(0,i.bF)(h,{type:"primary",onClick:l.openEditFromDetail},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(M,{column:1,border:""},{default:(0,i.k6)(()=>[(0,i.bF)(P,{label:t.$t("sysUpload.channelNameDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.name),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.channelTypeDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelTypeLabel(o.currentChannelType)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.statusLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{type:o.currentChannel?.enabled?"success":"info"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.enabled?t.$t("sysUpload.enabled"):t.$t("sysUpload.disabled")),1)]),_:1},8,["type"])]),_:1},8,["label"]),o.currentChannel?.fixed?((0,i.uX)(),(0,i.Wv)(P,{key:0,label:t.$t("sysUpload.configSource")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})]),_:1},8,["label"])):(0,i.Q3)("",!0),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(P,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.chatIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.chatId,6)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.Wv)(P,{key:2,label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"])):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(P,{label:t.$t("sysUpload.endpointLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.endpoint,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.cdnDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.cdnDomain||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.bucketName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.bucketName),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.bucketRegion")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.region),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.pathStyle")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.pathStyle?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(P,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.channelIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.channelId,6)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.nitroMember")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isNitro?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(P,{label:t.$t("sysUpload.repoName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.repo),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.privateRepo")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isPrivate?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:6},[(0,i.bF)(P,{label:t.$t("sysUpload.webdavBaseUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.baseUrl,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.username||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":l.formatHeaders(o.currentChannel?.headers),type:"textarea",autosize:{minRows:2},readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavCreateDirectory")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(!1!==o.currentChannel?.createDirectory?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):(0,i.Q3)("",!0),o.currentChannel?.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:7},[(0,i.bF)(P,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.limitGB)+" GB",1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.threshold)+"%",1)]),_:1},8,["label"]),(0,i.bF)(P,null,{label:(0,i.k6)(()=>[(0,i.Lk)("span",kp,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.currentUsage"))+" ",1),(0,i.bF)(h,{link:"",type:"primary",onClick:l.refreshQuota,class:"refresh-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt",class:(0,n.C4)({"fa-spin":o.quotaLoading})},null,8,["class"])]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",wp,[(0,i.bF)(m,{percentage:l.getQuotaPercentage(o.currentChannel),status:l.getQuotaStatus(o.currentChannel),"stroke-width":16,"text-inside":!0,format:()=>l.getQuotaText(o.currentChannel)},null,8,["percentage","status","format"]),(0,i.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":l.isQuotaExceeded(o.currentChannel)}])},(0,n.v_)(l.getQuotaStatusText(o.currentChannel)),3)])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(T,{modelValue:o.showEditDialog,"onUpdate:modelValue":e[77]||(e[77]=t=>o.showEditDialog=t),title:t.$t("sysUpload.editDialogTitle",{name:o.editChannel?.name||""}),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetEditData},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[76]||(e[76]=t=>o.showEditDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),(0,i.bF)(h,{type:"primary",onClick:l.confirmEditChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.saveChanges")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(F,{model:o.editChannel,"label-position":"top",ref:"editForm",rules:l.editRules},{default:(0,i.k6)(()=>[(0,i.bF)(x,{prop:"name"},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.channelNameLabel"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.channelNameEditDisabledTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"exclamation-triangle",class:"inline-warning-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.name,"onUpdate:modelValue":e[38]||(e[38]=t=>o.editChannel.name=t),disabled:""},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.enableChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.enabled,"onUpdate:modelValue":e[39]||(e[39]=t=>o.editChannel.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[40]||(e[40]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.chatId,"onUpdate:modelValue":e[41]||(e[41]=t=>o.editChannel.chatId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[42]||(e[42]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[43]||(e[43]=t=>o.editChannel.publicUrl=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[44]||(e[44]=t=>o.editChannel.quota.enabled=t),onChange:e[45]||(e[45]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[46]||(e[46]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[47]||(e[47]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(x,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.endpoint,"onUpdate:modelValue":e[48]||(e[48]=t=>o.editChannel.endpoint=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cdnDomain"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.cdnDomainTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.cdnDomain,"onUpdate:modelValue":e[49]||(e[49]=t=>o.editChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.bucketName,"onUpdate:modelValue":e[50]||(e[50]=t=>o.editChannel.bucketName=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.region,"onUpdate:modelValue":e[51]||(e[51]=t=>o.editChannel.region=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.accessKeyId,"onUpdate:modelValue":e[52]||(e[52]=t=>o.editChannel.accessKeyId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.secretAccessKey,"onUpdate:modelValue":e[53]||(e[53]=t=>o.editChannel.secretAccessKey=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.pathStyle"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.pathStyleTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.pathStyle,"onUpdate:modelValue":e[54]||(e[54]=t=>o.editChannel.pathStyle=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[55]||(e[55]=t=>o.editChannel.quota.enabled=t),onChange:e[56]||(e[56]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[57]||(e[57]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[58]||(e[58]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[59]||(e[59]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.channelId,"onUpdate:modelValue":e[60]||(e[60]=t=>o.editChannel.channelId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[61]||(e[61]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.nitroMember"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.nitroTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.isNitro,"onUpdate:modelValue":e[62]||(e[62]=t=>o.editChannel.isNitro=t)},null,8,["modelValue"])]),_:1})],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(x,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.repo,"onUpdate:modelValue":e[63]||(e[63]=t=>o.editChannel.repo=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.token,"onUpdate:modelValue":e[64]||(e[64]=t=>o.editChannel.token=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.privateRepoTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.isPrivate,"onUpdate:modelValue":e[65]||(e[65]=t=>o.editChannel.isPrivate=t)},null,8,["modelValue"])]),_:1})],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(x,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.baseUrl,"onUpdate:modelValue":e[66]||(e[66]=t=>o.editChannel.baseUrl=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.username,"onUpdate:modelValue":e[67]||(e[67]=t=>o.editChannel.username=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.password,"onUpdate:modelValue":e[68]||(e[68]=t=>o.editChannel.password=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.publicUrl"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavPublicUrlTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[69]||(e[69]=t=>o.editChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.headersText,"onUpdate:modelValue":e[70]||(e[70]=t=>o.editChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.webdavCreateDirectory"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavCreateDirectoryTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.createDirectory,"onUpdate:modelValue":e[71]||(e[71]=t=>o.editChannel.createDirectory=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[72]||(e[72]=t=>o.editChannel.quota.enabled=t),onChange:e[73]||(e[73]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[74]||(e[74]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[75]||(e[75]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"])])),[[D,o.loading]])}var Sp={components:{ChannelIcon:Tu.A,CustomSelect:$u},data(){return{channelFilter:"",channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],addableChannels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],telegramSettings:{loadBalance:{enabled:!1},channels:[]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{enabled:!1},channels:[]},discordSettings:{loadBalance:{enabled:!1},channels:[]},huggingfaceSettings:{loadBalance:{enabled:!1},channels:[]},webdavSettings:{loadBalance:{enabled:!1},channels:[]},showAddDialog:!1,showDetailDialog:!1,showEditDialog:!1,currentChannelType:"",currentChannelIndex:-1,currentChannel:null,editChannel:{},newChannel:{type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0},quotaStats:{},quotaLoading:!1,loading:!1}},computed:{filterOptions(){return[{value:"",label:this.$t("common.all")},...this.channels.map(t=>({value:t.value,label:t.label,channelType:t.value,iconClass:this.getChannelIconClass(t.value)}))]},filteredChannels(){return this.channelFilter?this.channels.filter(t=>t.value===this.channelFilter):this.channels},addRules(){return{type:[{required:!0,message:this.$t("sysUpload.channelTypePlaceholder"),trigger:"change"}],name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}},editRules(){return{name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}}},methods:{handleCardMouseMove(t,e,s){const i=t.currentTarget,n=i.getBoundingClientRect(),a=t.clientX-n.left,o=t.clientY-n.top,l=`glow-${e}-${s}`,r=this.$refs[l];r&&r[0]&&(r[0].style.opacity="1",r[0].style.left=`${a}px`,r[0].style.top=`${o}px`)},handleCardMouseLeave(t,e){const s=`glow-${t}-${e}`,i=this.$refs[s];i&&i[0]&&(i[0].style.opacity="0")},getChannelIconClass(t){return`channel-brand-${t}`},getChannelTypeLabel(t){const e=this.channels.find(e=>e.value===t);return e?e.label:t},getChannelList(t){return this.getSettings(t)?.channels||[]},getSettings(t){const e={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};return e[t]},hasLoadBalance(t){return["telegram","s3","discord","huggingface","webdav"].includes(t)},maskText(t,e=4){return t?t.length<=2*e?"****":t.slice(0,e)+"****"+t.slice(-e):this.$t("sysUpload.notSet")},formatHeaders(t){return!t||"object"===typeof t&&0===Object.keys(t).length?this.$t("sysUpload.notSet"):"string"===typeof t?t:JSON.stringify(t,null,2)},headersToText(t){return t?"string"===typeof t?t:JSON.stringify(t,null,2):""},parseHeadersText(t){if(!t||!t.trim())return{};try{const e=JSON.parse(t);return!e||"object"!==typeof e||Array.isArray(e)?null:e}catch(e){return null}},openDetailDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e,this.currentChannel=this.getChannelList(t)[e],this.showDetailDialog=!0},openEditDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e;const s=this.getChannelList(t)[e];this.editChannel=JSON.parse(JSON.stringify(s)),"webdav"===t&&(this.editChannel.headersText=this.headersToText(this.editChannel.headers),this.editChannel.createDirectory=!1!==this.editChannel.createDirectory),this.editChannel.quota||(this.editChannel.quota={enabled:!1,limitGB:10,threshold:95}),this.showEditDialog=!0},openEditFromDetail(){this.showDetailDialog=!1,this.openEditDialog(this.currentChannelType,this.currentChannelIndex)},resetAddForm(){this.newChannel={type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},resetDetailData(){this.currentChannel=null},resetEditData(){this.editChannel={}},onChannelTypeChange(){const{type:t,name:e}=this.newChannel;this.newChannel={type:t,name:e,enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},confirmAddChannel(){this.$refs.addForm.validate(t=>{if(!t)return;const{type:e,name:s}=this.newChannel,i=this.getSettings(e),n=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env","WebDAV_env"];if(n.includes(s))return void this.$message.warning(this.$t("sysUpload.reservedName"));const a=i.channels.some(t=>t.name===s);if(a)return void this.$message.warning(this.$t("sysUpload.duplicateName"));let o={id:i.channels.length+1,name:this.newChannel.name,type:e,savePath:"database",enabled:!0,fixed:!1};if("telegram"===e)Object.assign(o,{botToken:this.newChannel.botToken,chatId:this.newChannel.chatId,proxyUrl:this.newChannel.proxyUrl});else if("s3"===e)Object.assign(o,{endpoint:this.newChannel.endpoint,cdnDomain:this.newChannel.cdnDomain,bucketName:this.newChannel.bucketName,region:this.newChannel.region,accessKeyId:this.newChannel.accessKeyId,secretAccessKey:this.newChannel.secretAccessKey,pathStyle:this.newChannel.pathStyle,quota:{...this.newChannel.quota}});else if("discord"===e)Object.assign(o,{botToken:this.newChannel.botToken,channelId:this.newChannel.channelId,proxyUrl:this.newChannel.proxyUrl,isNitro:this.newChannel.isNitro});else if("huggingface"===e)Object.assign(o,{repo:this.newChannel.repo,token:this.newChannel.token,isPrivate:this.newChannel.isPrivate});else if("webdav"===e){const t=this.parseHeadersText(this.newChannel.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));Object.assign(o,{baseUrl:this.newChannel.baseUrl,username:this.newChannel.username,password:this.newChannel.password,publicUrl:this.newChannel.publicUrl,headers:t,createDirectory:!1!==this.newChannel.createDirectory,quota:{...this.newChannel.quota}})}i.channels.push(o),this.showAddDialog=!1,this.saveSettings()})},confirmEditChannel(){this.$refs.editForm.validate(t=>{if(!t)return;const e=this.getSettings(this.currentChannelType),s=this.currentChannelIndex,i=e.channels[s]?.name||this.editChannel.name,n={...this.editChannel,name:i};if("webdav"===this.currentChannelType){const t=this.parseHeadersText(n.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));n.headers=t,n.createDirectory=!1!==n.createDirectory,delete n.headersText}e.channels[this.currentChannelIndex]=n,this.showEditDialog=!1,this.saveSettings()})},deleteChannel(t,e){const s=this.getChannelList(t)[e];s.fixed?this.$message.warning(this.$t("sysUpload.fixedChannelCannotDelete")):this.$confirm(this.$t("sysUpload.deleteChannelConfirm"),this.$t("common.warning"),{confirmButtonText:this.$t("common.confirm"),cancelButtonText:this.$t("common.cancel"),type:"warning"}).then(()=>{const s=this.getSettings(t);s.channels.splice(e,1),s.channels.forEach((t,e)=>{t.id=e+1}),this.saveSettings()}).catch(()=>{})},saveSettings(){const t={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};(0,Pe.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then(()=>{this.$message.success(this.$t("sysOthers.settingsSaved"))})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Pe.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Pe.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}}catch(t){console.error("Failed to refresh quota stats:",t)}finally{this.quotaLoading=!1}},async loadQuotaStats(){try{const t=await(0,Pe.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}catch(t){console.error("Failed to load quota stats:",t)}},getChannelUsedGB(t){const e=this.quotaStats[t.name];return e?(e.usedMB||0)/1024:0},getQuotaPercentage(t){const e=this.getChannelUsedGB(t),s=t.quota?.limitGB||10,i=e/s*100;return Math.min(100,Math.round(10*i)/10)},getQuotaStatus(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?"exception":e>=80?"warning":"success"},getQuotaText(t){const e=this.getChannelUsedGB(t),s=t.quota?.limitGB||10;return`${e.toFixed(2)} / ${s} GB`},isQuotaExceeded(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s},getQuotaStatusText(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?`⚠️ 已达到容量阈值 (${s}%),渠道写入已暂停`:e>=80?"⚡ 容量使用较高,接近阈值":"✓ 容量正常"},async onQuotaEnabledChange(t,e){if(t&&e.name){const t=this.quotaStats[e.name];t||this.$confirm(this.$t("sysUpload.quotaInitConfirm"),this.$t("sysUpload.quotaInitTitle"),{confirmButtonText:this.$t("sysUpload.quotaInitConfirmBtn"),cancelButtonText:this.$t("sysUpload.quotaInitCancelBtn"),type:"info"}).then(async()=>{await this.recalculateQuota()}).catch(()=>{this.$message.info(this.$t("sysUpload.quotaInitLater"))})}},async recalculateQuota(){this.quotaLoading=!0;try{this.$message.info(this.$t("sysUpload.quotaCalculating"));const t=await(0,Pe.A)("/api/manage/quota",{method:"POST"}),e=await t.json();e.success?(this.quotaStats=e.channelStats||{},this.$message.success(this.$t("sysUpload.quotaCalculateSuccess"))):this.$message.error(this.$t("sysUpload.quotaCalculateError")+(e.error||""))}catch(t){console.error("Failed to recalculate quota:",t),this.$message.error(this.$t("sysUpload.quotaCalculateFailed"))}finally{this.quotaLoading=!1}}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/upload").then(t=>t.json()).then(t=>{this.telegramSettings=t.telegram,t.cfr2&&t.cfr2.channels&&(t.cfr2.channels=t.cfr2.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.cfr2Settings=t.cfr2,t.s3&&t.s3.channels&&(t.s3.channels=t.s3.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.s3Settings=t.s3,t.discord&&t.discord.channels&&(t.discord.channels=t.discord.channels.map(t=>({...t,proxyUrl:t.proxyUrl||""}))),this.discordSettings=t.discord||{loadBalance:{},channels:[]},t.huggingface&&t.huggingface.channels&&(t.huggingface.channels=t.huggingface.channels.map(t=>({...t,isPrivate:t.isPrivate||!1}))),this.huggingfaceSettings=t.huggingface||{loadBalance:{},channels:[]},t.webdav&&t.webdav.channels&&(t.webdav.channels=t.webdav.channels.map(t=>({...t,username:t.username||"",password:t.password||"",publicUrl:t.publicUrl||"",headers:t.headers||{},createDirectory:!1!==t.createDirectory,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.webdavSettings=t.webdav||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const Fp=(0,c.A)(Sp,[["render",Cp],["__scopeId","data-v-9a9d7c2a"]]);var Tp=Fp,Pp=s(98469);s(49187);const Mp={class:"save-text"};function Dp(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.Wv)(C.eB,{name:"fade-up"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:(0,n.C4)(["floating-save-btn",{"is-loading":s.loading}]),onClick:e[0]||(e[0]=(...t)=>l.handleClick&&l.handleClick(...t))},[s.loading?((0,i.uX)(),(0,i.Wv)(r,{key:0,icon:"spinner",spin:""})):((0,i.uX)(),(0,i.Wv)(r,{key:1,icon:"save"})),(0,i.Lk)("span",Mp,(0,n.v_)(s.loading?t.$t("floatingSave.saving"):t.$t("floatingSave.save")),1)],2),[[C.aG,o.visible]])]),_:1})}var Ap={name:"FloatingSaveButton",emits:["click"],props:{loading:{type:Boolean,default:!1},show:{type:Boolean,default:!0}},data(){return{visible:!1}},watch:{show:{immediate:!0,handler(t){t?setTimeout(()=>{this.visible=!0},600):this.visible=!1}}},methods:{handleClick(){this.loading||this.$emit("click")}}};const $p=(0,c.A)(Ap,[["render",Dp],["__scopeId","data-v-53091626"]]);var Vp=$p,Lp=s(84757);s(5802),s(64752),s(38736);const Ep={class:"security-settings"},Ip={class:"first-settings"},Up={class:"first-title"},Op={class:"second-title"},Rp={style:{display:"flex",gap:"8px",width:"100%"}},Wp={class:"second-title"},Bp={style:{display:"flex",gap:"8px",width:"100%"}},Np={class:"second-title token-title"},zp={class:"token-actions"},jp={class:"token-table-container"},qp={class:"table-cell-content"},Hp={class:"table-cell-content"},Xp={class:"token-display"},Kp={class:"table-cell-content"},Qp={class:"table-cell-content"},Yp={class:"table-cell-content"},Gp={class:"table-cell-content"},Jp={class:"table-cell-content action-buttons"},Zp={class:"first-settings"},tg={class:"first-title"},eg={class:"second-title"},sg={class:"second-title"},ig={class:"query-param-list"},ng={class:"query-param-list"},ag={class:"first-settings"},og={class:"first-title"},lg={class:"second-title"},rg={class:"second-title"},dg={class:"second-title"},cg={class:"form-item-hint"},hg={class:"form-item-hint"},ug={style:{display:"flex",gap:"10px",width:"100%"}},pg={class:"dialog-footer"},gg={style:{display:"flex",gap:"10px",width:"100%"}},fg={class:"dialog-footer"},mg={class:"token-result"},bg={style:{"margin-bottom":"15px",color:"#e6a23c"}},yg={class:"dialog-footer"};function xg(t,e,s,a,o,l){const r=wu.WK,d=Pp.dI,c=_u.xE,h=_u.US,u=(0,i.g2)("font-awesome-icon"),p=K.S2,f=Lp.o8,m=Fu.u,b=Lp.Up,y=g.R7,x=Su.qi,_=Cu.P9,k=Cu.AV,S=ku.lq,F=Vp,T=Pp.o5,P=w.kZ,M=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Ep,[(0,i.Lk)("div",Ip,[(0,i.Lk)("h3",Up,(0,n.v_)(t.$t("sysSecurity.authManagement")),1),(0,i.Lk)("h4",Op,(0,n.v_)(t.$t("sysSecurity.userAuth")),1),(0,i.bF)(h,{model:o.authSettings.user,rules:l.userPassRules,ref:"userPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.uploadPassword"),prop:"authCode"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Rp,[(0,i.bF)(r,{modelValue:o.authSettings.user.authCode,"onUpdate:modelValue":e[0]||(e[0]=t=>o.authSettings.user.authCode=t),type:"password","show-password":"",onInput:l.handleUserPassInput,autocomplete:"new-password",placeholder:o.authSettings.user._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearUserPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.user._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearUserPassword,"onUpdate:modelValue":e[1]||(e[1]=t=>o.clearUserPassword=t),onChange:l.handleClearUserPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showUserPassConfirm?((0,i.uX)(),(0,i.Wv)(c,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewUserPassword",key:"user-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.user.confirmNewUserPassword,"onUpdate:modelValue":e[2]||(e[2]=t=>o.authSettings.user.confirmNewUserPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Wp,(0,n.v_)(t.$t("sysSecurity.adminAuth")),1),(0,i.bF)(h,{model:o.authSettings.admin,rules:l.adminPassRules,ref:"adminPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.adminUsername"),prop:"adminUsername"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminUsername,"onUpdate:modelValue":e[3]||(e[3]=t=>o.authSettings.admin.adminUsername=t),autocomplete:"new-password",disabled:o.clearAdminPassword},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.adminPassword"),prop:"adminPassword"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Bp,[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminPassword,"onUpdate:modelValue":e[4]||(e[4]=t=>o.authSettings.admin.adminPassword=t),type:"password","show-password":"",onInput:l.handleAdminPassInput,autocomplete:"new-password",placeholder:o.authSettings.admin._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearAdminPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.admin._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearAdminPassword,"onUpdate:modelValue":e[5]||(e[5]=t=>o.clearAdminPassword=t),onChange:l.handleClearAdminPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showAdminPassConfirm?((0,i.uX)(),(0,i.Wv)(c,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewAdminPassword",key:"admin-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.confirmNewAdminPassword,"onUpdate:modelValue":e[6]||(e[6]=t=>o.authSettings.admin.confirmNewAdminPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Np,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.apiTokenManagement"))+" ",1),(0,i.Lk)("a",zp,[(0,i.bF)(p,{type:"primary",size:"small",onClick:e[7]||(e[7]=t=>o.showCreateTokenDialog=!0),circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"})]),_:1})])]),(0,i.Lk)("div",jp,[(0,i.bo)(((0,i.uX)(),(0,i.Wv)(b,{data:o.apiTokens,class:"token-table"},{default:(0,i.k6)(()=>[(0,i.bF)(f,{prop:"name",label:t.$t("sysSecurity.tokenName"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",qp,(0,n.v_)(t.row.name),1)]),_:1},8,["label"]),(0,i.bF)(f,{prop:"token",label:t.$t("sysSecurity.tokenValue"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Hp,[(0,i.Lk)("span",Xp,(0,n.v_)(t.row.token),1)])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"permissions",label:t.$t("sysSecurity.permissions"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Kp,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(t.row.permissions,t=>((0,i.uX)(),(0,i.Wv)(m,{key:t,size:"small",class:"permission-tag"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getPermissionText(t)),1)]),_:2},1024))),128))])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"createdAt",label:t.$t("sysSecurity.createdAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Qp,(0,n.v_)(l.formatDate(t.row.createdAt)),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.status"),"header-align":"center",width:"90"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Yp,[(0,i.bF)(m,{type:"active"===l.getTokenStatus(t.row.expiresAt).status?"success":"danger",size:"small"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getTokenStatus(t.row.expiresAt).label),1)]),_:2},1032,["type"])])]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.expiresAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Gp,(0,n.v_)(l.getTokenStatus(t.row.expiresAt).expiresText),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.operation"),fixed:"right","header-align":"center"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",Jp,[(0,i.bF)(p,{class:"action-button",size:"small",onClick:t=>l.editToken(e.row)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(p,{class:"action-button",size:"small",type:"danger",onClick:t=>l.deleteToken(e.row.id)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.deleteBtn")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"])]),_:1},8,["data"])),[[M,o.tokenLoading]])])]),(0,i.Lk)("div",Zp,[(0,i.Lk)("h3",tg,(0,n.v_)(t.$t("sysSecurity.uploadManagement")),1),(0,i.Lk)("h4",eg,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.imageReview"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.imageReviewTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(h,{model:o.uploadSettings.moderate,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.enableReview")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.moderate.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.uploadSettings.moderate.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.reviewChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(k,{modelValue:o.uploadSettings.moderate.channel,"onUpdate:modelValue":e[9]||(e[9]=t=>o.uploadSettings.moderate.channel=t),placeholder:t.$t("sysSecurity.reviewChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:"moderatecontent.com",value:"moderatecontent.com"}),(0,i.bF)(_,{label:"nsfwjs",value:"nsfwjs"})]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"moderatecontent.com"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.apiKey")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.moderateContentApiKey,"onUpdate:modelValue":e[10]||(e[10]=t=>o.uploadSettings.moderate.moderateContentApiKey=t)},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0),"nsfwjs"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.nsfwApiPath,"onUpdate:modelValue":e[11]||(e[11]=t=>o.uploadSettings.moderate.nsfwApiPath=t),placeholder:"https://nsfwjs.your.domain"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"]),(0,i.Lk)("h4",sg,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.ipQuery"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.ipQueryTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(h,{model:o.uploadSettings.ipQuery,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.enableIpQuery")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.ipQuery.enabled,"onUpdate:modelValue":e[12]||(e[12]=t=>o.uploadSettings.ipQuery.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.ipQueryChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(k,{modelValue:o.uploadSettings.ipQuery.channel,"onUpdate:modelValue":e[13]||(e[13]=t=>o.uploadSettings.ipQuery.channel=t),placeholder:t.$t("sysSecurity.ipQueryChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:t.$t("sysSecurity.customApi"),value:"customApi"},null,8,["label"])]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"customApi"===o.uploadSettings.ipQuery.channel?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(c,{label:t.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.ipQuery.customApi.url,"onUpdate:modelValue":e[14]||(e[14]=t=>o.uploadSettings.ipQuery.customApi.url=t),placeholder:"https://api.example.com/ip"},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.queryParams")},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ig,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.uploadSettings.ipQuery.customApi.params,(e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"query-param-row"},[(0,i.bF)(r,{modelValue:e.key,"onUpdate:modelValue":t=>e.key=t,placeholder:t.$t("sysSecurity.paramNamePlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(r,{modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,placeholder:t.$t("sysSecurity.paramValuePlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(p,{type:"danger",plain:"",circle:"",onClick:t=>l.removeIpQueryParam(s),disabled:o.uploadSettings.ipQuery.customApi.params.length<=1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]))),128)),(0,i.bF)(p,{type:"primary",plain:"",onClick:l.addIpQueryParam},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysSecurity.addQueryParam")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"]),(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.responseFields"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.responseFieldsTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",ng,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.uploadSettings.ipQuery.customApi.responseFields,(e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"response-field-row"},[(0,i.bF)(r,{modelValue:o.uploadSettings.ipQuery.customApi.responseFields[s],"onUpdate:modelValue":t=>o.uploadSettings.ipQuery.customApi.responseFields[s]=t,placeholder:t.$t("sysSecurity.responseFieldPathPlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(p,{plain:"",circle:"",onClick:t=>l.moveIpQueryResponseField(s,-1),disabled:0===s},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"arrow-up"})]),_:1},8,["onClick","disabled"]),(0,i.bF)(p,{plain:"",circle:"",onClick:t=>l.moveIpQueryResponseField(s,1),disabled:s===o.uploadSettings.ipQuery.customApi.responseFields.length-1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"arrow-down"})]),_:1},8,["onClick","disabled"]),(0,i.bF)(p,{type:"danger",plain:"",circle:"",onClick:t=>l.removeIpQueryResponseField(s)},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"trash-alt"})]),_:1},8,["onClick"])]))),128)),(0,i.bF)(p,{type:"primary",plain:"",onClick:l.addIpQueryResponseField},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysSecurity.addResponseField")),1)]),_:1},8,["onClick"])])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.Lk)("div",ag,[(0,i.Lk)("h3",og,(0,n.v_)(t.$t("sysSecurity.accessManagement")),1),(0,i.Lk)("h4",lg,(0,n.v_)(t.$t("sysSecurity.domainFilter")),1),(0,i.bF)(h,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.allowedDomains"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.allowedDomainsTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.accessSettings.allowedDomains,"onUpdate:modelValue":e[15]||(e[15]=t=>o.accessSettings.allowedDomains=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h4",rg,(0,n.v_)(t.$t("sysSecurity.whiteListMode")),1),(0,i.bF)(h,{model:o.accessSettings,rules:l.accessRules,ref:"accessForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.enableWhiteList"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.enableWhiteListTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.whiteListMode,"onUpdate:modelValue":e[16]||(e[16]=t=>o.accessSettings.whiteListMode=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",dg,(0,n.v_)(t.$t("sysSecurity.sessionSecurityPolicy")),1),(0,i.bF)(h,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.secureMode"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.secureModeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.sessionSecure,"onUpdate:modelValue":e[17]||(e[17]=t=>o.accessSettings.sessionSecure=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(c,{label:t.$t("sysSecurity.userSessionMaxAge"),prop:"userSessionMaxAge"},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.userSessionMaxAge,"onUpdate:modelValue":e[18]||(e[18]=t=>o.accessSettings.userSessionMaxAge=t),min:1,max:3650,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",cg,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.adminSessionMaxAge"),prop:"adminSessionMaxAge"},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.adminSessionMaxAge,"onUpdate:modelValue":e[19]||(e[19]=t=>o.accessSettings.adminSessionMaxAge=t),min:1,max:3650,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",hg,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"])]),_:1},8,["model"])]),(0,i.bF)(F,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"]),(0,i.bF)(P,{modelValue:o.showCreateTokenDialog,"onUpdate:modelValue":e[27]||(e[27]=t=>o.showCreateTokenDialog=t),title:t.$t("sysSecurity.createTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",pg,[(0,i.bF)(p,{onClick:e[26]||(e[26]=t=>o.showCreateTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.createToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.createBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(h,{model:o.newToken,rules:l.tokenRules,ref:"tokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel"),prop:"name"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.newToken.name,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newToken.name=t),placeholder:t.$t("sysSecurity.tokenNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.newToken.permissions,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.neverExpire,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newToken.neverExpire=t),onChange:l.onCreateNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ug,[(0,i.bF)(S,{modelValue:o.newToken.expirationValue,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.newToken.expirationUnit,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.autoDelete,"onUpdate:modelValue":e[25]||(e[25]=t=>o.newToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(P,{modelValue:o.showEditTokenDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showEditTokenDialog=t),title:t.$t("sysSecurity.editTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",fg,[(0,i.bF)(p,{onClick:e[34]||(e[34]=t=>o.showEditTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.updateToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.updateBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(h,{model:o.editingToken,rules:l.editTokenRules,ref:"editTokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.editingToken.name,"onUpdate:modelValue":e[28]||(e[28]=t=>o.editingToken.name=t),disabled:""},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":e[29]||(e[29]=t=>o.editingToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.neverExpire,"onUpdate:modelValue":e[30]||(e[30]=t=>o.editingToken.neverExpire=t),onChange:l.onEditNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",gg,[(0,i.bF)(S,{modelValue:o.editingToken.expirationValue,"onUpdate:modelValue":e[31]||(e[31]=t=>o.editingToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.editingToken.expirationUnit,"onUpdate:modelValue":e[32]||(e[32]=t=>o.editingToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.autoDelete,"onUpdate:modelValue":e[33]||(e[33]=t=>o.editingToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(P,{modelValue:o.showTokenResultDialog,"onUpdate:modelValue":e[38]||(e[38]=t=>o.showTokenResultDialog=t),title:t.$t("sysSecurity.tokenCreatedTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",yg,[(0,i.bF)(p,{type:"primary",onClick:e[37]||(e[37]=t=>o.showTokenResultDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.savedBtn")),1)]),_:1})])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",mg,[(0,i.Lk)("p",bg,[(0,i.bF)(u,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysSecurity.tokenCreatedWarning")),1)]),(0,i.bF)(h,{"label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(o.createdToken.name),1)]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.fullToken")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.createdToken.token,"onUpdate:modelValue":e[36]||(e[36]=t=>o.createdToken.token=t),readonly:""},{append:(0,i.k6)(()=>[(0,i.bF)(p,{onClick:l.copyToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.copyBtn")),1)]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1},8,["label"])]),_:1})])]),_:1},8,["modelValue","title","width"])])),[[M,o.loading]])}s(81148);const vg={s:1e3,m:6e4,h:36e5,d:864e5};function _g(t,e,s){if(!Number.isFinite(e)||e<=0)throw new Error("有效期数值必须大于 0");const i="string"===typeof t?new Date(t):new Date(t.getTime());if(vg[s])return new Date(i.getTime()+e*vg[s]).toISOString();if("M"===s)return i.setUTCMonth(i.getUTCMonth()+e),i.toISOString();if("Y"===s)return i.setUTCFullYear(i.getUTCFullYear()+e),i.toISOString();throw new Error(`无效的时间单位: ${s}`)}function kg(t){const e=new Date(t),s=e.getFullYear(),i=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),a=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0"),l=String(e.getSeconds()).padStart(2,"0");return`${s}-${i}-${n} ${a}:${o}:${l}`}function wg(t,e=new Date){if(null===t||void 0===t)return{status:"active",label:"有效",expiresText:"永不过期"};const s=new Date(t),i=e instanceof Date?e:new Date(e),n=kg(t);return i.getTime()>s.getTime()?{status:"expired",label:"已过期",expiresText:n}:{status:"active",label:"有效",expiresText:n}}var Cg={components:{FloatingSaveButton:Vp},data(){return{authSettings:{user:{},admin:{}},uploadSettings:{moderate:{},ipQuery:{enabled:!1,channel:"customApi",customApi:{url:"",params:[{key:"ip",value:"{ip}"}],responseFields:[]}}},accessSettings:{},apiTokens:[],loading:!0,tokenLoading:!1,oriUserPassword:"",oriAdminPassword:"",showUserPassConfirm:!1,showAdminPassConfirm:!1,clearUserPassword:!1,clearAdminPassword:!1,showCreateTokenDialog:!1,showEditTokenDialog:!1,showTokenResultDialog:!1,timeUnitOptions:[{labelKey:"sysSecurity.timeUnitSeconds",value:"s"},{labelKey:"sysSecurity.timeUnitMinutes",value:"m"},{labelKey:"sysSecurity.timeUnitHours",value:"h"},{labelKey:"sysSecurity.timeUnitDays",value:"d"},{labelKey:"sysSecurity.timeUnitMonths",value:"M"},{labelKey:"sysSecurity.timeUnitYears",value:"Y"}],newToken:{name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},editingToken:{id:"",name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},createdToken:{name:"",token:""}}},computed:{dialogWidth(){return window.innerWidth>768?"50%":"90%"},userPassRules(){return{authCode:[{validator:(t,e,s)=>{const i=["%","&","?","#","/"],n=i.some(t=>e&&e.includes(t));n?s(new Error(this.$t("sysSecurity.passwordUrlReserved"))):s()},trigger:"blur"}],confirmNewUserPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.user.authCode?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmUploadPassword")))},trigger:"blur"}]}},adminPassRules(){return{confirmNewAdminPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.admin.adminPassword?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmAdminPassword")))},trigger:"blur"}]}},accessRules(){const t=(t,e,s)=>{!Number.isInteger(e)||e<1||e>3650?s(new Error(this.$t("sysSecurity.sessionMaxAgeInvalid"))):s()};return{userSessionMaxAge:[{validator:t,trigger:"change"}],adminSessionMaxAge:[{validator:t,trigger:"change"}]}},tokenRules(){return{name:[{required:!0,message:this.$t("sysSecurity.tokenNameRequired"),trigger:"blur"}],permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.newToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}},editTokenRules(){return{permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.editingToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}}},methods:{normalizeIpQuerySettings(t={}){const e=t.ipQuery||{},s=e.customApi||{},i=Array.isArray(s.params)&&s.params.length>0?s.params.map(t=>({key:t?.key||"",value:t?.value||""})):[{key:"ip",value:"{ip}"}],n=Array.isArray(s.responseFields)?s.responseFields.map(t=>"string"===typeof t?t:t?.path||""):[];return{...t,moderate:t.moderate||{},ipQuery:{enabled:e.enabled??!1,channel:e.channel||"customApi",customApi:{url:s.url||"",params:i,responseFields:n}}}},addIpQueryParam(){this.uploadSettings.ipQuery.customApi.params.push({key:"",value:""})},removeIpQueryParam(t){this.uploadSettings.ipQuery.customApi.params.length<=1||this.uploadSettings.ipQuery.customApi.params.splice(t,1)},addIpQueryResponseField(){this.uploadSettings.ipQuery.customApi.responseFields.push("")},removeIpQueryResponseField(t){this.uploadSettings.ipQuery.customApi.responseFields.splice(t,1)},moveIpQueryResponseField(t,e){const s=this.uploadSettings.ipQuery.customApi.responseFields,i=t+e;if(i<0||i>=s.length)return;const[n]=s.splice(t,1);s.splice(i,0,n)},handleUserPassInput(){this.authSettings.user.authCode!==this.oriUserPassword?this.showUserPassConfirm=!0:this.showUserPassConfirm=!1},handleAdminPassInput(){this.authSettings.admin.adminPassword!==this.oriAdminPassword?this.showAdminPassConfirm=!0:this.showAdminPassConfirm=!1},handleClearUserPassword(t){t&&(this.authSettings.user.authCode="",this.showUserPassConfirm=!1)},handleClearAdminPassword(t){t&&(this.authSettings.admin.adminPassword="",this.authSettings.admin.adminUsername="",this.showAdminPassConfirm=!1)},getPermissionText(t){const e={upload:this.$t("sysSecurity.permUpload"),delete:this.$t("sysSecurity.permDelete"),list:this.$t("sysSecurity.permList"),manage:this.$t("sysSecurity.permManage")};return e[t]||t},formatDate(t){return new Date(t).toLocaleString("zh-CN")},async loadApiTokens(){this.tokenLoading=!0;try{const t=await(0,Pe.A)("/api/manage/apiTokens"),e=await t.json();this.apiTokens=e.tokens||[]}catch(t){this.$message.error(this.$t("sysSecurity.tokenListFailed"))}finally{this.tokenLoading=!1}},createToken(){this.$refs.tokenForm.validate(async t=>{if(t)try{this.newToken.owner="admin";let t=null,e=!1;this.newToken.neverExpire||(t=_g(new Date,this.newToken.expirationValue,this.newToken.expirationUnit),e=this.newToken.autoDelete);const s=await(0,Pe.A)("/api/manage/apiTokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:this.newToken.name,owner:this.newToken.owner,permissions:this.newToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.createdToken={name:i.name,token:i.token},this.showCreateTokenDialog=!1,this.showTokenResultDialog=!0,this.newToken={name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenCreateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenCreateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenCreateFailed"))}})},editToken(t){const e=null!==t.expiresAt&&void 0!==t.expiresAt;this.editingToken={id:t.id,name:t.name,owner:t.owner,permissions:[...t.permissions],neverExpire:!e,expirationValue:1,expirationUnit:"d",autoDelete:t.autoDelete||!1},this.showEditTokenDialog=!0},updateToken(){this.$refs.editTokenForm.validate(async t=>{if(t)try{let t=null,e=!1;this.editingToken.neverExpire||(t=_g(new Date,this.editingToken.expirationValue,this.editingToken.expirationUnit),e=this.editingToken.autoDelete);const s=await(0,Pe.A)("/api/manage/apiTokens",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tokenId:this.editingToken.id,permissions:this.editingToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.showEditTokenDialog=!1,await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenUpdateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenUpdateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenUpdateFailed"))}})},async deleteToken(t){try{await this.$confirm(this.$t("sysSecurity.tokenDeleteConfirm"),this.$t("sysSecurity.tokenDeleteConfirmTitle"),{confirmButtonText:this.$t("sysSecurity.tokenDeleteConfirmOk"),cancelButtonText:this.$t("sysSecurity.tokenDeleteConfirmCancel"),type:"warning"});const e=await(0,Pe.A)(`/api/manage/apiTokens?id=${t}`,{method:"DELETE"}),s=await e.json();e.ok?(await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenDeleteSuccess"))):this.$message.error(s.error||this.$t("sysSecurity.tokenDeleteFailed"))}catch(e){"cancel"!==e&&this.$message.error(this.$t("sysSecurity.tokenDeleteFailed"))}},async copyToken(){try{await navigator.clipboard.writeText(this.createdToken.token),this.$message.success(this.$t("sysSecurity.tokenCopied"))}catch(t){this.$message.error(this.$t("sysSecurity.copyFailed"))}},onCreateNeverExpireChange(t){t&&(this.newToken.autoDelete=!1)},onEditNeverExpireChange(t){t&&(this.editingToken.autoDelete=!1)},getTokenStatus(t){return wg(t)},saveSettings(){let t=[];t.push(new Promise(t=>{this.$refs.userPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.adminPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.accessForm.validate(e=>{t(e)})})),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;if(this.accessSettings.userSessionMaxAge<1||!Number.isInteger(this.accessSettings.userSessionMaxAge)||this.accessSettings.userSessionMaxAge>3650||this.accessSettings.adminSessionMaxAge<1||!Number.isInteger(this.accessSettings.adminSessionMaxAge)||this.accessSettings.adminSessionMaxAge>3650)return void this.$message.error(this.$t("sysSecurity.sessionMaxAgeInvalid"));const s={auth:this.authSettings,upload:this.uploadSettings,access:this.accessSettings};delete s.auth.user.confirmNewUserPassword,delete s.auth.admin.confirmNewAdminPassword,this.clearUserPassword&&(s.auth.user._clear=!0,s.auth.user.authCode=""),this.clearAdminPassword&&(s.auth.admin._clear=!0,s.auth.admin.adminPassword=""),(0,Pe.A)("/api/manage/sysConfig/security",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}).then(t=>t.json()).then(t=>{if(t.adminPasswordChanged){const t=this.$t("sysSecurity.adminPasswordChangedRelogin");return this.$message.warning(t),void setTimeout(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")},1500)}this.$message.success(this.$t("sysSecurity.settingsSaved")),this.authSettings.user.authCode="",this.authSettings.admin.adminPassword="",this.oriUserPassword="",this.oriAdminPassword="",s.auth.user.authCode&&!s.auth.user._clear?this.authSettings.user._hasPassword=!0:s.auth.user._clear&&(this.authSettings.user._hasPassword=!1),s.auth.admin.adminPassword&&!s.auth.admin._clear?this.authSettings.admin._hasPassword=!0:s.auth.admin._clear&&(this.authSettings.admin._hasPassword=!1),this.showUserPassConfirm=!1,this.showAdminPassConfirm=!1,this.clearUserPassword=!1,this.clearAdminPassword=!1}).catch(()=>{})})}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/security").then(t=>t.json()).then(t=>{this.authSettings=t.auth,this.uploadSettings=this.normalizeIpQuerySettings(t.upload),this.accessSettings=t.access,this.oriUserPassword="",this.oriAdminPassword="",this.authSettings.user.confirmNewUserPassword="",this.authSettings.admin.confirmNewAdminPassword="",this.loadApiTokens()}).finally(()=>{this.loading=!1})}};const Sg=(0,c.A)(Cg,[["render",xg],["__scopeId","data-v-906380e0"]]);var Fg=Sg;const Tg={class:"page-settings"},Pg={class:"first-title"};function Mg(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=Cu.P9,h=Cu.AV,u=Su.qi,p=wu.WK,f=_u.xE,m=_u.US,b=Vp,y=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Tg,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.groupedSettings,(e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"first-settings"},[(0,i.Lk)("h3",Pg,(0,n.v_)(s),1),(0,i.bF)(m,{model:o.settings,"label-width":"150px"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e,(e,s)=>((0,i.uX)(),(0,i.Wv)(f,{key:e.id},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.localized(e,"label"))+" ",1),e.tooltip?((0,i.uX)(),(0,i.Wv)(d,{key:0,content:l.localized(e,"tooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>["select"===e.type?((0,i.uX)(),(0,i.Wv)(h,{key:0,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:e.fixed,placeholder:l.localized(e,"placeholder"),style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.options,t=>((0,i.uX)(),(0,i.Wv)(c,{key:t.value,label:l.localizedOption(t),value:t.value},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"channelName"===e.type?((0,i.uX)(),(0,i.Wv)(h,{key:1,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:!l.currentUploadChannel||0===l.currentChannelList.length,placeholder:t.$t("sysPage.channelSelectPlaceholder"),clearable:"",style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.currentChannelList,t=>((0,i.uX)(),(0,i.Wv)(c,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"boolean"===e.type?((0,i.uX)(),(0,i.Wv)(u,{key:2,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:e.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])):"textarea"===e.type?((0,i.uX)(),(0,i.Wv)(p,{key:3,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,type:"textarea",autosize:{minRows:2},resize:"vertical",disabled:e.fixed,placeholder:l.localized(e,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):((0,i.uX)(),(0,i.Wv)(p,{key:4,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:e.fixed,placeholder:l.localized(e,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"]))]),_:2},1024))),128))]),_:2},1032,["model"])]))),128)),(0,i.bF)(b,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[y,o.loading]])}var Dg=s(457),Ag={components:{FloatingSaveButton:Vp},data(){return{settings:{config:[]},loading:!0,availableChannels:{}}},computed:{isEn(){return"en"===this.$i18n.locale},groupedSettings(){const t={};return this.settings.config&&this.settings.config.forEach(e=>{const s=this.isEn?e.category_en||e.category||this.$t("sysPage.otherSettings"):e.category||this.$t("sysPage.otherSettings");t[s]||(t[s]=[]),t[s].push(e)}),t},currentUploadChannel(){const t=this.settings.config?.find(t=>"defaultUploadChannel"===t.id);return t?.value||""},currentChannelList(){return this.availableChannels[this.currentUploadChannel]||[]}},watch:{currentUploadChannel(t,e){if(t!==e){const e=this.settings.config?.find(t=>"defaultChannelName"===t.id);if(e){const s=this.availableChannels[t]||[];s.some(t=>t.name===e.value)||(e.value="")}}}},methods:{localized(t,e){return this.isEn&&t[e+"_en"]?t[e+"_en"]:t[e]||""},localizedOption(t){return this.isEn&&t.label_en?t.label_en:t.label},saveSettings(){(0,Pe.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success(this.$t("sysPage.settingsSaved")))},async fetchAvailableChannels(){try{const t=await Dg.A.get("/api/channels");t.data&&(this.availableChannels=t.data)}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,this.fetchAvailableChannels(),(0,Pe.A)("/api/manage/sysConfig/page").then(t=>t.json()).then(t=>{this.settings=t,this.settings.config&&this.settings.config.forEach(t=>{"boolean"===t.type&&("string"===typeof t.value?t.value="true"===t.value:void 0!==t.value&&null!==t.value||(t.value=t.default||!1))})}).finally(()=>{this.loading=!1})}};const $g=(0,c.A)(Ag,[["render",Mg],["__scopeId","data-v-e4c3a742"]]);var Vg=$g;const Lg={class:"others-settings"},Eg={class:"first-settings"},Ig={class:"first-title"},Ug={class:"first-title"},Og={class:"first-title"},Rg={class:"first-title"},Wg=["innerHTML"],Bg={class:"first-title"};function Ng(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=Su.qi,h=_u.xE,u=_u.US,p=wu.WK,f=Cu.P9,m=Cu.AV,b=Vp,y=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Lg,[(0,i.Lk)("div",Eg,[(0,i.Lk)("h3",Ig,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.remoteTelemetry"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.remoteTelemetryTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.telemetry,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.telemetry.enabled,"onUpdate:modelValue":e[0]||(e[0]=t=>o.settings.telemetry.enabled=t),disabled:o.settings.telemetry.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"])]),_:1},8,["model"]),(0,i.Lk)("h3",Ug,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.cloudflareApiToken"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.cloudflareApiTokenTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.cloudflareApiToken,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.zoneId")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_ZONE_ID,"onUpdate:modelValue":e[1]||(e[1]=t=>o.settings.cloudflareApiToken.CF_ZONE_ID=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.accountEmail")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_EMAIL,"onUpdate:modelValue":e[2]||(e[2]=t=>o.settings.cloudflareApiToken.CF_EMAIL=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:"API Key"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_API_KEY,"onUpdate:modelValue":e[3]||(e[3]=t=>o.settings.cloudflareApiToken.CF_API_KEY=t),disabled:o.settings.cloudflareApiToken.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Og,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.randomImageApi"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.randomImageApiTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.randomImageAPI,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.randomImageAPI.enabled,"onUpdate:modelValue":e[4]||(e[4]=t=>o.settings.randomImageAPI.enabled=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{prop:"randomImageAPI.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.directory")),1),(0,i.bF)(d,{content:t.$t("sysOthers.directoryTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.randomImageAPI.allowedDir,"onUpdate:modelValue":e[5]||(e[5]=t=>o.settings.randomImageAPI.allowedDir=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Rg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.publicBrowse"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.publicBrowseTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.publicBrowse,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.publicBrowse.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>o.settings.publicBrowse.enabled=t),disabled:o.settings.publicBrowse.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{prop:"publicBrowse.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.openDirectory")),1),(0,i.bF)(d,{placement:"right","raw-content":""},{content:(0,i.k6)(()=>[(0,i.Lk)("div",{style:{"max-width":"320px","line-height":"1.6"},innerHTML:t.$t("sysOthers.openDirectoryTooltip")},null,8,Wg)]),default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.publicBrowse.allowedDir,"onUpdate:modelValue":e[7]||(e[7]=t=>o.settings.publicBrowse.allowedDir=t),disabled:o.settings.publicBrowse.fixed,placeholder:"wallpaper,photos,album"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Bg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.webdav"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.webdavTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.webDAV,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.webDAV.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.settings.webDAV.enabled=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.username,"onUpdate:modelValue":e[9]||(e[9]=t=>o.settings.webDAV.username=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.password,"onUpdate:modelValue":e[10]||(e[10]=t=>o.settings.webDAV.password=t),disabled:o.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavUploadChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.uploadChannel,"onUpdate:modelValue":e[11]||(e[11]=t=>o.settings.webDAV.uploadChannel=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("sysOthers.webdavDefaultChannel"),clearable:""},{default:(0,i.k6)(()=>[(0,i.bF)(f,{label:"Telegram",value:"telegram"}),(0,i.bF)(f,{label:"Cloudflare R2",value:"cfr2"}),(0,i.bF)(f,{label:"S3",value:"s3"}),(0,i.bF)(f,{label:"Discord",value:"discord"}),(0,i.bF)(f,{label:"HuggingFace",value:"huggingface"}),(0,i.bF)(f,{label:"WebDAV",value:"webdav"})]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"]),o.settings.webDAV.uploadChannel&&l.webdavChannelList.length>1?((0,i.uX)(),(0,i.Wv)(h,{key:0,label:t.$t("sysOthers.webdavChannelName")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.channelName,"onUpdate:modelValue":e[12]||(e[12]=t=>o.settings.webDAV.channelName=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("uploadSettings.autoSelect"),clearable:""},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.webdavChannelList,t=>((0,i.uX)(),(0,i.Wv)(f,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.bF)(b,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[y,o.loading]])}var zg={components:{FloatingSaveButton:Vp},data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{},publicBrowse:{}},availableChannels:{},loading:!0}},computed:{webdavChannelList(){const t=this.settings.webDAV?.uploadChannel;return t&&this.availableChannels[t]||[]}},watch:{"settings.webDAV.uploadChannel"(){this.settings.webDAV&&(this.settings.webDAV.channelName="")}},methods:{saveSettings(){(0,Pe.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success(this.$t("sysOthers.settingsSaved")))},async fetchAvailableChannels(){try{const t=await(0,Pe.A)("/api/channels");t.ok&&(this.availableChannels=await t.json())}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1}),this.fetchAvailableChannels()}};const jg=(0,c.A)(zg,[["render",Ng],["__scopeId","data-v-67b1b002"]]);var qg=jg,Hg=s(48903),Xg={name:"SystemConfig",mixins:[Hg.A],data(){return{activeIndex:"status",isSidebarCollapse:!1}},watch:{"$route.hash":{immediate:!0,handler(t){this.activeIndex=t.replace("#",""),window.scrollTo(0,0)}},activeIndex(t){const e=`#${t}`;this.$router.push({hash:e})}},components:{DashboardTabs:f.A,SysConfigTabs:u,SysCogStatus:xu,SysCogUpload:Tp,SysCogSecurity:Fg,SysCogPage:Vg,SysCogOthers:qg},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return xu;case"upload":return Tp;case"security":return Fg;case"page":return Vg;case"others":return qg;default:return xu}}},methods:{handleLogout(){const t="/api/auth/logout";fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:"admin"})}).finally(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")})},setDefaultHash(){const t="#status";window.location.hash=t,this.activeIndex=t.replace("#","")}},mounted(){this.initializeBackground("adminBkImg",".container",!1,!0),window.location.hash||this.setDefaultHash()}};const Kg=(0,c.A)(Xg,[["render",x],["__scopeId","data-v-7607b77d"]]);var Qg=Kg},34396:function(t,e,s){s(85331),s(4885)},49187:function(t,e,s){s(85331),s(38736)},50333:function(t,e,s){s(85331),s(29092)},53676:function(t,e,s){s.d(e,{A:function(){return h}});var i=s(56768);const n={key:0,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},a={key:1,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},o={key:2,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"};function l(t,e,s,l,r,d){const c=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("span",(0,i.v6)(t.$attrs,{class:"channel-icon-wrapper"}),["telegram"===s.type?((0,i.uX)(),(0,i.CE)("svg",n,[...e[0]||(e[0]=[(0,i.Lk)("path",{d:"M417.28 795.733333 429.226667 615.253333 756.906667 320C771.413333 306.773333 753.92 300.373333 734.72 311.893333L330.24 567.466667 155.306667 512C117.76 501.333333 117.333333 475.306667 163.84 456.533333L845.226667 193.706667C876.373333 179.626667 906.24 201.386667 894.293333 249.173333L778.24 795.733333C770.133333 834.56 746.666667 843.946667 714.24 826.026667L537.6 695.466667 452.693333 777.813333C442.88 787.626667 434.773333 795.733333 417.28 795.733333Z"},null,-1)])])):"huggingface"===s.type?((0,i.uX)(),(0,i.CE)("svg",a,[...e[1]||(e[1]=[(0,i.Fv)('',9)])])):"webdav"===s.type?((0,i.uX)(),(0,i.CE)("svg",o,[...e[2]||(e[2]=[(0,i.Lk)("path",{d:"M446.293333 810.666667C384 898.986667 262.4 921.173333 174.506667 859.733333c-87.466667-61.44-107.946667-183.893333-46.506667-273.066666a195.626667 195.626667 0 0 1 152.746667-84.48l2.133333 61.013333c-38.826667 2.986667-76.373333 23.04-100.693333 58.026667-42.666667 61.44-29.44 144.213333 29.013333 185.6 58.88 40.96 141.226667 25.173333 183.893333-35.84 13.226667-19.2 20.906667-40.106667 23.893334-61.44v-43.093334l238.08-1.706666 2.986666-4.693334c22.613333-39.253333 71.68-52.906667 110.08-30.72a81.066667 81.066667 0 0 1 29.013334 110.933334c-22.613333 38.826667-72.106667 52.48-110.506667 30.293333-17.493333-9.813333-29.866667-25.6-35.413333-43.52l-173.653334 0.853333a211.626667 211.626667 0 0 1-33.28 82.773334m310.613334-304.64c107.946667 13.226667 184.746667 110.08 171.52 216.32-13.226667 106.666667-111.36 182.186667-219.306667 168.96a197.504 197.504 0 0 1-146.346667-94.293334l52.906667-30.72a137.386667 137.386667 0 0 0 98.986667 61.866667c74.666667 8.96 140.8-41.813333 149.76-113.066667 8.96-71.253333-43.946667-136.533333-117.76-145.493333-23.04-2.56-45.226667 0.426667-65.28 7.68l-36.266667 18.773333-110.08-203.52h-9.386667a81.322667 81.322667 0 0 1-78.933333-83.2c1.28-44.373333 39.68-78.933333 84.48-77.226666 44.8 2.56 80.213333 38.826667 78.933333 83.2-0.853333 18.773333-8.106667 35.84-19.626666 49.066666l81.066666 149.76c26.453333-8.533333 55.466667-11.52 85.333334-8.106666M352 389.973333c-42.666667-100.266667 2.56-215.04 101.12-256.853333 98.986667-41.813333 213.333333 5.546667 256 105.813333 25.173333 58.453333 20.053333 122.453333-8.533333 173.653334l-52.906667-30.72c17.92-34.56 20.906667-76.8 3.84-116.48-29.013333-68.266667-106.24-101.12-172.373333-73.386667-66.56 28.16-96.426667 106.666667-67.413334 174.933333 11.946667 28.16 32 49.92 56.32 64.426667l16.64 8.96-130.986666 212.906667c1.28 2.133333 2.986667 4.693333 4.266666 8.106666 20.906667 38.826667 6.4 87.893333-32.853333 108.8-38.826667 20.906667-87.893333 5.546667-109.226667-34.56-20.906667-39.68-6.4-88.746667 32.853334-109.653333 16.64-8.96 34.986667-11.093333 52.48-7.253333l98.56-160.853334c-20.053333-18.346667-37.12-41.386667-47.786667-67.84z"},null,-1)])])):((0,i.uX)(),(0,i.Wv)(c,{key:3,icon:d.fontAwesomeIcon},null,8,["icon"]))],16)}var r={name:"ChannelIcon",inheritAttrs:!1,props:{type:{type:String,required:!0}},computed:{fontAwesomeIcon(){const t={cfr2:["fab","cloudflare"],s3:["fab","aws"],discord:["fab","discord"]};return t[this.type]||"server"}}},d=s(71241);const c=(0,d.A)(r,[["render",l],["__scopeId","data-v-33933ada"]]);var h=c},63003:function(t,e,s){s(85331)},64752:function(t,e,s){s(85331),s(38736),s(18785)},70415:function(t,e,s){s(85331),s(73565)},73565:function(t,e,s){s(85331)},91114:function(t,e,s){function i(t){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i(t)}function n(t,e){if("object"!=i(t)||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var n=s.call(t,e||"default");if("object"!=i(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function a(t){var e=n(t,"string");return"symbol"==i(e)?e:e+""}function o(t,e,s){return(e=a(e))in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}s.d(e,{A:function(){return o}})},98642:function(t,e,s){s(85331)}}]); -//# sourceMappingURL=529.e05f38bd.js.map \ No newline at end of file +//# sourceMappingURL=529.287c329f.js.map \ No newline at end of file diff --git a/frontend-dist/js/529.287c329f.js.gz b/frontend-dist/js/529.287c329f.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..d3e53a1307aea9a4c1a5594e0b2ae600fe8592ef GIT binary patch literal 106482 zcmV(+K;6F|iwFP!000023e>%Md)v0MIQ;+p6gF?FLs}3m%9a;8jNYtm+H8%}q=~AV z1Cfw~h9Xr0vaL$`?(Z`LfCMGkNzOUHt$m(Y#E!vWFqjR_T(CVM3m!}7!WAqX^_^=r zoYDBp@;q}T zVMKUK;huGmjskB@jyfm79offcXWcupyJzjrt=UAlM`x!;C-9>a9KoNn?)hokTa%!B z5}e#s@%%J6KZW51-Ol-TLBDXBM}(iaj4Ts2qVrT%rMzXqDrkMqp&F4Q2g%=~xH^$7la z{M2)ugkL#C_vp4s=0866+`c1t!iKbH#d#(v&sgD*rNc!l&eN361WTMy_*^{JpX-4~ z3N{K&J%Hr2DEvE)|_rlx*9hiXw2=>}kydZ9uY zJ&64Y&61Q|vXsTr)rHEr4WD`Lge+kRU<7fV5qn{AY1V3DXQc1o_drho;UZ=5X>>VxSa>9xVLizai7O-g5#9+N9aXy{RB}>9(Nr7-dDhhnfvn0Rv zd6uyPv+hTyCuhBGJM5mUiA{Z~Im=(@bdMaJZMKTT(Lfa=l)Y zYbxVOxODFE;4JggJfCJ|HHjxI{_-*(a)gCCLS(cXfEQnBUV3X%BZG41h^$Sj z>eOdg4nkEe*hrWIl%TkH9CQ{FVjH1c#H7@JRYd`(AJ%eSMG# zw|C(ARy_C~{QpwUI;)oy*)I($7aD!6Z&k4?2TE#zmf{Dz#pb zZFWbKWJh0Cvt-A}1=+^KCrttI>PE+`C z)@`499vMNlW-X6SPTFnHjAL5zYZb4wCc`py!f3)2BgHZ}=@y$=6gfMa$-B`^9wj+R z&E_bgk^hh+ce8pVj>i7mQ!~(&d!kxoOe!uGCYPfyk$b-aW^=sXv1Z>)dAkE zf@WjZg0nwMC{T%KWxl|}lO?K*vnKCu$!hUzHkZIyy@~n`EjVqZbjVU?Kwj?ZO|Tg) zsLY|eCz~}MR74D@o>=@+(n7-S zw3kRXgjW#CjrC=9V@-X;!b^jM zaAPI^0z^A%VjUZzPqXAd15cJEJE3``Iz9RiK=a8aG@oY4E?5qBT;LztSZS{B>iSxK zZf>WHUTsZtRSH&;j3IMOsk~tI%A@3dh#6*4G0hw}Cw^0=3ep1kpCSFx3 zmL*$dU`s*?p6Nq4Onok%XK&%d#loH~0c3zK>TrHS7p8zMtxM?Q^$17pksu(ySqm}n z*6I{{8=ajTvu<_PeSjOZmQN@_mMcAfMiZQa+aXTd@z!PWM^*8E-djq4%;d9qnto)o zaJ_Zw-tvQsi3)waW?&}**#q&yKdbg$L3@1UIs*H4_M-?EFCXohJNO=8g>?}J^5uH| z6hs{E;s3aQB+KKq*KZvT;AcQO8z1)$J-pMi9qoze)qFZ+1s-A^;ninn;I#shRS8D} zkI*P%*Lye%K{(0Gp}$A#aM+I`v070J4*OBWb&3MQeiUUr7)j_-UoiPoJ}-pZCiuTc zs0H%Bfg35;s2srt>`4vmj08%U`KJ+PLLEe{$A%v?0?q2^(^ATZML`#(j1q4%AQJ-t ziwOHh#A2P81SF7v!UH4BH1ZWQS_3G#W3F%^o27IC^9VO*rSouJp*=-XZM4vFh}lx` zyW$_pFP%fLDF-PZe4^~NlJjjJR~vFWxDqCtK&+o~4jjQX>ixerRZ_VxBA^KUBmtl-~N?vhH!8?1?auI|{Z?$!!y zK^~YT_I(vv`UqHnXir3sTvNNGqDXiAQISvGWy-R#oP@`nHE|{3Ui4sT#F}NV3>tjL zr_A-5{NOFn=SOZyl#v~vq&gJCtRlape#)yXO`9m5-kyx+2O2}@LPd=Tp zgadWlZ)-7iQA()AB8#6D`Sc}JaHY4l#q67zOLO48a%Io&w+8?-^*b1NN=jZ)z=-u8 zxy%C+SLMKkMf4uIqDr@~hV>S#e7xw`t*AVUc1HVwK0tZIRx5GA8;va-i1_9KwFy*J zLPOnKlWktV!p*ksDaE3tcu4#BuOG>29M&+pCzh`x`y=`gT{CGzj}!s5sch?|yr*F-Tz9 zwuV`iD@R(Dt7EVh`{&asmx||RrEbZ-TUV?8%H8M=XrP@4AXfUL)vDw-OI8zDXTl@c zs9>sbKjOW~4qDgWy@xDB$*LmsO9-mQ(ZSw(3MDpf)= zj;N!vZa*dGpf%?126P&Y8e|#``Cz-m{aP8Iw|Xu9Ds?%3+Pa+Ax9DCjr@7Rf4l7qs@X!CSEIAipi&&h0RcgRfevZXR^psSf0gZ9!f6_;@xZw zRDr5K))IVIGD6m>ZG>TLI+F{;1*WT5DbAXF))fL%A>|p<&0ZIDHp7X1*#$0VO|ExC z$61rdw~X6algm5C2zrps5zRQW=4q6w@2U=}0@aA$Z1vAF$qH>kM_yXlD#IYuldT*j zJ6w~8n@y%{46>s&xmV?=w6f0otsK+Oi>;g)D`Ewqr?-In`K{po?RId#z8l72JQ_3htk71^4fFfcuv!PpRK+O7ZJvrdf=STN&kQ{J34G zT#lbNmt$7s675P^y5KkH<{t zm7Z)?*T?{;jIQ1x^<`B;Y$!3SDi=)1ykPcev)TKIr=Xx3w@|rxpbAXq-2l#B~04s6%JN7T=hDj3r;$L=19R2QpnvhBKyZ`c6GLL>D zv*_CY@(Ij+%K9&O22!M{mGmT^k0%*gpbVog{uLt&Wp;BDefB^7MIJ|2{zF>t8;gm~T zkvhtYDOJKa8)zvNQZKip^LVePu@jOLNt`REX`!y3^{&G6 zucPIA&aRbdLYj{&?WECm(sVcE6e9*iaJ_BoVKl_MhpsHs-@zTk29mbI ztKW`{3V0|%L(GdfWgsT4>GHRhK}+DYc-`?Vi#>0A3aGK`huiFMzvo4LaYL*!!jDIZh`Rvhxe51*WT?fowz*07J#FVCKX$7GmIfg;szm>_(B{;<0Mv-D1WJT5noOZuR&|F$e#C zuh>wnS9`f@DplLS&DwY{zS*t?2E2R2<1egu&jlZ*?AE2OjBl!?-l`3Yjix?|}Jj0KyU93Yf|Q zs}2~f1pq0nwTuzgyIK*IX<3HW7SvRBEYsZWQc9jf9E7Q}z0+?b=|k_rbWMAAaC)C@ zsEo)G*r+hIH{#=oQXW&1&+sl1ran+#On3**`l^qc7X%%=OM8hzTtinqq(VFf>tk!og-`IG5#_ygi)9lJwhA6uln)$zn9w z5jECEHw6ug)oQu+e5LrjYfUfz7lQPzrF^yx+IRL)rX_mmS?xlt_#4q`6OeDVJAe6~ zWYnL?Z@Dp`iNWoh`a}6W_HDP}0nyID-{5FU>hdOZEv>Pr+DxxrEY8z>+hukMmuoo8 zGw_TUGl|Rh7|OZ=?JSga={APlvtYMrN2yA@uR(WnQFc~&v3WCiQ;L{eNp`Qd=QW)l z9EHi2>D$h=db*8J&v$Mt6a)NAbOLIspWi|%e)|fk0Mo4Rq7$$G57CLY+mQXRn@+%# z{*y%F(RR#Nk^r|+i@zyF7+!}fChvW-i>ZYO=*xyNLVdbjW0W9pXwl5&tX(=2AUk%}KB z>4R6&n<9^y5Ih^-MF)P~9`+}>jS7<4AVp#S6DHz<<96G*3e2kVlFEsXIO691tQ^=I zEt&T#4S}@|)s<#QmQ{)HD=iSP7S6x0mSU2_phFxn$*+|zDBRyx91PL_siY*9x?+dC zjRACb3_$ylJ!tptvWe&Hn@$n9FFJcQfz9n*Zf}aFvj-p~J8L1%-!@DnHcD4u2!a~R z;a5k4?e5&519EZyhU=4k;Ea~eRD=50Hms%D`Mrqi0h^;^$CvJ!4*2SsbcTEto<=^VnsK8TDm)!-= zoNZCLbSDO|n>eLY96(DJ9D{@Gl+hO3Ehe`t8jj9hF|wUoDFW}BMto-vRU13eVtWpg z4O*s}fem-X3UC_k?R1_^G=b2LG_!(FX|cE!rwS&EMY*isfj*5-z4(2n5u>A@PgTT(G+l{3~qq+{WGoI3#a4rANIPFy3A+a=Api^ z&LAD)**MHi>lok0_|4Z@j~X6e;pbNLqf(76vpt>ty+j5~qrY}^R>SPw0w2%`d$$2k z`IT?2mIeb@0#+{eyM6F0$9wWEiv}F^eDhh3L4{}I-)1{jsv7G5&UMm;7XRWxSxU0nSz_Fe)d~V@=%{dJ@bkIK zq;bqSl& zWK#2b05Hq2e9ZndI*EvjLMCfi74XGIfRKEI?df}`#fnn zJ#a6IXfoxQLq=SJs{RW2<_&8j^y7hv<2XXrKT#7u(Gypj3#Wr6Tr*J5jtqh(O`eCI zz3+L#^8e7(aUrjuLA{j0zXpKalSW@?xI(0PK0~+3xy%)5xbk| zncjVQE)iDSf@zCA*jQT{@trNvqR6jX^V#7Z?ykg&AiLXDv^1-O=K=_Au`t5e2vJ|mT?!6dG;+t zW@m@rKxB3&K@1zBaF%D|0Y=vf&VoRN%w2cYDS?A~!f1I8icQCjXxL~PB zTxZ=Q6)x-SR6A)MpLVfux7|@?f|K(zRqNA83DUxx?#|Fw6p z_y2vF7hh6#i0YTUtG0jSA4B>?%9#ic564_i=0kA2JG4vwcfn{fWl++My}eGmbG-NS z{L2@*_shKa!cq!3+JG_Hn`h`$G+}!$pTFCC!DE&QsC)QdrE&8^+w)E~{qCx*!-m{r zQK@@EN&l4ID3Sk^L-1kjo%<6b9WjdCj7} z@B22@2z>A`QTFZ;n@K*qI{&R{@>wUnd5fY4AiVA75U11Pf&Pa$ARqj9d{ zrnuOFY5D&B<5k(_I5drw$;a3g{_I-GC)nRP_J;|lR_2-R*z*X}i14REa0o?uztipZ z05qZFRKWVH0#@`2e)rz8@Iw{Yr04v%(^SB3D$q9-;G2IU+zInS6@g3l_!El`|Hqw( zl=fDW>)~o5uDn0oKg5CCZ#8}PM>1%7ZZAyO*z5KG5MBWCgZe~G(mH-cBm*GE6d3eGiyIqfP_Xz$8 z?0$aT>Idf?5WnkPq)hH*7o)szSyMa+8Vxs#fhr4CkH$d+;scemG=gwHE^7(zkT+d+U-VAGwihy$E?N@OJE1FE z41OI~?fuB?Xb_!l7q@D0$S~mW_z)IJ`olv;XjH;W^-l80T2)L*BbPRF@34aaz@YwR z45R%h${P(gj%X_O+X72Bd zsI;n>6x+pq-7dy<6#Henm=M)@;>sV6PTI{QK-Qy^c2$TAd#!$AKD%MDD;2g0!eRMp zv8XOUjHig7%Oj93^xiYK38`NA!u;~eh|WSlQU^m(HNj97Pre*}ALDPcm?Cl}*F&J- z0MninZU!DpUg%83Rhi7nSxESN>X6?;M}VxrArC``F^9Yhoji5OW$1uu z&7;sMs6!ry4ip+Y%=8#{&Y~3M0!e!)(aL7-g!>B`^tB%GF`8jm1C*c1m zqUCEIv)@4o-5#BdMh>Bwpw~$?Itj!MR2wHjER8 z;9y4Z_lmz`GIY*pXUIAZ8NRuO`&G9?JJcb=d66!z^E?3{4A0I^9TL-*5^8rx=Zv-; z@(V5G$GOl0Z9_^PzXPjpC+VD=2h1Vyb0HYgRxbC&%Yqkm|;lnc(Rc zoc$ThCocF@prRuVj*lQ=K{ErK8>o6VbjXcLJsaZ3_}$CwO%gi8v$K;nBz%C&E{c>-V`I_&)Xt;KYWevq1NZ7AaLA2bxbx$7J2`Sl@^ChLix3Qs&(*j1vVf+C2(*MxvE`F< z_#eNq>GC^I#%fUlcHV{>BmQw%fXK)hcHlpUjMB^38fQl%I%+#)lz$ZR!^13eI-Rp2 zmYM$|IO1^|TN%^0VtARuO2YpR8BcN{bt`9TJB;5UY9^-uFSCpZrQJ^3Avo%@HvI1p z1v!N4_~Ww|*P%m`(Fm3VCu53D@{BEBUhD0G2~tDn|A?e#^IGZ-i-fTI8HB(-mET+R@Z=;;V4&}zTL9yGwfTm$+lA@ApUsQetI#<=I&CLIhrHJlJc@@$r-4J> z<9<6Go}9tC@m|b|w__|YqUX@;ueckN05I+r$P6u>yRl=G9d7{QO<+&)3!sV zZ)NFc^q2(>ndWg!#aopy>^dZ)SM<-^Y^H?4Q!p95LL7F;y95-V zp)*QGT>uXdAcfrk4fskP4MXQ-c*Z(M4k@V-?Lt0&e#9+xtP&7F2|aBmCk~mtW@e8u z#?Anikc0?yHX5Fv;WvPRju-7P7;UA^6Qs{LL-Lwpw|%Q3-I_jWN}P& z;>pR;5#XMhp+b;1VlgaoIJ$tS0$F{tc#U*5I5~#}5Hv|%sl)AT2=Uwn6NZO{O$r=1b>#%(4p;ar<1^Edc}&+iQDkML#&;| zh7LizJE2|N`+8Tk&)TqI^`_EaBFnEeiKPy)5Oj1p0<&SYIGcIYj1DDs!ZON5`iQK{Ri(cG7l;K1vun>%g>r{z(EZCv14+ zkdodbA%ZV4&A({Y14y0O@URRot`!4OKsNdqo|^udEO`~iX%I#?S7zyRr!dy+dqX8nXj=27iRM{ z^vV#S1zfVn!sShI;HrEEbz2-<1jafyvvbFu*UBJwsB@{EJM_F3gD5VdI1vZrYq74STb%fPvaNH3ICl^an>K9@zhWqlffUI2n_gJy_DIP8ti!DU;QWIjb%ZaL;F3-6r* zCE4gz^iaBOuZKh-L}|?$6@Gi4g+ifX9z*0~C5@1KJQEUZmh;ixXHiDatm0ehNac!{ zTsS$x62&V$5h2_{6WAOQ8x2=PD0N@0kS4EII8YrD@pCaAnkThBU(u8&(f+sqE^t$LpN`x-k}>b^Mllb2=<4ai!2IS1rdIMq_{W`e$mVhxDSF) zBK&cgJjUd)N* zQwvN)sy|HQ)H+V{%nHN}VQW9@@&MH}O=lBopAn`dy#>o=7%fyR;}ZEz$&xGZDTv2a zgxB@BU<(0mBAc)6sqsY*nd=`NNQB_|fdr5R!2wX`N}z}FNkO_DG1X{3qkql6X&6mC zj0|1qc8$UArqk`Vq+cNARKLeaJk{@^Y6>NQEVF<$v?1Ryp-tByGrX%@%M=t;&I?@J z-9>|{N%r-!WwS*t>jkqKhUijjqkTqCKL1a#cXjM{{lHc{UteDld<|Gt0EJ(z6peu2 z)lqP1gv+%9s?pdyuQYkzZqh8`cewA8c{?!g@~i)bsj$R5BAvDNaJT2MhG+zvDEf~A7( zse*8aqSw)-p>XD0{_|;8hUxH8&ehJdbKjM*{?2s zW-A4FHx^MFPi1}e75Di?vnc=+StR>nK;UL21|;*rUPv&B-WdB)L~9AFRi-SBFh{+8 zUG`)4u4OG^w!H#;xoDtHd@3+Zw*u92W4p%%1L_I8ar5qv@w>}AJT7n4#yMVOIIGNK zeYn&QBIsWIEYCAmUC=8t6>F=uf+&h005$IM&z~LQl)GI$?P&N@XQ1Z)dQ{u@zgf5k z3-sKYd8tBVeF+d3eL1*zCfv+xG@c2UdcD_58OXg5iogWyM`&JeU9~O+Xl_~9XK>Hu zrRZbi?mw%6{6a(+v!Ga+ zU`fxjIoqVrN-*Pb=GbR2jX zUXmO9p5b29q3W3*s2e7+8P{OPTOkMKA)mXBZkM@|yn^6WX6(u44 z;}6H{@rajaTr2RJj_-u7@Mm)|fm!h&-%BUrnj! z92oHbgpv#Eu(MvSBEPH5U1tdSr98OssPVxM5ossOLH((gUYUN;rzj_L|sN6_+Xue9<6a6TZJmSrB@}r142OkCbSwugI=0`z3 znFqA|H?J?BzkB}v>F4LKo;`o{{M|<)dGt{n24`);@K=Wj{Ci9|$7T+XNXAv$X+93x zgz7JlL{!ts`G$c8mZ8A>wwQO{La~(FC}ssDkluxibUX4eU`If=Wce^dDQpU~yk(T; zaNI(3C|{9>0!ZBbDCh+tzaMpa9r)Ajb;F=ExyTNzp%k^D^g#lsruJ7Mjr5Ug$#HPO z?+X+e%O7|YMQxOTnEj-G$wO{oFj)PySHf#FbT(Km`64f*YpmE>%=2gY%&mz<5^kY} zSWJg`T4xL`5k|#JRgCGrdx@2NnZGIcl*606dpyIMh97nGH-^Q2J;G0Gzs1%N_HjIo z#y%IX=qtCzquKnZU4O#sJH5Wl20$%#AI2-1?16n3n3uRzitvs29?ht%1B0W4UiSF_ zcoQ{1ij)|{ag|{eeu5zs1BqQFy2DRGJ!|MQZj+h=S8Wfgz<8rTaMnKjXj>tTxG|J@ zXP-DQ85RXZMD2^~3HSimP&r`UAy63Uv4bdR6VYt$pwH6{xHA8y1t$uRn7?RAe?c+} zg~fqr@&m3ASsR{FNwbd2iKw2%yWjG=2Oq(@i8iAjg-4d?ZV%5gadrO)Gg~mqYX@-E zUAaTes5)NLN>k(O*sxyIngUYM{8@NE{3u!82rg?G~NS6;#cM?FvF=E;GNqhQVY)rxiT1TDJlQRPUo>~R3%lSnCYn@cs_rOANBD@xd2URTe zCc2$4w#~!x#m&1DA5D#SrFdi)*E5CZ&|6Z%I*sVY5^<+Zw8QwFL{L=28xC63y(bG zm7Tk3xGeA>5|#+!U7eQHDTtaJzn@`$00!P{nkhd3SoX74FnA!mtko*5NFTIUtL(mM zq-S^zWERcs`3;Zy4$yqK9^^9zBH!?lgugQ=?GR_4sU+(~>z8^vNdL2z=k%(de#(Vp z87njw$Gp(Q%2LdY;YeLc98(FONY6%mJjXZ^@ZcH47mw9fK(5r2Xl2`QQCP1%@`i)= z$Wt0mTvo1_h@8)PhR(LlzkpkVQx_KSwsEj;>KkfZZeJs~mwf%!f5*1w_P`Oj@U@Voi}RG?*D$Z}l<565r#IY16$^ z8g$LGB){&Jg{?!+_12-v_6zpcoC*0b<0@Lqvw}|9+Li*o=ayswxGWx(Eb(61y6^iL zkfn_9)yn13ew*Cm>T;!eA}Dp__&}D%5H$YvY^B``yRTh+l;+KQtmmS<92}qWxpdKn zK&aT}@D13@J#aa<&=FWYL*SlrygsP6g#m0m2cNVC`_4ossAr$elO_&%Zc#3~CbKGu z5DnZ9JLI<-39U9r*^z4gqGrEdKA@sn(`|*!x_i9lTb>0Q;u1n5et{RC&%m#;L>FE1 zOVAdCIk{3lQt}xY!Xzx#kt9hZjW`ITd-|uZg8}xoQhe~Z`;pE>h)#ELl>79C3$mQ@ zES!)jy$R=J%Cjd5JHr_ynUC>0$|0)UZ-Nz%fQu3?N{nX6d|BMzC3g!FlZof2IT1Y` zUUHX_m|*QU{D!5^@&ZHqx)Toyc_gWH5k+~C&YFSe7YstSGuQJ+JX0}Afc)%(u)Ck) z@WB{7YuO57>8-QqGe>&>-U_@mAGu>s%h1bmI8F_LIk?yP6W$Dn=(X<{@!Ts*;_Q=( zNSKk!R`8Y4%BDS9=B;Uj{76Q)*UHu?wxkhnW%^pbMBEKCg0I1VHA5wzsp!=5Mj;6! z3-v>g&!}y}ILspCfHGOMyn)qLEcy*Bx#G$fkSZ{B0jUB~*GQ9jB`LHUj51Ox257{6 zXcsT-Q=Y9>@J(;jH@$)Hg~}Huf1&cRBeSXMns;>1pqc=DKmyQKN(~STO7h6s->s7O z?U0~-;L27Mc;11&JZCQ6j1PVkhr%PT_=e}6s@4j?8E$8lW1rxDvQ6Q=t`@I*;c=9_!|- z4$4$DNyusjRWDX{y_*9WLO)QeqiU6d`*jWoW;&|PMWwggs))AiIS4*YI?*K8Gn{yNnh^En7Ba3B56eKQ42g~ct`L?>DE zI`z9J2~{|Z^zNT_Ap<^jR>$v{yz`^eZfH_Zs^qid zqtmVpqjJ<{N%h#xgkUuhCAa3J_Ds|7TFl*_M*0N$(QQGYtzw3^?Yr$;Rl{? z*)r(^`FFT=-#ElsIK&y|MZyYv-NGRbjCC&H6!Fu{<&LslQbXA=(tZq}diT59gupH+xp{DezOo|y=yjy7h#2G>uM zGRp85c37XS5-X&6AwnH_OoMTzuKt{f@D~o@K0xbG7Sc8jcB$X_`nCy)+KjA;Rs%xY zXl@Eal(H)pF3XbPvRsDac6$v^24XnLoh2Y2q7z%WA}nW#OXOI#*zii8dV8aYNU+w-rOc;co50l)hHf_1j~s;!FX^n>1V8I*Hj9|0GZv9-{(SlRm9I=a z_z1j)wdV3id_~@^q|WM=4=q2>Wa=vg)iVrOf^Cx@InD#!i-{$}{In@({h6a6Ku0@4 zYf*J`%c3R9mu%hPr8bOloTfwsWd)qLrIHwVBYnGY+D<9-QEzIaF_pQxrWjxOLfel- z5^g5O?BGGLq2en2<3S|`p0+*?%_CN#C`GR(*Sm1p{eZQOS1a})U_sYI7kEd+KzR9x z#}0_NnF{VFeDWs6ts$8W>6*e-V1+Jc3KhN#U(YnvZG0)D*+a^QmAqN`bE_m^SiPXl z$88l?ncq>tJoB}4Bo)tMwojb_tFv7D(npz@HqsfgQC=_y)avyNIs(9hRjOG!!;hhy zwZJc%y90JkP2vd^6H^#q_-HFNF~8S4Ca}S9sY&fBXclO>$yIJFuIaTlk*%Tcs8jMD zG}~$Km+wrjXj__<&Ie@>kG;y0gjv>A8`fxI(;BTj#YLYFz`99UEWw{$W7uV|R%CUC zW!n;#fmxp(G#n@9%W)uJmv(+hvbysNDhlB&EqTkx+!i2p;|de0O{pCS{lIf{u?qcf zD-x^B|2{c6(J5MpFTfL1C9o?VGn7leg`uFkm}Zw|DV0EZfd6~4QO?yqH7vzw%~gZ! z3P1bGGHRM%!7jw#$kS@$DB{R`9#51WMSoz~focUFd5)GNI_2pibpG)ZORt#ZG2MH` z=IkG2uS$WBhXtqUKggb-`0jhbM>_m`(9zMDoeU^w>fk~46GP59@H^yM{R9lqDJWLKJjb@FWXXcgy=PEV}xd4v!4(YsNT^j7)aDg0m8RbBrLg?B|0}U5LUA%z>{9F11#EP5NvQE^Xa>o50lS9y#FR%pwYuP!AYw zh&Q|w!95$C6Sc#^ng|6W-9jYs(yEoJz=B#ze2EhRl`inFafTPfBy*Q{pQiYH`^Led zNQgRfaBGD2>1Lt5vnJM8SnFz2kg{Hr{;!;TH*)Z<`s59&2#Dyn}gBINY| z>qE!`g3{A};hCV&alEE0eML)p=0};Onrk|l4w^*=!ad|{*7w=hS8LmehFaAnh%<)9ff6zA-KE|{d z(lPL|5LSLGVYTWHE;!QYedTpoHnh6|upCe%ouLGXUNJa7bdoYrkBs^+t$P4q3^g(# zb3E@0a9g^cUK9{7ZsblP(Juz1bW577R@zxZE~JTU?;2PCSwwYzhaFUMKQI$i zF$~n4W;iEpMw0buzZeWIsIf+AlUd22%|OuhqQ8L$$V zgvJ|h;l%{tSER;b=}&Oq=t>HNmWXU>A@R`KGr+uACXU;?34%zF3XRO7Fn^ZwOkTn^ zCgX_tg}&^O5qzN388L7gx#QKU?Hx!oteEW*&dE?sDR&G?9noJEEn1|neG#X~>=*PJJ91~FHB(?c?7&Y2*~1Resbp3H z8*$!7T423hC3PBktJUa!)b_lkdVd_e`$3TKhRTWSk(pOMBa!u_&(f67gpOW#*dZh2 zM}HJ(iBrUwK2j+}suz4zLl?>eA*O;k<&#li9A&-iuoI4m^no{gm%E}_s!^xjK}>k1 zbe(z!Bacj*5$E9S&a?j|E!0sIqe9hNv@68YWWcf=pYCms!m@;Sh8ZQ^~YSpAg=}DrDNU z%D3i(H?e#Z$~QlXuT0$u0d2Q#88VCC5>k07e0AaLvy1(rKNfkGD? zx-}h4{NFs8a_Hs8*_xi7j6Hl{%>J((C_#{t{|CSbSx%U1#J_u3R`>Z<_c?ZNH;rPT zu&SgEfjaft0u8TGwUOQ6eh}_J=Cy>kl~X*dEoJP3HdqF#r$JrYc5|^IC)qm_9+Q^RvG=eKyA zS{4Q{t|dU6+Q-7JI5!WNQOyxqsYHuXFh&a?Hu8K?DPUnfu&yX8$0FrdWaXG*kEmb( ztg@s@i0b*)OdoGzPlkHdFHBB~d_IOti;uA!u-?*GLDp}397r5%QJ=fx3o({a$FUR3%abFsxM?dE+r(@J=P8w4YO!~M{N z7Px3O3onUsxc5@u$lx0d1W1+Okrb{ZcCU!B_IlNFaVyov4tHLA;p&;?vLJRQ2p9_Y zN|kNkxI35NmVm?rX2_e`&DG8PN5YCK!X)x)E>);JqIWD%tJBl!_1`+&S8fa z>U-N62uFs>a4@@5=0u=f(28+LM3W-t#<6XcUTn3|cQk6CDn}s^Drn6nC_hw|9sT5K zW*c+j_$t3Bq|K2c*iFsQm83dC3f?q~o$ZJH+^~ya-;Y5@*=iMMNMKbkx#*>l^Aa5y z;9^_5C(uNrj1($J(Dsa3l&X(s9aDe33l1LKj??4@3tvL`4_u)Hgz+hSAsd zU@UuBaSyaFe8gE2?m7Qx^5#FBe}IFY5=U0A6BvEi%StRwn2}H0nyn|9i)E@L!fe6{ zY6sMh39TOEMiGY9u1%F|Qyc*Uwlbx|r#_^jN#?>c9#)W)Y)60|l1BR~kc;wAD*ZSi zMh=8^!B8X^YDZ04zm-vbu-y@ZpiCa+u$R(kKk%yBqS3g7m?f$}U;JRs&%tKNyp*%S z^1-PI&TH|6f#Lv*S_0SCb%857J8^V&%D^LrMh}I{h?}*zch~`rP3!YSqhW0KWz(1l zVQt{}TQ!?6Xf20WF*d*RHmk=@sp)O%>TK!NA|`#nno-|z28w%$kaqOjgNoG@tChUi z=}M^734*##se*C975c(3Kg)g@vOtMG-_h|PbkvX>^0@>hD5gG(IG-^QO7gkLb9t%0 zD5=ytoO~WL`HmK222M&w*A|NC!H3N43j&Yq4hX|YIu$yy>%BKcezS0Mq8&3!Usn5G zs>SOV4$1uXKLhP89XR`K3`hW)wXrs0G`0Uy&%6Nm7=?=)0oy$f3tDkyo-n0`GOB)E z`z;%RGQ_{Vu&=>`HyzdN8xyVQF;3XH5OEJs)b>wddt=lUqyR*Wuf90>@7XS!Jcis+~* zAtRr~e2D9derOU9MZ3|G&q)bE5x#=vxd-!jY$`_&tWGP0%2c{vYIEU+hh=tPRrbAD zC2bt4%SQfEqX8`X$xxHKaLBI9e0#b+O;cFMo;oD*egZvmbNY!Y#>TiaNAtnYWiX{E-F85 z-7)ysmS5zv26_n60sVU&Nkh`hTw=Fvb^#O!*ECtE}oYKf5%u29CNtw zT>d*NpHb^c<;fp1@@JWfd}X8I(1gyw0z?~fxmug44~mTi164QNlS>n&vZSRa|0}bs zdA}*L7K}*6J}Tp?fxC%k5sk_W*xeu|w)*;~jYC&c2wqW$%%TvqP7-oh92NSETM;XM z7jEh`8t|fewHgRJH;sOWm>j91?&MOHOf~<21%5FFpnkbzo=5(~4Ash`%uPX7&}dMQ z4CG+WT}|ruO-g8{l~vQC*0gd%_|kQR;SEx?nLH1~GS^6~^s}vRSv)TU#v@{q#S;0- zrWH{j_543`p1Drzf#Wsd-zLON@@bNo;7LV<(ehU-UM@`Pt6c{S#-A{Hh-v8-(a)Ki znWKw<4GaVaFRb_IzJI3n0-E{m3LWhZZ1RMe-d83g-a5}ImEN_X{!+D$H z^52zf15(T~5Xr}KQ}4G;q=D^7oV`B!ugk247^0r;me%`@B zFyCS)$&Nvz@D$z$mB2sZqY#>Z&{)q6)_;Ocn-f9kY6bN!>cL|{i01BOl<8_k)hnKE z*$O2EbZzQF%&iaRbw0fj3G(G|NkXoinrHd!_xNfnsbbs+Peip9-f`ELbO$e2GS{wm zfuY6Fn+Hhla$VgtZAy7r2C>A0DuWBP^}HY5xb9tSp&CYX5Y+uUb16}m&z%U6nUzQ4 zl6k$K6~7I?L+geqsN!#ThBVw4+fghrLgZ~oTb@VEniaCc+Vxd)vZYW0A5hhaQAR7a zy&fSyqdS7WY)2ie5+o$p(jah*DoN6Y+1zKx^E_q>RN25%yqc$lbev#fUFq~)-rA19Zcvpy^vTRVibZ47Re)F5(G)3A$KXkFk?gR=0F?qy_YCGbkk-5 zp~edJ>mt$KS&7$chY5-GXAGaQM!!kK4-ztu_770>4)T;7D#ziCYl+}yuu zW&Vvv79sT)DrM2iKw(BQI3QKg=6tiLO3_6v432kfemhVMDb1py6pFShd-@nm@$U0h zaM5hWUJ)gxObjmc5IqfqD%@rLctF}Dr(RF=<3S|)aWfc1?GUzmKOP)n0jks0S6T&w z%xXdADCu}4y&s*Uq21A8<-!k9f}#2BAV0u1bU##o*J$NLPaCYHtEm^%#TR#LAkYBV zntl?sFB0@2NOXwYl%!E%N+tk={dAMcWKjxtkvK}h#x_TDFo;Lj7X$C`h@}00#GFss;;0?qDPMCfiSaT@FaaUXccgtWFVUciJR=X2~4m+ z;DF02g{-uf^eA_;e%=ZO9_Y;QV*tBJr#A8XuoJ3J_%m1|s$+;qTzy)Te$D7@!TmO0 zSGTMx=~h5)6k&pygObhM6?Z$2C>VId`xmf@8V#%_n(*|l2e$zemK%^HLv499qxu&q zm6L@My<+mBEU+lmmP+XDDLr3?x_48mv%8s2*-U4<89N9jy~TtQdBigA6Q~oF+SNLu zzVMmnfxkzV%RFN$FnQv#NJw1)7qWi2sZEjf`CU-1@^)>q}abvX$w1T zfoUBm2Q*lh=`76mf`}+xLwNVuBQ%zH0|up{(Le;UBfw4Ru7GX(8v)yHVT_YJo`Y4W zW#n38Pm~k-t2|-W`(dSV>E(nb`Ssg8*U=s<6IErv>%*&@HP&T8YmpZ(ZgYN;J(pM7 z5eeE6f^qa@8CehB20#fiS8oDXgN4oSg*=jkYfj*XD(|EGI%CBXJ!@ZEn7-%iS{WKo zXLHFCRAB=G)g8#LXifNegThZG??BOnio8{Z)cZ^$R9-=xiJI2RAu3Xv6+hz3){(kg zL+tgQ({h?3)DgZ-)cWlHF-HF{W$d3R81?f$9Yl5@-aczWecBWQZ?$Th>mt{>FRpZ7 zTKbPbH4IW-_iARoEc6a(H%U*d(s^YSPI`v|q+&H2D!b&T1` z;}pE((MrR+$RiFmS}c>lx1^$HX_@q~C6R&^(Y}G%@+Qp5B239JzX=Q5R)m&Lg-%An zkw^tiuDcg5V>H1I1-Zq79)h01Yw$P7P0&dDZnlOw@}8ML%x^CF-->nq0+V;N6R-p7 zDV0(>vf}bO9$DUm1zCg%jyhgPj}`486MRf!B%5xmgim08Fpp3RuhYPe4WPbMzRxqF za08<2m81a9n^`N$6*@IjZSFFLBvrhbmZmSuo6zI{)6P#?bMJ6` zAdGoAx7m4sA|#ZAYAl`7V$8ua zD~CyC)vV>ltZ^i1SxC=ZZq6Kw6;X*37S<+ag7G>+4nqaY&*YAMRbj*}n~81iyNje1 zX)}VRaWsh`N#nj*@O5HGQA}D?m4(ZmmCk#~ArIpgEq6>3y`vQ;nUI_mwhdHV%Z`CK zR$%fxk~A9oF<1ydx#X}@>QyIErTR8o1w?CRTTdDd-e?#sZ8YKs)o(YB%!f5T6=5Pi zz?T=dVQ;-Qv~|p})hZwvv}C|_zyVh<0b7DdL~?6$kob_M+gfHUsx3` zB_7(*-BLH=#8iwjqH9HP2*&cpuX#do^p3%QF%GDCy@}dEepQ&!{oq0ti&B`hgeM7S zp!>hFo}QE75DR{e7r<>c8antc$cUbTL*)w{`q*_Ox(K5eFY`zl4Hzsi?<(o7V>D`E z-m>zQx5EWL+~6ZLFJ`z1WfF7vKVT^4x!O)_c60BriY(M?!n>L#URGs7Wf83Mte0R+ zePANi!`USLg-XGA_4Z-({@WU`%(i(?Ku9;~gN5@VtW2>XBPi3wgLV)8!jmwTh13oL ziyh+KY@vQEz*Tao45|Z2RR+~-l1KN{jTVF6-&0(afTQdlbt!I5lE80ZwgeEFd(?%? zdKIGS9(BRptqd&m)IutYJzn0p)x}sgWs|i8DqWF&!5xD|a!pDbXzOtcJ5aGS;f!mc zlvUE2+`LKW8;_#4*cvU%p5?_0S#0I4*W@|f4t2e}u>)Dx$GLNmP-sW*%{zKu+tGl2 z+ms#1-czcSG|#DRlKQ$XFt~71iP1jb9#+WIQB>R&CB@T*V?64M?aPUiaPVf}=o($i ze^cxjBuB$@T z!z@-|xKCOe^AUA*{9{R2mV``4K^7`{AJ^t^*}B9zUHS*1%KucKoW9Kcf7ZrjTnxyMUka9k`HTHBJeV}0XU(|zq!_L;@nqU)iHKy5GMKYTy z)ySk76=V+oD5vKFy`7Czb3b=em-Qz<6oWn=cql*94?#^@Ei!Ml){`Hgfghs6Q2Y6P z(0)Uc-tGZtC}_J#3l@J<`!z2UmmkzJUx!Uz&K^P+sdg`WaKp(uqjgb^2le*f(uOQQUb2B zg-fv*`GQ%C)#}Ri$TfcKFIKD1ZY5=Y9L3}^iZ34DkHDn=u{Vua|1pTErYJ>Qt=v(R zxKmu5(S8&S8x40674ArhI<-N^&Hqo_yLY#3T>Zjd#o|g>Kpaw(pVgjoK#jQ)J5JK( z;>K>Drd(WlAYw#L4FN0$l&FyS?(f=r&lLbACpmr3Kejj+4CcCLUw?Zz{D_zRo>Nb5 z!Ep9Ed2g+b`{D2bYpk`2+8%*DPS0yIJ#-REJ56z{ry^$W`D=E=Z{xN#bUz%PXm#^M zt7|W4wnm(fmO{nmzzg&$zod}_$I+VNxiRrXYRyF&8(}hm6yaSP>A&0N zOLR{aV^m-$$ea}Gq#{=WZBGT+p5nr#8-XX`gW_{8n9j;m#JXPk3X_$jpKJ3~oVv^; zDZFq9x4!59(rd!fXCgIQ7&O#^Rg~6)wDn?iIV-QYLWR9k?<~sCi{(t|eFoIK+|Dbr z?J!S6O4FvhBtEB3MdkQ1{=Cp65YmHlKx@GFO9au0lPKpP1d)L*65w77@kdR#bMoP^ z{}Z|2eCoN&baYgDwPC-sQxXJlP`A;Uu`Dl^*0160te#xMhs?B>^!bMW8&t`ZsS#g> zb7h?p{sP@tgs)J4(+1pYt>;9=^Q&^6kBTH`8GY?`m*?M=5UT@Cmct<&;9_hOYGB*n zz}HK#yu>WbeEOFT4+}062(_tw9fw0T|EsIzr;zl(8M(IR0u&nL1eE4s$*qUnY3?5LzTY z)FWQ$1Ed!9=aoJ?^_Zu&SlD7Q;_0mZyn=T>2U}VeY_j_EN?+qu=fa0LH|Xo<6$lR2 zD!7&&6S6`*yd;NU~kbAa>}_Pru~<1ldbt(*f{kY!jG4f6=#0p`Ls`O~`CAChBcVl~$wEVDuZ6 zL2V-4st!yyZ_-nERa;VP#LdKKaP7gTAa>o#R=c7=gt$vx0GSfrq_u&7Yp#p3roG>B z>a)qZAggf7#l+xq&kBn?CiyEF9q`jh&2&g%0uI~w7vMy{uf-OEOti`lekLxj-&p9Y zDaC|T*Oj=fgxa(R3c(NIfTk>*iN2gyRAaZzATB3nC#Oy~IvkoBx)0bR{d&z|+9pN$ z5XHv$JDvGcZzmiB%~|H^s4cU zLb3qd$WEc&Gm-(8A7t?+K>QdS9jFCRw@f;lFMMxhVDpJUBI{r zrCx*Q?$k_~84{SS*E@Ckyn3gBIm!T`8u*b)WV@9x*?O%F2V7#VO=W~iZ=JZf(VsGj zV1q?&UrPO5)|Jj8oIiWEMR@ue5SyMGJ#r$)9PPDw*Hg3c1_F5Bn;f`C-yKPpOdftNf;n!t*ZA9SLGHhj#h z$sfTxvtbC{(6&cGc9P>!mKZ=i!D!my@ZS

    77fZVBi!R--5G(z(*pQz(SwY|B{FZX%!V zKDh zoB?}==qHlu0I`1J4vwaYCBU$r)g(RW*U;I63;h!`dt8~JRplKR!*u&xx=MFa31xT! znv$rs&8W07*P+!X`cDmw(|h^sG7j@V=7<)4Y;mN^#jEk8+p{hMy-V|9n z0~S9!TQT!ybi|9NX0LRc2t;GEiTnxl_K{=)d_T>ZKKN5%E-1WdJ=TGR+pcvro?XUq zqc3MinS%LIt@&YQZeco^**@4mGnF{P(rzsBC7-p{4pENKbM|-?kSzEtSlM7N=w*~k zUTOrxU=Y)ICa$LQcHIKBQ{qB>{u2C=4Z>%M+;OMDKa+op6FG4q1N_bZWfq z^bdWlzV-8~n-TcY539n#qsRVe^v7l{meGqm{2{%=q%ppH5G1Xh>5mt!j{~C5tQCwQ z;&f31TUsw?fFWB<+~;GsUEI&(5ft@7Qe#kHK}?el(?dloa%LcCzzWjv#E&Gsw?$$t z)HBJe64|*ReWul9n&U>X|2CJe3i8CO$!BVlRw5e?^U^8zCZDOVl&f|m%sukGm>7mLcMI1BjGxa|<< zR^e)`aI0^I!_~yxXz^h+(HGc;WvujDwyasR84fr0`j|)X0lvc1m6j1WVWE0hcYFnz zj-f_oeMh}J(k0(%Ee?U6=r@prhL{qy(`Bnud#v`7d|NNkNR9ugBi~KCD!ckWEwR}Xfm*7# zd$1z!%P#z3yqsR;~F#EJa-pfo*`>*I9m;$s)mZUfelk z@=1fjbPt8Iz_u;tskS-Ec@fy1Hl=U1MI}~OE4L!*#0vOJIHH5NLIvo;wYp8>-&!SB zXr&9P?j-&2V^~V-;7)M}A!>a@DG;~lJE7|6Ueu{FNz)3JdSExQ4R)iqC2U#J3-?8Du1h0k zcvy2VG=$Yi`2ZLd?W;6_><@m_4s23wArAKO%II-QK7|-q)3fp_CmW%>jVg{&HmoAo zT%cnhoJcq=j*b!n79~U^u_XJROibs>7l4!J&#?^hX)W ztLWJ%vu5(yLFoT=H@soEh(w3Djc!!MF^k?8o% zAHMqfix1!a{j2M5e|Y=t58r7|AD?~{T~=2H6s2neM(gFmjOHb9-K z_?B%CF*ex6q@PwA4Jm_9n-uCKR;@mw3efzGOp)39soDD_!H9s7TC$3#lx`k&DgLqI zHzi;;K*;$fbQ#*&TXf5(v+WhQoNS$pA{N^vJ1nYYqSzu^g5OQeHU#~nyH@*Mn^C?5 zz6Y2pa5H2(i1$s|4y3y+zb~U5D;ZJ^*ncrRAew8RU7Bb5CRy{{)QRJ6_U+M|sKM2!Bz>4PI8bw<&e!pB9{m8HDw#d<3l?WT(gS;%GUCq#+q3(R8v zV5tLegMx6Q_|&uWaG{pNq1RUDX=6eu-eNYa0cNm3=S0Mkq^QQ4eX!teVqPa5j<1f{ zyV39zh}|e@(26wY0!~;q9t;aD#N9K|-f%n-P=%rs-*n1} zN&c~~Rj>fPM-^PB_%(Q$1;wHOhK|~Kzey{pTW^9-$66*H(U=DyUNpFbA=4>F3ZHS?V_=0bH>X0usdJ-YZU70on~QA$Joy zO8oV@^OlZfKEOx;jujV7-8M-Pd?5t|C^oiz|cTj8&0H6m$-1tylgCq z?0L&IidEce_&u)!b>G{>xGd@=8j^pkH-g6BV+uP4&TVg{lqii(-k@@&}v$zuQy`#vE6R4-GL*Z^kWhI0XlJK zWk~DPpm)We)IEM%A|#fDol@jVh>DxT8yS%W$1t8fZDIGBXs= z8QFXZlnmEIsKL}v3kWTq=!$Qe=%d;CGPRpj34$3Th)T;M;eJJ11aTY)2o?40b>Q)4 z0q10Jdw&wD%rQb1{B5Z~#y<1`;IXKTu{F7WMd&3^12YAx)i+Z6yu~P;?8hBQh=t zFd&0G3vy8}Oy;M*p6*+I2%3%ysFveYBw8= zHu08k0N87>0hL#|OftwaXBpvTnUc$82u0T3CZE#B12RN^5syiUNqHa5&zuh)J7{WEcSL?-ON!BwHb!g1 zvyoyuE*6_5t3cV}jp$zrbSN>~_=Cd29188YDquR^;dbmg?Ko-99?zv=iZqRV>Ls8W z@CIgseGjCfqrY>EZ_&M8Af;)IyL8D)ZiQg!3&DnJD^oL+)$KUfkT)h}S|P_M88X<( ziO=~dE!N^~Ro7}S=?_U^4S=PW<$isWA+MiJ6wrI)2`VD%`6*0C_CFC(ZxaZ?}duh z43AA=!XLqO5>s30_;R)(E3<7*v(Qhs7A6S6WB5g$QzhEFPqAKh4V8(bK@2ja6O`;; zw3FSZq%1QB>H}mFu=dZ?voE0@eE;LUsBUvGt{*JIs<|h=D5#6iFo#C6U;vM;*{Q;^ zjF#wFAAM*#QS-rIr0kXSwyfw=#X{-zOa=ow{fUISvahambsOg%{e+0*tr&O?T5Txu zg%EnccO_=b@YyOTXB$klrkO=8tXlRgm`H$7b6si3UAfKT*L$M_(01|uGfdJD`c4QJ z?|`9x_Q+ao*zq{E?n_n|29`DLC{aR8pg*t^`PAu3B4j(m>cSS%f06?>z!HF)6IdN) z*;P5pDWcd+yg4ZNq>qGB-J=CN==nnM68hYvx_@ohJW$SastioM=mxspqF`fxlpdFkm zRy0p8X`8FjmD{!YMd^vmK)3M3cJT2eKBfIuj&h^M zIA?=YLt;`140H|{cg|DF+T{@4g$C}e1nqqKCR6HhEBzS?a6xTh8C$F zJ0I9)FzU010)Tn*ZHexm-ke{%QN7XD2-Ntt`r6_3pC&ri4?F0w$CQQ5BZi@-s6qDy zgG8#JR+BS-eu%pX8z~4!;}Co@DOlJfc$MvZ&7%{+-jUF@cWFPWM^`{XUo|`ZKBf)>$81 zgvJEjAf5EOWHk9+M-?--0E1XGCF)=K(iHC<_?kY&-utJu)rM@$ET82yuctTY7(D;a zeSikhQWUosD70Fr{tr3Fg#|j(Edl5@Q0vF=b5SkZ5-IPaA+M?>Mvlw zqj$?I8(Qh6Cu zq^EDH@c5rupfei|^GG@!zBf@w?v$Q{U1-yQj4TkMu1#C5r}jKI?YVnWwc=t`jKcch zmRa|3qPDqQQRikVw1#0`F&eI4t-+0BZl$38a9@$=RL356?g9t0_@rEBdyIc+`D-ZXf{O+N&g{m*r73HFDuDQZMhiedz25LIB*2}NRUJ8SHs^&O)OCaVq6`SOQ8Ow22F<$KY0zrL5Sd?0 zu65T97l}bD|Ml{J{po)JX6JA?hQI$e{T+RyGlS-i8t2UA;2f9n@tC7`L>f1q+D-MS z-B4}@{7s9<&*`vaq+@#fqja+>!gt9UG z=H=JGPRt|t%AG9E)nt{{VqI2`??eSij_I1RpxmUDD~XdR<;A&VCBKZ>VYS&6ACvS# zGK@<>OfN)knrxxhAZv}&iyY-K)7Xzx1e8xD+Ch_dTSE|-+Z%3~oA`q~-{3X`m+;w5C| znAy&j@hjJHO4|mwRNzEoRIfZkZRk#cm+s*vtx&s|RO}|LzACaL3!(WKCa*d$zHZ6$LIs#4n$LFOSA_?)^kdrx zn6jm$klZeb#6+rZ%1ZuH7Im6O@%%CwU&a7ndnb!mT+we2&9fau!<@6wWMdnmXquZ; ziC2)~LUDrpVUin|pTyRl7w3$9M4l@3M{2Cp3Q3`;T(F6`3Ex>BGID3OK66$~<+jZckUln4z<&K?|B% zIG-tn4M8GNjb9n!!I?2tI3^qOv}!mm$;^WpE`~!)q@tB@Ut$M-N;A0wew{@aF1>{) zeS{t^c$PpJwdfVEk|}x;yL=(QXDmZs?x(yv^n7{b@1*y{sj8>F7J!E%s1XL}9py3bj4wMn;ZLO1r)p88WpE9O@}?XOvD zf5EO8N}+SV&O~fA0)jLm06F9dpkSUkrBpCG$i<9EAX5;DlLop+l`D^^N%S9D+RIjVH>UGn&cR~dtDlClzxZ`5ByAmViBUg&{KH7nw zV{tsbhE%%REhC;EfHg>Rwh<{Hs3vA|^VJS0@s}y>2OO7zHnzN51ucB03LNn@kAw?A zJ2bKRAiL!U$G#wgssyszO0e!dnw+hV$G?FcUvK}IGPSPt)vEv2!NdEcnnOaHG)uM< z0=Z|8Ni{b=5_)J7XTSppq)#k&tpn>B!3kFL_Jf38Xl8(=eQUiySK2^uTE)L(^j5GHY@K4iOd> z1mn@P0`FE98Ft9ZC!FVCR{>msMG*9c#<$lHKYBb;)=y~=Mb4%^l1K*8ZxXzRg6v0U zm5zueXV~I+9ADxkYJfsB?fdM-!xct&;GCPs7Dw3>uuR*|Ij@aNlR=rbKDzoHY7KCf z?JA@9NFRus-UB8sDmM6d2=KO-ieBsif7?qH+1hJSzm=7uNQiGUh=nkbCH?N#6cQ15 z&Dh;wgHrlJJ!`we6fS6AsHf|n{q&(>j_RH6YA2EJiNKM#UVN`29mDg)22TdM1u>9oJ$XqHnAYoxCx87bsoA*ipINb!WA+QHP88nX=X4) zMF{Rx3yq*LO;lH_*1Cy`*q-Jh_EQS^YA`tW$Kw}Z0rW%Gb4EHSn{B{ATj3W`hyy67 zBBS5Ro{J=$R=wq!(kz%JSxIe(m(i5XFCpbiM_qMZhbp3`IeBT;eZKpKi4e|L-^BgO z#^H41^;m$u=F7DD4(A)>YvMafAU)QBEZ`U`o?DJF1CFsG+z1Q`3@6bMLS+uwFvrQkUC`Sl}_o+R7N|U5Z2U+vAt=` zwj;hX>wn8%lif6%Zxceixa-r<-V!_y?*?w+Z6$Nau~NtLo>#Y{b)4L>4PTA#oXU6; zU!{N%{v*Ki2v)}DDcfm9UshOB&ObaLIt>4-0^Nw z+dFW}$7I!aqYaqK&S1*(w)=7`_*pKg6ZrFOSrIF`ipM>rci{MN8{J{tS!bR~FIFp+ z(I!5}O5e#sARf0@@#5v|ZUle>V{Vh*Ay2g-&hCyF%N5fc*lM%^HS=;wer#Ij@o`YAy48Ne#ow2y2+!q@q=(H!TxR~l}G-_>b=PpO8( zQ9Y@CTjx8v!zVqbW(F$W^jZ0yJBq?vR4g15AsEU_K+B?MI;g-dYSpj;!ac>WjU;Ky zPN-5uyi#TY@1zO5D?q)O_Asj@?@?E#kk&ExOoZN(#~2}$jHWjXQ(4r@Nq<)ZPCX{rg zVW#Xh+Hf)3pvG_$LNRWZ;A~bnzec@E8{iB;)z5bj&sfaUK7M!d$2dv*oGP*<=md9* z6};M3mL_H2E30KZ+aaIFNk_A_+M0FDAV1K~D&X>G6>u9SdbDq>@SD+xm0MKpP_rgL zbV9Y-Gw}m~A6gJkr7_--JU!jWOnN@+vg^4leN4(GcJ>b$Qg}01oexsFF*5V_2*E=z zJW>mcMa-mU!~I7YWCQ1rPxz9he9B6IBEF5p)z?;ikz+Qgd?c98%DgJUYr!~QC~((- z7;5{hf}LfbRp|1M%yP_M-OH#(P{gw-Sj;^lC(gktF3&L!V1NDbrOOl&yl~66kS7|9 zQ+IqD3CUJ$7qc6_j(%2D{)m5%^rM;N(e3yqzIe$B9^H)};jfgBquUV{mV6xDjiA(s zK*)FgBhl_8KPQFePyUgl`mdkCd|=s~Z!AN%ySd4Q&(nSLn|L}*ur~PZJeo_sG++bT zCv6t(n-eVBzQt!X?6F1uSWk;==KNK66x(~?H%m2btZJYSn@I|w7KA?vQC4{y)U*hjIFG6jq(4Pk|y)D ztX8|bTTzK(B~HJ$@~g$c#}JeSVO1z+_Sc}79Dl7mwr4t1SEm%UF7!~v#uwLMT(?D>4(+=a^)#a`Rv;@?oIs2(B*8h#o_$W>65Kc|T?5wRkMya#um?762 zL#}t0TyHJ8UN`(7;G>g41nn(11A<{}*d6?)fkDBJ-SnvSZrPn4@+1GEHBut6keb%> zI(R(Kq4qtG9>@Fm!j3?1X1xPxB0iL8Wu673ZF~M0(zW&ZBS3dzb`aVkMh~ao?~=^N z@%?$v#OpoaPk)CBJ56V+(eeFxW%KuRLI9>V5fnyK28-H5ejV6;&%U-jZ=XCP^#I>v zZ%O@^z%2rXzGsxo$D`KkNDqet!nbwkt=8wvr%5>3VQ2i8&x?z%)vuEzQva}*JoSRk z0ZYbA4_E~3Kv~8SJ^8jCl{z^dXu_bdF1Mr7x#X_ zZc8!iwiI*ww3h=~0@zLW0BcL$9iPtb5W(jzz8RTK5X>;Jw7RZ(iZ{0i93$l!;DVvJ&Um>(B1&xB|HX^p2O8U^s^be0C)3}q z6|s;IzGkH0|CEvNPCauML0-ZMYq@C2P^VEeP4|YbU0%U}JYqM(kPBo+>)4Nt=;fzO zfCJ|C?66WYjt?nUZC*%%n<=$L)W|YM8d!xsZd~TP2#vb^UGS?qz42wt26%QrxXra& z>=(IQ7nr-+W2ACFnJijNCm6E+Wl-uo5=9g6Io`~A{3v27o1KqZe$_fbPifv}p~_AZ z5$Ib@ef!ZA*qtt#{u{Wrcfc)Um!4yW0oA{cuTuVWw0SPe<2xotMW^vMmy-v45x6)l zGd#hB*HaOb|-Ik!B z`PG7WaAgeGz}zPTz31t^7_fnNmkijz-9ZCpg?ZXr9jRWk>mb%MVziUNAE%!W9M?Q; z-CY0mC%`Mmi)wH=g{r!ZWXi1N5} zhIE^0Ep*6A5bA~m&(=i!3njW%44@K_FeQ?bA|?gfsnF3e)k&`PPxLLF(D$t?pgE8F zF0t7?Mf(KIZI!!p3+c%6*!s*>yd%C&V}$<*9q=efJ9jBz#J)}h1L$WOSJp`%ep?px zYdt=?x0AEJ%RP@7Xo4`0c;@F3H>Em@c-GA#4mBWSxP9i*hv&vU!9Jtp;Q)^NQP@7a z|F_AZ*7eD zvI7sFv!5hlLFnu^#>ow)(B!o9pt&a3C$NX`5lsp}l%5sdPo^fg3zUV4sQB|3Q*{Ul zJ5ihR0X$`nNAP!Y`w&#_)kKLkyc~jh>B4?)U8^U}9g`(zsdW#l8Vmj2k{Bh%4E=7K zlygqY-I7<&TdK0QjJJB)QnfLbs+~!Qa!}i}_&VK!grw&OR4{?Wf6G@g+Q#$k6R?KQ z?9Ah_@Df8vcEiO;u}8<+0YA0pC?mA&IbwY2Y{~b0I=jDmoQ+2Jo_b<&4<2@RbI241 zO!xg2WXyQQZ{ow2Oj~Euc6z$Uw%zDHX4l{w_qf460nD|>%JvAxyZe|u@aw707{Lta`@L zX=Z0Y&*^Jo5Z)n?^to`SaWZkfc!*I+P` zr66D-4ZrbgT#HWm4|!Mh&%e%!_34(X|Fq&^QvG_>!%6oW6RD6+ZZH-DQ1xAWZ z75XoNaE>90GG_9XfU`?Q>7L6NPNq{nwwS7di{jt}rv>l1?DEvEx$+_M44HyLfBW-R0eO2kBkm13MdVS79&8*icXvgkI zo8G%*r!QBdw0oMS7`=3tq90@?+fV;F;EjI`KkEfqJdI2* zd>A1xr)k&U!ANwyhi&*&{2ydxQDijYqtt&}RCp~Sd7Z{gwO0Ft0EqGz^xABH(cY&Z3En$9H52d03<%qkU*j9=%1gw5}&4;9##A2Zze7O4oJzC)t;}d8R z6UaB>x%YjFF22yZ_*CoSF*?SAnL2fR(NV{zRvk|P;g;QCz4S+0EV`RbtL%c*dK#9? z8W^17Ic>O@6+Qa?;PcjHu;;iAb?mdVlRc_Ua-N<(cw3P2yjG8J8q9QPy`Rw! z1|9nU%VLo|cPpS_Vs!$5J&R4WZ3}>1vK0h0XmiH4YtC3(bH;7UoN)){jCDL;pH@%Z z{5o?63Ym}3TQBxp%=X$XZtvfo`(>B=+Jm+DW-gLL!`5J!P>U^~MDYyF4!z+&yCvI$ z6(d`0(J-<8&4vjDh6(r}+sCuaH%#2y8}m9o9@i`*!^A!?Oh8x0Xh?Z=$H3DrGlmI; zs5;g#v0uh)gU>%5=xDvae^R|qrLAl zBzgi1YagvZ{IPu@Jw~k|Lh6q)1~) zah%sb4dqTP&3Xb~9a(;skT*>4uzC`iX%$HV&-L z(e~R?*vpyAR&fO}bnytb#%UUIwyuED|ArtmvyHpfe zr>wb8s~0Ng2e{EhBJ#$qip<+kkxu`T6y&mzGM!BjqfC)E4N@DDWL3Gd31QC0_NOOk z-YJ>bI}O2|-zsSCO(0nLF? zIwJ#-Zn1Nka3JiUEnA3fhHR-qym*v6%h6>#(O-;W#0%5l7W~!OYY0d;iUEke%*(N( zeURJ1vWTWpIoZf(o7ot*WooAM{FWhCVJqK@2fKn0(tKc+8Sz3Mw*ug*;HE?zOjsrJ zH^3yx+eo@5^vsPR%+>rDNhg1lNj=F+wvkCO*+}p_a!;mE>`?o?V9>&DH)eAZX;t8R z++v|UhoIv?P=aVQd)rVBSc@QKQo$O4I@HS5w0Bj*Q%J)L-KwBlS;J)>VHt?NMeHHr zS2JCAIEa?2v!mQVp0FDYVttemJds57I%@t^*cihJ3FF0Zv#d{ssp=J_*!bE7N_kjot-CdXg|KI%B_kP zCzSh$$9^CMOx5r^2pvA`6ByWIA|{VbJiC`sg;O#d7OgSX;TR2cSK2tJ2Qx%S3**LD zc`F73A?20LJd^V@2lsFSf2gxXqnx+aB(Zz2K;KT={_4bOW2HuPQuBc<{(;j!NCvX_ znf|2gZv5=Bv;Bc)unLSSps5@V;ok`OY*xe=2lV8wlX_;V2J}ri4zsiP;3oi!pU)S| zBt=eQlk+BK>2>Rb7%`nc)(Q~(pwVL|KpgBke+UHX< zHgFLDnwrAP0HWHS+<2PY>q!<3%w&Z-!qoe;$$30IJ9=k)`V1kLr6=aqG!94W_nxV) zeNMzWipx(Q143YZ<;76fao(O6u&D%7BlM)y?o8&|D)sy4#3V)ZC!%2>kO=jEuX#JO z-sI~~o!;~ovz%UrjUT)oH|+6~Uw-Vo+%$$X=X{}4Ibf0orqekvlfA*a6SsMowlo0e z-IfHK>WJ9-baey}-Q||c!PmjhU~*IL9R#au>$csN$rlv(Lt*j&FnrDH#9Ef6jtN3M zdivAAnvQh_*~HWtn;MPx?Yn?$(=er)gkzAKj!^$172Xu9Kg%)>Bl92Yy>e_8IoPxoZgmuy2n zzp)(`CNq*=Ttc9+p4#bEIU9|DrQ$UtSf!}|o927yVA)`h;GR`nEpkFFT!PycWF+;b z=%UhnpXEWKm7L=Jc{b0^C9Ij4r1z=JLGMbA2f0Q7;6e3a%n?>tQ8l5Gg%1zQf zSZv(wO!3=162Sq7lWE2nBQq_b(iV6!q99aSxKf=N1}LU2qf9Vo=)qwNHLZz(yI5lh z2t$?r+lfGKk`-oG`J%`^l-tDSA4_A(!}3LueM#w53iGIn&0nSc3($frWCiua{vO2a z9=vx}Y3|xDV%MC1{?fj-J?ZH_?^yhux)VqPaAI2eqB03(a_NzwYrU7jJ;cX$g`Z4& zPuA#E=|9v?mhfMUDP3v=m~$00qP_9Mgi1JtejO}e+H=$E(#MWQ2@jbj$ zGjpZd6HxWMK}XWQLf5Z53K`E)74QIVp7__s`S3mP90GWG6%PBL(mTK-DeDbj;5G>r ztaO2&SL`7VUA??@vUNbiZf{pN-wU-I0T%?dz6wJ(v7|X_ls#MaiULvRRm>o-4J_yMwd2KOl&V2izkNVXWdT zs^^PvA(zP_Tqgg3zR$Z1ndTN!N~{C|bkBvtGQ@`rE)_)4z)QsVd1*R-Jc`MKCH3%Y z!(Qi+e}zEOC6jUrR=?D%ziIf#9Ifv;*x$1wAWvHaloc4BHmtHl9`l<4_mSIM1Jab{ zl+Kw!PJ@*j{o6ofB_gE^K@yg#h>>(;NR0|s+v}^gx0-A9L*AeKjy4217(mXHN4Rr^ z$E4&wlk%dr_p!A1@$snnjLQz6aoNDp>%FOu$4ion++@3rC?*f*kaVI#VgfQUjc4|a ziYkg2rm#ZugVlDf=Qw=@k?WEvpQIGpV_rW^>=Kx2&4+XM=kZ7< zTNrUc*fj@&eVwO|qEg)cbv#;arn%D>hhLH@BQWLoAT+FU+%(IE>7LPn5^=*QhpZig zGg@N3xv3wfUqI!s(sGheCP}bjmvO^ZWpOLlyUO}qdo!TypZ@5T{nHIw83~BlH01jH z`EVN6Ecz9sv$AnL>0`O8&G8IEHw1`Q$h=NtAGb@53w=xop$nK%8XTn-FgzF@Nq6dI ze^;g+1A5+XzPJ&$WhK7DUg4y9zoXdX<$D296qU$!D`7Iw3gmXJ$r$nUg0hKrg`L+) zJ%Uh^Mv z8*m2cpm!GW>^hHj?5iSjDS)=^dhU)*cI*K}%cNxcL=&9H1kW%u#@75Xk1E6Cf^SMZ zdk?pd-CkR^foP8Rc~p6SXZmlvKkS2tJle+WLyn3j!_AwATi_hFlLxj1hGIL}P{okH zHmHOB~lQeLL*J>=||?Zeq~Qpkey^{E)8xy^|HjLyCP(q@t-rE>h(R4gER0M31X` zQPhwP9NhX1DQI-c>fUFdyc73wMdnd-j&x?>OYIUO?{;_Z(T$-c$cTWmwO0tpkjh57#71?=u-GomqJtq74EhJ(s6>*J9zU_G5&3zKzl*cy1di4F5hjtt>+@OmCIdi z%Mqi+mNx9~IlzRP+ydZ73jaHf{JXq;jVXl6kfa;_qOL1>v#Uj9Q21knVG17+P(L|_ zF22Z@++a~82fb;eK9~i==3PXBCCFxb8IVN%g2qt9Pzh6&+rN&-!A)MSK7yL`rrf`m zzW~IA_cv5PXQA;;xgW5<=P1J(+35=~7TVss>`9pUk+@rdSy29-0~MCH5ltV>k%6hS z?5}?3A`-{r%XsGTYvxmC4%^?-4G5P!UGL7Xa(;I9CLInBTOd>S7{laN@7vta0z42M zA_52gtK1WH{uaKlN{jncxxXfT)TYzOkF7oPS-zmW?MomV=xK8R)6*lU!Q@WUVW3R-bYH3*>$O1)#=%$X&>!AhQER z9ali0+qWlSNI_^;?Ctk|>z(#Pu7xfA;m&b0K{@PSc?{px_CK$wZ%}vhLp~v2ZP3`Z zTkSi7e#0K>`cq3Thr=6y+6z)5(PeB}j zmHG+$7Hli$9z0!Qpc9-!QPe*HzeUo7Y?W$}8^rQK0Q%y3!K zz`Xw#J0s{Xnn|@Pi$bg*jhmT6jzkw1!oB#{r>64nG6Loi=nrc1R`nhx;>R3qc5&kw z?!L_<$sh<4wle`gJjvb!SMT#2j`<9Zj{1k$vm z4Z1*32tow2xv%y1GO-Xa5_UE{$zN;V-d-Nt^{$?Lwyny&)Vd1ugF`y;f*(@kca#6l zStjtWFCj}jYQO)HH;|io0e9nH^O;|r{K&Oq%WCXk5@PqD~+ z+sxOwCtuv9QG7fOc10#`Wg#*Qj3jje;KHpcA&S?A+j$`i0ww4^oxjPGpL2b7|C|R% zEgg5^y>k?9J$XF&M7#a7v&+t-j`wlv`DZSg!`5l)vdn9_HPMGIl_a=eJlYh#p0gW8 zv@adivQ?W+swl9+uG&h+_V452(ER;~(FW997i`<>CDEAU@l3@Ylz=@|ho^M>Ku(53 zga)N4i{d%{x~@w^XP|TMXCe7#N0u>yUoBT35&j#TzL}TN9m3Z4AK>YCkXP$?lyDTl zPvkEBS6OKUy=<;3P~@Q>mrWF&lM8Oe(?vPH1Vb@-RhF*`8-)Pea|Yf97e&l6tF{sq zI@^-pT?t+~=x4*++?1~_Nw~(K_b95yd3+I-5Mw~T)R?k?nqM&@yVE2eOTeD5`IISM zjxWJ&XI4WJFjEsS$KjvR<G?zfhw{%%{mEiImrO>Ha(YAn7ge91P&w87p(etXDRijZ{L5^*ItQEk_^*7`VJ8f-t z4*?L?5fdG~bo>;}yJmtf0SMhDAkmiC@#PXEUiXUi{dbYjc@Pp51WCI`KY^CoT?@u@ z8&jc^DHIt+Z4OQJ|5S#LlbYof*Jp{pLYoRn(e`yQuNPuDQVIMwR;;4>F@NPiqK?NJ zE*9r-+u~>zOK+E72p`kiB;3QSnCVq9OGjMB%B+yL3)0vTFV7!lRdtzor2K|rdxT#w zIlhe1Smh^&26LNB4W08#G5!;IT0=CbAAks#MnnYs402;d6$fL3R*Axf%f=}y$61_U zPI&F38oYiPkF)sVWfEoMp0pT0+pH+s6k z%ED?-<6TeID=!7<#Y;*;ihkd(v=)VE0%arB{Im9og=C}4nKfHY(G$@-7rV;W)S~?i zFV#6MfX+(oX}h!QX=|2?U&YPXC*G%ehgX zs|iG^k-23gwV3JoI#z*y;!hBxL3n?OU=-ttU61@gPwSNBQZ72+0zN^Aq zXNkja z_H+MaChl+5@Cx?_q_f+ywM`gs%gb@W?sz^%aG|>8y@>0%Iz|^6-)yeUxcK^(aF_^~Fo5n&cJv&BwD1^pcF` zIzQH@^kjFkC*!-3?#Zsx6Esa_Hcbjt^?I_U87avQXUVCWkA+Nxaa%dmvd+ank{!c8 zeonRkHAtqzjf2%$8@tJ4Wfco8Ii)suk_Jo?NSDm$2WGF*TG}AG(TAB_)qB!&Fc(a2 zFamWmfavPIp&di~B6J|}3&@egFCm%TFVUKCzv%idtpEVaIt&@x8(HG41&(T)ISZP& zGX~e7R8x`E26rIJ zhYE+B+3tR}A_be#n_z5kt+h%vYc1(-q_8V8ouThwx}Vg{^fVDH=v1Ou@YzI? zuEHt>_&eZYPDQwZA>tiiaGU~T1w-~b05v(?f`kh4i53tF7Q3NhM1FmzQ9tfv@rE=_ z$p=7ufrnlJgpWG3S(AW;np4=2^qVOB*Hfpm@uw9o++sLPHJ9W!)r8ua>fQM1G-HaKa+|bhJQUN-(V^M! zNM9q}8{l}H;>VGpZRMUpdeV3(Z9V9^6j0^A<-D#4PfDlA3s|XnJ=tsYzIyUVf5l*4 zbs$vsyGYuj;G52or3DJ*?gH~&|9S{OUj4THR6n6J*5Okrrhe~l8vO9^Su4Mx|ClY{ z(bD1Qd1Bqc$3B#7U8O6L6bzTbo*e_21L``J0-^-mbOd@7_M^o$)NO`Aw3rap_Q86F zDN(V1SwDOK{<=$?hVmXzcJD-?5ROEDPxTe1x3#Ext9v(n?{2i*+K3ptk!I%-k82wt zTR1Yz;EAnZ_8s;8jeTl*k_m8y!89-JN7(&tv1W~aEQm-IK%Y--Lxbr-U;lC^^GqLX zf0?L?_YgtfTp#@RY-B-s0|{s2=VKMNIKCI~^XAT(|jS(aRdEkTVx!^Ii&hi9VFNS}=s*Q4`EShwge$ zE!pj*D<>#+P|LQ^B0q=z$#gPcK!rW|F%TVHeVA@fTnuTplTbt9)O#cD3Upneuur<{ zl@X^+A7SmE>Hg`uUZr{dO<8_aR(zm~yeMmV`}mF^pre}g$Pca0fPp7mN1tNa>)L#7 z(5^Fxn_d!pXgcJ#+gPj0z;wYUn5Vkn>cDIM3l?~}Lwry4AZ!X-hhLhYyha+MC<35= zQ}@=k(`taXp;iz0w%;65Ef;wFl&MDt8yCdl@y`HR3vSHVR(bzM^EB|)1sKEMXV6~0WndnXyrg`A!3kpFq zMSe6Fmk##sS}K$4GDc?u>scya0S=+M;+G~9ZA;my8DbFqqaNjsG@L=^@>+doFT)6c zBQqdoLK&B+4bLVUx!ypDc7omUYw4%ap@iZqHVxU-E8jppccw^AqPf$bY=?3kd0A0P!*N!kntMk=p zbH2f#VCk&51aYKf5nanDYL9#Lr}!de<4Xqp3aXYDxh@|E8-5o>&Vd9L!y1~r^ZQo+GxE!gr^uh0+N6fsgF@I zk{JNkDz6%Y3{oQ>4kbhj0X^1%Y5*TUTTNVo28b1CntsE9`?T-B%UY2ARS z>0G=uJLsQ%BmUjWO2N4ERB69*p=wMgi95)OfSvP}^OxuL=4KT)X)A)g5E~2ds#Fjw zzS3J+7Ewjxc7z_3wt#RrpC+qw9VIo&&P@dK%nsXb!Or;gb{C^OZUTRCukFmXz4F_p zsp~Xt7J=TthV30m`_*VsAhY5MphIbB^i^-S(ZR6j%uMeKvA#_EuTJyG-kjkv(}x`nBB9;T$rddPbK>QE zrx%SApnuVkZlrpv!zEjaV0%64$IS^vhA{*v6a+k7#tAmw$a_8V1{3JzXT=C{rDkF@ ziV0wJNfZjzG{$X1Kz4OC9y2i>YXJDCM2Mz+gK9+RwqA#r>8Io$Uj<7i&(SOBw@pqI zDV|keQ;2)iM|F>SntG;~6A-!|4`l@xVb#-6pl4pyV5R98JRzt_b5!ULx>y>1*Tg|q z7&8^e#&L+Pn0BOKx9pDHut&D%Q+BU?ohnH2btPuii09}*vEks4MhnPx+$e<*e;P*e zwshdrRm>zZWqiwb6IDZwXSU`A!l*B{0GEImser`3LSVXEzVlpS*d4#&Q}FxT#K+@% z_z(L)e?j*$K4mMuG21M=TFpkIEPmvhMYe<&AL&K-FS_G9@X%aSuJbiG9o@0VnB9!{ zt}Xohz&(}<5Zkd@UEj61-HzjwcH*nQk=D!{cc!qzoUZRq_Ta^aTt zCnmnF`Kw5C(nWAOe zzM2k);%Yh<34-5?SJOF&b)IIgcU=u;fBlLBWd4!1KeTj#BCTXp>q z7?`*nb@aU(jK#*jzpkP%C!p5~Xr|)EbNTMo^k^-QI33o~FKTWJg~1=%VGxeUsS z6EYvDMT`|g%K>oYO9&_plrN(+0grDeZmA+t2fo~=#LmyvtMXjV%L|p{7c$Audp)WK1d&o7fHWJEz(pY7n!_K`iX*X%ue%RaDoaDoi4m&P~zF7nI- zaA|ly#~b#V-;8hBTd0Pt@#vPlv#>lE=KTU1bR47CCbH6RIf1>s!zT1+#<%PvzZu=K z*Vb+{+PKz?m!Q{{W~#4!X>h|Huy^mVY2^Dyx9o$#;BoC)CsMCL5)y&l!^1rfC}4kzTwUP5v0$ci*ZgJ>iO(qARB0a5c|tH;K%U zZ)&e|rikOl&9Q~XGt>KVv}tU|AD`|xj~X~3v`CP5+8#lmD1!3{;q!3nP(rU5{ zgLonB=8DTnmZ}XJ$~XGQk3=fATwv$vowfd@({<`!Um}%xV_LZD6jNKXJzvq~!yduG z*a8GV-s^jg$A6D#TJvlEz~A!^{66`}U-P&89lvKgjmlc@FOzFlKVBvuS-pRmJh1xl zW%8QsFO&D|@iKYK_AiqU?D1vtPUBFdIu&ZB=^=C}S$RLGf60c~ktSPa$C<2IIGp5` z^^GsNYg(6Z;Ip{u@maiKyQbG==QQcJ)ZUVLsr_dF{MD$6Tco}8NxN2?9+*p{#6<1E>+H6Neg0B%iylopt}RGbg)WR~S(;FEJ1 zUkB8CYp6M}2LFJhgp>ggdW=by;ywayTS0`OU(tl2+OnO0X)WrXdtTkdvyYr&7qF1s z^Lnyxx>WoBR)hU?8^+s1wRb-ClP9R3)YK26HfPuTQ)%C5*E~0^&k=1I-}5fX9{>7Y z-+ywi{XX|kznl6-cY8RDoI)|5zaw3-)guB>#XIicLuZEQ_j0sI(eL<_-8lEnyQ`bo zXml4J9(lRATe3ZWq|-DrBQKufv+m+}_Rz0|zKciN9IZ+D>!-C5cfd`&_SFk-AxLK* z&-X4g$B?DB7cWtNMHfh}ckO%3>`a$K7L*Y%g$_&MAJI-VkM8+{PQne7`EfXmcKnWW zelxzD_qp|$a5obP2fV`@7$eLigszSWC3B`8WWCx%@8ZKMRl-pGq!@E`@p5)kiS*+PpXl?0 zPpG`n?|#(p>Zwc8F_+=HdY$2cUrf6yF}n#KCwCyNN7O{Dzq8SiDJi3tDo*WXzH! z2rv?RR90XT-gm67(n96b*y5gDFPZ6AvT=FOU)(k)DYXNUCU&CM>_kh=4q1}=uY1gH z9fw-@x^+}%6fbAi(a6h|vD>&{Sx9_qp4 zgp}cbq=SoWT2qmp&{&kb9u*jS?yDz^D%lL$h2+Y4P0yj#C-x4G)ZrM}JzUyp+P(ms`R!<&H z8y`xOC@Z#o!Rp>FLfi+t{yLJLrCeHcjjI%c>g~eHMX{U_&h(GPYZI$89G1}ml1l9_ z*&~GgTsDk;zog$U0cwm17hiARsP!wgeW%th)$rEAFdRS;qi!i*x_XYf zS3Lt5xOmvH+#PguRjU~sc+X)?YnByxs!8Li2JqHTtA$gC06H&>S{RRJ8dB1d%cq)} z#<8c&%6Uh*;#+Y0;{htrIn~Z#ou%Yt4Qpe>BMYzh*Sa=;dl zmkha5o%^lu1Zwb33SCni2P2Nhw_qllNBM}SX8XKXks^=`0M!`7Kkh~&!#xVnhGhsEqj~sX?w%a#qTn=@29G6&NDsO7xC!1@=(Hjm|FctYu}Wc_F#q7Lf4^NJ#@>oNwfsqH{up@re#hV~-vf7@DU;K>e7{_@Xv|B>O5vA@Kk< z33NmUrmo7ZFtKhXal46flgM3aMeV8*5V8gyE8x}#O3BBq??R*Nxjin`JM;ICw-`JV z+3)*#;N9P_L~Fp_43NEa!-R5Z+JkEcz1L>GzG$we3Sc2b_kP@=XxJ zVcIGmM;F~S>u4}RtbIAzmRs~>0h5Hz-y!44ze-t9osz>0`)}pE)NcXEgRKdpg#-a2 zN?E}wmd8FW)khD*Yap|M#GDHbdQKuLJ?_khs)dVcf|WIFghE{CeHDFQvVqPDs|L&l zU+b)~wi@8rnX-ZLqNb2XQ-vmu4Ro=oMaCLa>9Jyj)@7ex!_m!t!aZC8a_*wtRll9E zcS`^bjwX|dSWv|^wpKg`4`-rc9rMvYh@0uatizayV z6W-Iai?6-MDfyJQX!2s?yhfdFlay;DGo7Kaf%`GQCiFO;dfyDs?izZN2Kv;CdVFRZ z(Q7!+r{2<=Lj%E?HGg_JgXQm8P!0WjdQE#8aH~phpI+FWm+jKhyC+w-=T)=5R72C> z#bh!O4hdZN6zq7kbEuErqq)3AJcESl6L+19_;{2iU`F>6uuf$**Ztay6=p#faq@S7 z-}x2a>a>7)dQ3rZk^CFw%Fk4!7CIn#Fp^8QSi+qOUX=h$N{`WN-aT#lK3)^1A|+Uu z&cszOJ+jXG4qDbI*IG3-*0-AYj8JSrF#Wx&C$Z6cI2fgv&~*=Ok#-gh>1`I|4}(99 z>d_wtFC?)b=?k+fME2qjBQ?VN#B#To-R*USboimtS&-iM-V)bPn5& z(Ryr6I=TY|qq(<^ofsQ0K*RDF4$XUEpmh4p(?i)6b}+0nrNGc#ccv9`DFn%&i&mb+ zLT?%v1F&NyUqEWQTr=4L{x7oiLouGcB;hS9eN68S)X@*TZOsF znMMQldE(cVnH-WY9AsIFsaCB@Jsph6$K#B>$D~ns4&R=fIgb!R@?bK z#Qf`B?Ve(f61bQeRG#`oSZ%qTiTFst+)#K*soY-9#SdJ233cyOto14UR- zZaCBdL#_yO3*u@0i8LRePAu4BFjxY@FC1SWT*=ubA@-UdX`VwDFe#B6$D0<8HHdv$ zu)(;YLjy-l*g`0Y^%Hwf(uM-n6Quw3eklLPU_Wr*{X&0Nhs~M0m%{;!CPgVT=K-q4a_l(qOdcNF z$t0tzQXrs3b_6vzXwV`<;=kY8yWapLJ2~^+s#~dwMWE4W^ket#{a6d!d+6PZE&5$o zQ~KpaCO|{7m^nwFxWU{1^x3{?|8xZJogTeGKAxj>U47sMJNgq`{nJrZAN|QR=1)gz zxlMoZrrm36?*QHJl3By$mDlAeyVaLBKR9@8H6?MaWKCx0r_a`zJHPL&s!TX0xxEIX-nT8{yQrVI(gb~p zC?sIZW1x2pSb#plBIM2x73GFU=aq~qJDcEcRkA5l!~9xlGe_8rBLgFrDLnA1R@c*` z&-SeSMFB-juYs;-*RAg%t3~w7>!qk5SMx}lW$Pm#_+!OUCiOg!1JxR+xi7&oRgoXi zKox^=OGm9%s`tR~^I0901o14S*LU*_Xnx*4Vl-1TsccC_ip%nf6qofCa;rDpNzyZ1 zf!7w^Z7BdN8c4O5Doqn2o5ZD15)*iWy{7p?RmTG)Q;ecGtUzlD7Q^Ad<{8*QGpu^( z+uq6uZklgoEdj$RsV^J+!Zs#hO2^>qF~j36oIx*LpEK3xb`-F~ye;tUFhdG5IvI@M zeH+i2wRwFD&`-XSXl6gv3&x``3=A!>OaX(_4is&?9SI-|HGU}dfkcTXvcGt|J__%` zzhZ*lL`;IpceSDHBfqIX-!YG4^w(ey`>r-eP_vOEqAd8;zNfj!j zkB-)5*4$S0eJ5>H*FH73u`JA#N6Nu1fX!27I&IV*6s!YA;E_7u7S@4fx^>t=M6;I> zGmliI?_zD0b5;$N(e2U`_R(%oMv0BVAq>4!s+2lv@PhA9)B&=WThphDVe-Ktz3M~=PT=k)#PeJC*4IMNrJ2Hol$3RRLal6W;7Cnkt zqkHfOfFaDWh%1T@(LvbiG)~5dLae+`3PH-SS=#;Fh)fpfC!oidD9SME%e(b2*xTW| zWB*2@Z*X9x9JuZ_-r@VXc;rTfH!NFYO`q3wwwvD8)qUhNEjY^77RsYm=dppU7-jn^ zljuXuwEwM+N!_9wKj`;vmp7`*!)*G?20o3cPxB9E`qExM10Pt4t5yq$@3MPVSU3mL_!46Rn3^DFR)RPnr|Ux+9}ZjsiVcxrXx5tsE9EiY>e0wCI6 zEdY6o=U@wlWj{?k@iC5gOobVJ0hoGB+fxaTA;{g4({^ZX8oL65W!G5$t25e2<+6-5 zBNWFcHPuq)HjaM?wex4xHNOc)M*6m{COp?oxyZ{+!DKXAf!}!qM6MVu7(tw{Gi9jP z{SBG4UP-hCx$uDR9|Z6qvbx#9bV4h!F{%BefOuk$4eRgzd1ue%J7~Mhf1gvd%VjYj8pWrxiIQ*@KQ_bO!jmPi21J3cRwKiKY z-~U|G(VwS(nVydHKzvoxOFXp`b6_VrzTO1Bk1Wjm=*oTMUjyU9Bj^6Z0c~tw)q#;s z+bldv$Iwt=GyZ*IQ82)O6XUYETELp0zobV!fF#|ML1zCQ{ z6M03mxb>z*RrJVefp+V@+DKMykcvy4X%`&uT9lzyoh-^?FCla>xBfBhQhlM0FZhGh zMHIKXoEK4JOZq_ss&FTes-xfNa|_7OuOaFP@(Kz?dMOIc`8^O;q!@0&rI(d8%ZeQY zF9nVo1+_cR4BIhwW9piI zI?n_=T(ga21qPt#LF(;nI)pFW`v<_T=i0%kj#SVCk^6Z#d{rVdT2N@JP8=_=&%o0X z;4a!y9cFG$vS}vQEN_t97-MR{$gD}hYe?HIO&(35eyL0?L%H=}zW~^@Dud0B3!(Js zuZjTmveu^KjcKi!9sp8;+6>E*cIK zU{_Ea+%Fj-OwW9p3hmTGmsoMBC()HUSybb3xrk&nRh_5lpmV+Pj7U?&qeD~_7#NG;qWmC^w#{7=o1UOPv+OOD`RfD&TK zKQM6wo;($5bL36ho^HSQZX#+H7fr^+bMGo^b>50JSzw&_E5n?{%&r7p=Xk-!W3dn^ zU&s@lD*Us@3@K0AQG7E>^OOnYDci}Q>7>@dBd($sbsG#<@PdwJ;zdlvq?5^RR@OpC zs!FUa{WkOXIxG-XXVn|B4K4~?$X1{YX-3}bTWxc(TAP7%Q?k>@L|qu%$gZrcrg#By z#8d&@Xxs*6HLW*7Ae=9hSXc?de`8-LCIg6l*ARb=nI^1F{gTRv>i-BgSQE9c!&-I2 z1=51|W~E*`zC6x4n+wLVZ~6V^9x>54MurHL>Cx?V9nj=I+ZD$MX6<&6#Yla~C>^Qw zJeqskOEv(lY+$56Wp6Q4rGgL}6SC5o0s8%95C5cDtMub(C6qK&*sLVe#07(*$BNFV zG+7KaD%+4@$AsL}I%e(b>;rrK^2tOC&!>O^V>Q9q&)Bu} zFWw;$oz|?_<<_>N0; zwQa%L^ds&0uzy;K&f#O*h4Nd3JhX-LT{FU+c*IBvni){c8=b zOV3m5m7x9|0wEvtc&2jokYos=CpaBQaj}Wb3C*I+pk0cl_fp;bH zGruW4k|!mSiFFIbTR!-1D>1IIQGc34iBL80%ca?MmKM(J3!;GcCg z!VIDjgzOb;3uc*Xbw2t*)a;hkOysTtt3=qZP8*^CZ_O8jV_Yc(*4NMM8Q2^YJ?$8> z#5J5QrjeJVq4pz-67+y(D9>(-2h%*4Gx+mn75$OPj(4WkmamP zFyn$iFQtK8F-NShwf3OKjZfE8UC^!%CrtcnJQgPNDYF5MgIz!#ds|FY6*MElxr{0A zxR0|yTY-mgrckc_Mba1b2$hyaXEaK<$^D#uPgpsy#Po+x4+DU z&sQ-SdeL|s7ULkR{I5ajr$rIQP@x$==$JMHsOyR&(x7H#-vJZ+M;-ndOlv0|2c`v! z{VvA(qPW$}NBXD5BMx3h9??)3gd^I+SSNu{xgVK50fkx1_B77Ah70zIh6|hYJaDW$ z_AP-nu5}YACnhF##qv8;#=qbKvW49(RsL)LbZhU~m`X1smtZ*WK0F4vL%_ zur81Jc#Jk^;hCW4P52FVR$-Wt1=>s+tTmeEWkl{Jd4w+vkmI`2)-4BBal(0&JZL}?%U2px1z$N zWGN*{?RSA9q?2NXjs~PZ8%_P~;2L^N_t%cuKuhn~u^>RjmTRWiGcun4O~s{*$H&Ky zTe(1uaMw*x{6_ST-2N5YXPw1vRH4AaW!8XEEFdZ52f^WJ`O=x46vL@AweRm)v#JWj z6a!_Klf2r9CKYYygc@CkiA)MeX(CcFN4q|z+_aCqv!l3rW-x`b1H@}#h~a$5U>5pJ zA5nK1y>Nr%`6e!BSIRE|CojDrv1CL>iB(`vO|~T&#VE-kYuZXDK~Lx6oXtg&#L()$ zA%}G&Vk;u`Zs|GAxjpDLCT|n!HWwq){mtd+l^%hlxjehlqmVS0pI^0Z9%%WY0(3tj z)>YXN**_xB-;~y1X$?d@0|M#7{o7L}`nRzBIh{ewsCwX>&gNYswOQzBfyQ+XUKe*> z#noYsc^EBcPf9M!!sEs@vJDj$j3Tj^46)H1!jhhzuk8aM3c*6~xM0=&XZzlh#;W&^ zpXz;6`eU1`ciNggb&i`i=gghNI@??ms8C*i&ArStW7Qa}o#8o;#RJ<<#K=!*U2P(x z(V}*ovNlee;r-sSgAQ~7KnHc+(6`I=K9FzM8}rRqcBFkF-bonR}}gnpI)&jA#CImbBxpeRMoVgKAbQ00~37 zh7cPuX^Lp?8#7`JprV<6oG#k6ubQo!x>X+3^(-!N<58^rZFq2dXmb2>AE z>*JyiUirA-3sb3-gir@=kX`4_W`Hy)zkx)9g@?ZsWJw?hWACsIx2>Fry~;jP!{ajx zzC`7nD#Vij>ZF$!78+eJ?@GnRX+l~~6F%#qen zM<%$#i;WQrVJxihG-Orw_LKeNsw5cVWyi#7qf0%75_A(|8uTJwY~(41zp0Q!6n|)~ zyu32j8g)+A=OMbo5|k?VCPg|l_ zv<-l@#*6(YkpjIH7~V;|9YtBsl}a~i72amJ;9h_}+vi()Vr}a6*!IkK9~(RcPG|F! z=T9pZW**&CRmn1c8p){|jK#6}D?MiVFQmQqn#D`r>^?=0nVY)kF>9M@xm2I+S7NMP z!RZb{-;Rf`o5>y4p+EnTN3@m`w%rfSl8X@le~;49iWhA3h)EZ7;R6$?i6ylm^fIzx zqw}v7Xq_^50(GJ33Vr-=Q3={IFx<%!0xWb{LH2s5N~O`}jRpsaZNA2esfJu98pd(E z;)V7J`)Y5ePmWLH7JB021$FLv-$T;bq>W60sftV3bzk_)n%9AE$@gD)HMG~-t&WNu zVNMxQ*CAX)N1f?&(eF8D41Z5+o3(#pAJX^-#@eJ@>joRtIBK*z23zX89)iq}#<&|g z_7Vs;z$Em*jb1a%z%)Y5+}8nFP7#G*EtN5*`__xbd1CJ~pVc-MAQk@SpI_f+OM?p( zM3|@mxu$~7`{C_3sz~d9!QNVYevqsV?Ld!3c0lR3_L_Mn?Zh_C+HS2K6O6TLnaN=K zk4TC^xAbDqz$J;#8$*`%7N9C|DX%DRHQs=7pBbY0pAeE+{r$5+d<#v9O^h!4;8T@F z4GaWQ_HpB3ixM4(7;t< zVs-tP9y~ZH)479PM#SaFM1_zl?gqQfNDvo9yjTu_zY3-v&Ej^RQHS;D$IJ2Hq5k4E zXS*5DH%q@cEdk8F=ejOGN+@1bQJiK`+=i>$nuooq8uX2~;2-H<=2?%!a70`8&uneu4irOJ7du!FdmFekste>7DrO`Q1LQvg87=0UvuZps5yr!txC7As9ZFu(lX{*==SO@=ZtVXoPx$koR3UheC(mhJ_Ooh zxI_Afi9Oy*8&WgCnC_ZA33uS~sSbJwkK_ogKrbTJ*=@CvExhREOf^%H!7Q7qpstVG zXmAFOaBmy*9AB^S`>>cA;HlSmmn;6M#t83yBobh*%F$m`bb||3jA{S%)|;l?p&WsB zbc~%#`DBI{@47FN!2KnGbE2ewM{jLSG1a8AE{P;%JePL;b{6bs5JOi9oE_w{Au8J6 zgi@B{u`ckU9b+tj;4;3MR$L8R5waxYZ^rpz10wW^TLlDlA=v z?)fq)@JWWX!2dx41u;!t6=$S+=C^8u2;wlxdF<+h_`jbeR*3%`&wS2B_JNh^35&;a z_KZDaq@ zmz89;cQs)G>aXCi&l~ugn7lUQA2mNUGB#W&`8pbb^sI_vI(s!OX8&V?$>Y+%N)<*ICVD! zkqP63Pnfb52YrK|=zZDB-}gU*P4aStO@D`ga76w1QWPUi+h?xh54e8i)wU@Hti6Q; zPSK$Fsv}^Fjv&?)CZ?OG8R5?uu7n_cF_IInNE64;fE7+R{F+C=THqA`?Z}2&+wVzB zkiGV2Ow8B08()edChkkqYaT(wk@-z#a4a()@7?`U6nM{*Ve4L^;(nXTq+b(2K!<(s(oMH_z2qoj7< za{s^jmfxpz`4m_KoL3v-?>6ZgbhIUPT#~ikjgY{&UU1#}q~N;u8B|~LdJ!&Jloy?FVZx5NcnfxfK_isn zi&@L)5ZLbyn zNOz(R$djA9%9Hj@m$kqycURR&3@qL7KF2p2M zOuT21_LF%(;sJ%FQ(iNxvficG*H65MtnOu>u~*C^O2P4-`G;n@^yN*bTm4Tr44Ceh zrzmf&8K!se@i?b^iw3-it=FtrTnivUWkOt9WOqc&oQm`Yok;ORZnf((57;%2uD#4@HzI#dSqCWDW7*A6U8sU$tS_ zylp)~ixr*CSLd{tC&?<_P;nWRNp!m?CaZK6$Ny1XkG5ft0v*hnY{)Ii%m~B2wXxd~Fco{Xr!!Ue&~q_4KK4#94+AzVHdP&EdPbjOz-A0x zQu003|>){M8%?V8Xe1b`R#DB)N&x zXd8L0L}H2!<Eeu3=3%39 z&WJi?=!cD#22NmeCWj#3;m=XjhVV_HwvvuI7e@UGED_F#?5}-VjTyOiyc!L?7`abJ zL_HgJ^`@Xh;o54(Ih??6y?OJdz~y7lBWeOIya}Cp(@bOaz5J9Dx(aR*YJuDMsG)=F zHHI~Jz|E>^9bN%-_nY2TTvp)~+zvXhXL?<9AjXXNaZqLIVU=g(T@GR#OdXG%Yd3z* zHXb76m7d5OXnP#6U}oa0Y%LeAYtyh#=eJqpS3)2Xh1<~2 zZnw-@1ms%lZ!__Ny62lPme%xrcooL&kv>-t=&J5+$P8Y^0;bw-5p&%}D%!FCX$YxH z-v#$HuVvE>p=H2nIJ3-<>XZhKK)Ot$w!az*my3ROF22cf+N;d%kA)g z1Yiqkh=STP`m6rv{aSri+_W1^ z*x1!8LgV@!Uw5qSo|5uMjNf*$>sYAv37dE@@7It;GZEx0PV8?s$;erJZhv#P5)!VL z2RVZV{bXBYx76o_2}^}nLO!wh`N>i{EcFpv^W)#+Vs}l^R)yrpdt}h*imFMEcyc0Hb z9gDy>$oS+8**XIQTWDSL4RxWF&bNiio-OoVAfo}kY^(m+sU$%)TEnO;KBJ!L!ldye zrAJy<_;CB%R6=kJxydBB2vqKRW^&i7P&`|w0F)k)5tbg2kt#g`Xm-WyKx$HuoUB}v zR#nY^t3;EPi)clwlQRH9H1;?N4o=TrCly5(pR7nud9sSrXhk!8Mow0wrV`vD?s@Qn zliWQIzhkloILEXkO|?!7g6RBdO%&K;ntMI+O&{vKSnq>I@8JKBmbrqWmxXAeL40QJ!bw@RxWabZis#N#j zYe}a5nUNsE>2)Wtj$thN7yenAcSgEjWORjKb%Q}>B%|L5#kpVy1r1MSuOn(O(!ByG z7~2=s`WqOjZ;I%+J{(Hu5BNuakiM-#!kTLR76-Ch*z}nxpo*(*3Ts!_ycf7a{zIMD zxTnmUykgyuv>yU<+K-4r52iGHbi&k&Ioj5sjtRplASg~R3<`zFyo|o~e+O}PDM(dS z&n{JuKLGx7%1Nyqe68~Lxsr*PmZo$frVTtX5z}%arZqe{5z}TOrZ=VrJ1}-#&D?NI zoN;{$(Z#@EV+W`E0AB4rQOCjf1kbqZ{!=&lJ^laLje1+_(;Iw0pqoNuIe6(H zsX_fINkzqYoWVREkB_VI7^SDvQA@}zIvgHAROkt%XGjcTES_-SS!t#_*lpAkiJY#~J>gUUc$$-43MB=3NSotyYa!_pfr3D-gbIK`e%YwYsEfCFYL&) z=yOt64eITo3jW!@TLss;@^_zXjvG>G-6k8d8DugH3{e=^!IKICJB%K=1v|y_d+^14 zR0$3p>%p@rvli^V-vg3#dyH#PTC!K7OQ;|PP@8|y2XIo+w?&lci4rf~i}W9bb#s$! z`heht4?v=|!arB2sC8}OUlb6&jCz6z*EZJ$nJ|*Yaj2-7I6N1)K4fCY$64oD?qc|S zUv=l)U^runFnw%Dmv?0_8Rju%-V{?QZl9pdD=m-{H;+tG&l5_ZE8Nlg#Uf$}k5A69 za?1GKIr_^;dlOB-YG*)F6fpk z_OdOHK>Rp6Z)3Vu#XNXw%)h#aIh7u_OF910YOY$(x1PZaF_~p{NFC~5Fi%usFH;kR zxrtIy9O04z!{8j=1RS%ADAV1(O{?h^S^=cL_F8GK#i@P-^84Ivc5kKmv78DRWGRx)y2IrJeU2-grbu54yN)rg>#`T)z(XTRjD z-j}dkXPv(Sj&t)8H3PWfWQ)gRu0Iy7fv?IcYuqXQ2pc^fd%<`DSQy0OuSLW!XIHQ! zh>X+AQB`vc{xz~h35*ef=fl6NY|TbjwpVz3L1*JJckTacZ`zF}#-y6yABqqqhN`a-UxBeS&oN|(RQR%DYPj8e_0$O^)a`t zt6dhbCK-UqRqEZUu`s^=WXkfsn&>;4agyLxsD~si)5sdi3x&=x)HU!Ed7njug2(j`t-MXmP3WUp`mgsYgcl zXQ}$L*8Ry_9lBEGg9P?lFlK1OIhZjtn2$<#uoi~Lyv6%%3T6u7%xD338hU%Rilib? zzmly^(8Kgmf?6ukYAdGc9fPfOBMKS1|GQ_e+8JW;&_W6~?@dDzpgMfIvqLV6o zLs#jE8U;egl+)3ZG%zUdfv(AHx^-@6jo!n+7-sHDv$N`b&AWFzvs0_cJtkCfWO9+J z+oLL9i1cr8Que2D-H{MYpZo$)#u0|33vs$} zxIJuyU$h$7Mf|rr7Am2(=5K)V#lc15-s0`88CZ(%xd0iEL&FtJhr*-a(`C&Io9Wq&|TTKN-LE#=IFh)i1d{4BXCROZ= zwO$H+PiB@mOfbDfgx-xawMHtUy0;|Rmg}_1f>ySBb6TJ#K~}WrIrR3~4TLIh=!)F1 zvU*6@bk#yW;=UzIDtfq35T4sqkswRNFRH?TlJPj&3We*qhHu#G2I})IC;DyXT_gjT z8`=2)0v50IwvEXLNSg5`_1a&Bs&d(_TmpLg%2)Hu%O)tMTT(zaL5A4`E~*}GNFQKC7X<4rsMq1< zTlrp6Lo%rZIYXuYu#WZ$1lw%S?8<1?(tX=f z@H!s@Oa^zJf*>P}+`wl5!a_YB{|cJPifpqE89%{7?j2KQM zMul;US8y88ZuWwfT{jEZ41>rZsRefJVh?H}jhy9vScp`ciWfRk5NY=U17n0OpDm!OHlptff)@sJ%(pTDF!WLOmiy%Fqg(GASs7;kp zL%%Abl2n+$rqIuo_L2Fp&BnxISq-&-$fh5VoJuKRCEA2PQyoTYBFx#i_o+1%m(>+4 zV>HRsxGV6=X}ra8J^Fc24%-{wOvW} z{9NHo*YpXMqED#Y!33Ibz7%P38P1{UP$~kPHla(An1Ja|1=SV_6VQp-+OPBI7R*;F ztg#+j#IgUOVH7$4=vRB@67IfJsP7c+JHcvWzw_^q(iAk^>$%=H3=I^U0?@Z#As9sm zcpidL^j^usR}$k#O!s!GK>VwDG99S8HFlK`xrHVM&)ZG4{aVG-N!V(tt#Uqc3eesz zL~bM58|!IAd#V>8hlgKnnZW`&&e4m31Gn?u)lR(E5@4IxKYYmvU3+aCtBse9HDh8} zmV8!c(-Fu*|MYUP3#HN9; zYFmX$Lek?IhD$i}uLU+&wCl_=tMyq_UPc*es$n!g6|Iznr)(Z@O@3U7g(nOy7OV( z@O$Of3i%0*p+di#1K(q(^j<@^`bLyRs42QAy&|R8-9`-ys$dZ zZTxZcYS3KA=Ff%QfG$VU;jc)!eB z9=MESRC<8!L_ee$uN6eS=D%hp8oBdW2)vI9D{MmgPcwG@iefE}WCwgBWH~^J!)d`K zK=;O;2c|c)dR)9H@J4qZ;q{Gx7yz}UkqoO;zYFGS4RYGxY zi~GylQ+ONuG96oQe#U`_@D$(1z0f`KwVtcCrJb~77%M?c-2fwF+&!xA)BRd;6{S^c zqPa@?h+x;B=}A#=suq+dm9`Hxb1?;K3d|^`BUr5?qAr2A51yo>dtMZ!27zDE$tl^; zNf999db7~yH(Wc|@+Fmk?3#$_JHF3P@>~HR+a{s+s_PTFdg`rtn-#xqWMjHfQ?&)cG8AqdnvG%M6poD_ zP?=$>y(Hb?g}Ku}_?`vj{viVjWwQ->QY5yhMWGZk_y=I^dJR#`_ThwkTjr#*hA+ic z<vH0RUIix_ZD!C;aR8R~xH9>V%rzH-TqV+%;9H53j2Fo2HJk=@yT;`U^>wQ2lqp z6-MRIx0xEf9emPV0&r~68+!jMODL%g+VGWmRsL^Ypud+^`WqAK_tj(HU21zs`0=XB zgtu)t$|l+blI9Fpy_uP1tAF-& z1=mrjG7hNekxEn}jQ3Qp3t`p;xN%8EbD;MCr%VaUp_$fAIlLrD4Jt&YRS3JPik4<1 zr?pZjRy033LrJ)qTLw{Fxe$Qj?OUb$J5qa?x!>Ew2>0^Frhg$^X&bfHHZ(z$RaVyC zDR1eE&|6eoGLi#4jImsK=YACjwT=&mHPVNw-^=)LSUU7D9-@b7lq%akavCeoptGc6 z0s9j{oI~s_{e!5?TXVaMo)umL;AGx`$}+!*PQ{IbjuV9Uv9G)fs$o5lFY{V*39=>& zPvj1YeXsqNO9d$X?(c8kpPiifVZzcosJjdTIW>OcE80d0=JLQT`ZR zC8Ii4EFlfO05f_6arX+Uu|kA@a5RGAQXA~`IOWQgT9FJ;n4r6L2>eXRNA5soxM!ax zH@(^VN+`=M+cprzp4^_Cks9*mYktRoPiC`RrG_ey*p-(0t4_MV!I?~UbYR0H+b1^R z`G)Qm`)&G~``c(z_*<5|oLvFdxRv!qvQ-AmSqphs{$o3@CMdc!RhgVH0HH9T`MM7B zy~g%Hg9U!lOAg)4E9+VKKyQ;`{r>CEkrpFG~~+HkjZTz z>MHm5;o$$GnKv9Uxu)x6l`K(`-ci6Hd!U=?ZeGF)#mOG|qItK-K^?qHu9M=z_5OGq z;bRH?KsLCPlZ0S(^yx8Eg|Ff`#d;r-4;S7*jK`6xRsMaJ3_a1yR{n&__$IbSx z`}75@{^$;c>3#HqJb-w*qd)NImfR)lWJPw1yW~1`ttPm2#pEVZPpU_D@n*VB=yg&! zDhai1U;wE?5Yhu?H{=@Iq-OaXyYCfXjW=;ppm;e_UE0Rv?Gux)^|ro2%LZVjOdBXb zBy6orZ>^ku2|x4(YcdT6Rb=t8Jv(z`!4(F)E8PULhH=9Nxj{LOjSBiKNbWQ$vhs{S zkEz7o!2l=&qI%@j2elKXRRrK0>g9LG+xnbxe>C*CW}tHVh*F;)@N$CJlpoI!@)K+7wVlN_LDy~Rqs(|GhHk1E_IhZUKu1L~<1 zuPgupwbww$k;bC(3aKTOz~7Jp%+!O;9X6qVts=;5agBhFdd{nN-@fg!WhlVAN;piZS4&Fr4*<79rM}{sTNR(3n zv6T2Wu05stAfTteejUzl_5XxhN%P3D90D@^(6WH=slx~7pz$0pk-7 zD53g31PPvG??KBYCH)7L43xH%C6o$FdBB!=51Ridqc5PXN}nMWeFt&WocOcO1^_yf zNapMFmG_Dlc^9HkiDNsI<8fc^t0SrCh!%rbbzyk!7flL&B$gPFnS}ej&|AF+#Tdr* zTaQ-132I4W5dA9^U>d~fzv=~mLh*(AM>j9E7AE%0i`#ym`-zXo{tVMO6n1i{RElFe z;tDfQO`G^|IF63(Fdq)19R3aJ*sSrV^5nnKo_w{WM&#NM6W-}?m40NlDvI!tcX@;s zJLP~fXIyE#B$^lB)&@`s&u>5lI9^3~YkRi)mRWtQP5>uRe zfp=DmaPZBV4L?O=2FXGcO5?#wJ;>POQ=)ub=_&i1=wa`>mIJ;`LA5JnF8U!594Whz zEStk88`5sD@{1{QV+Yqy4F*E$+q<|g14&bjXya?MiDZA8u>MNxU5vzrybuVJqo_PQWN0Zq% zCNGU>3r1RZam0=Fz}`VqLTJhe?rH0WF=g0$4glQhmT6R&Lx`CSjf$)y18x5#z;^f`{*3D%lOn=#%Af_5ROJI ztb2=1mIlydKxL|vPUJs$vx-KQ7{zu4b&Fn(!qqV%BjqE7WWB0xFjvpedIECD90c}1 zSa$bqw$`f7w>jNsA6T8KJa*-|44@Z}Pn8!JwrZ64?-*ot0i4DRjmM16eAq~KE|F!% zZGo5U%JBYz=7b4qt4!)FH!t0F+NDAOgH8sNGE-nRPB0TDNwT)(x9G>p4hKw7!)@NR z*MdbtlF?OHTL6q{^@Ph;01J>f$=a3(mVqHhiSoz0Lldo0fGB};+K!a;yUqO#tEX?i zfA{+R>mR?oe*N96*WbN<|1(nW__@STuOMet2ED|=x-`^FyvqmyM}r$w(&M>2 zhd8m4Lbe2uWO7JewU3H{4$d&s2ok1tt?drvC4>oMm6Ml&a&iQrJ@0^&Zt=XXvmHdD zH5F(`=vA6#>vg%q2U4Bxg>Vucs$%XEd+qt&Aq0aj*N@wKhXrCAsPp}8H2QzUD887S zE}E%am%LFIQtus~1yQ}0Z8==(Tu1vsWHcEFG2}j}wccaWil~ImvZa|#NqH^`HC7H3 z%0vvBrxaRWiqE{kzab&G&Hza!*vu}uqV$G@JRl>_8i-U=?=*NW4?%5|I2^|L04ZYJyaSsgUuMl}M)LARmZsOFlUS8aJ;t&`2OJa~4a zo>j&4)2hpNmV99AS-0c;y|X6W6B$Mx=yO)GvkaR@(!{Q-&=y)4gUOE&B&6&fTYI+- z?s_AWS0c~gL~chWhR1fj-mH={mOnubh5RK46 zWNuEfNd=kw20_>1_C4JUX}YH(HgYvJsD~Qw5EO7tgKIw1v`_!UEcJqla~hRN9Ye=p z%TwLRRGb6$;-b*uH>tRw)g(JP8;_%c>OwL3GKY{NJUOWwy84)Sv<*M>((dGRryT^$ z{)Gc8T}q_VOyzWIOPasD4kGGlNS1UUZ@D$tA(V*fE$*Uj-8is?oKT*6oq{2_6N*rL zo~hxjZ|>NGsMoVjc-3lWI$Q9B%9Ky2=Rao)k;qg4s-K76)*ER%yWq6t&8{>fc~y&m zx{H`TDorocFgpq=l8jgwzuW=zt$gIYO#rC3ZoxTN>4X;gJs4^%iRUeS3%_efc6DR+2vWXMXeIoJWaMp1mV(>X$^JqzCL>oRQ%sPhP z&Mn^2%iNmFy-D#!Zw`J5{=trM*q;as4SlCksr*Uf-I;J@_f=4LXq$B}{mxU`Kq0)m zBB;lCi~YB}g9P>#JfM56cBYKzztC_CNmjcx14{>99QjxazjpK!jLXz|jrXU~Xa_D$ z^Qx5c_&sNTX)e2wXpKl)AjTar~-$+j(BU_60x#91ie+j0tPi$DooBT9wp*c8&pI27v-X9Wv)Mu8*zg58wg=14lR4 zuMec`hggK@ydKIv8e~EMKwWIZ`6@d2f8-Y+vwM zHeC8M7(TWQGb}zmX$6M)O`jSEiGHL`4{`ge>_DN_aFUBI?x9@!t=lsEBX=wXP)PP^FrJ& z5&QyR#|oPJgxUqb; z;2~bJ=DCqjAL}eD%EG=<`_m`S4pqEAJ#IVKgZa^U=zldquJf8@4a4c(i^S0Tn2`rg zjm9xIuyHyk95ccVj9Eozq@>2KH?Pi1l{Bro`!j##5q4Q!#a^t8O)jfdRyFh|rpk*r zNHODxiHM115WnzFC6~cNCb^8`1Lh_^f)D&Cqna=~OC`+0#v5D!Qc^8dz3w&u-RWQ{ z7rhd0EAWbCy<&D#aHZO~ztiwXHW@Lzzhu2FyC$`lJvmHA@=@9D&jW>EsYV>bv9;61 z?l<4&mo8FYYgCHgdPomKzlIX<-W)U`G)l=ZZBjBfBj&EBaF`;Vob$>BCBl1788HRi z;&-LAa$<_;^$qvKol_}tKdPCnqHjU~^L>lZ*pLwrOn(Uxl{NhbOb}Q@?p8eab)i!K z5oklD{(}g**Gg!5O15c@&{y?zr%h4XbYV~6k#_8cL1s| z#*4myPkV&i3?@8Uy)3mm7Me2;QR5UKHBMvVUps?qXW_Na;o9d4{k&7B5B#U?hsJ~^ zOe%@9#Pv;Y(wWyvXI`s)^I8#@*K%!M13T7=?9vUI?;dnAhn@#ZgEe$Z?#T_=kuCYq zw@Zmdw56M5d2&XqQH?L6Te^ajk4Z*$bem-41Km!tIECxU8tx=`XM%TfOM~H);aL_1o z-=|wcII(o$#M>Yx4tC3Cx}{$j$)T!Ms~W5zUQlcuCK}jsrqn=etV&S!ynEnK@LgYo z1uRi`%h0x?BPBDAl#RIphu-m$xFLhNcq2X{`mO_ z7#yK|x{Y!mx-QRsx8fr5e@#kYBY#bh4O&#H;Vhri zmPpF|RGby5pH*0L3#Rt*-o*HVoXj>lOQ&pPyE zuA*$1giO_iQtwPIM6IdIzb=|8^ zH`LZ63A7DbR!+`hKsa*`4yo3c@(MQsb1HN@xeCEB+qdV-2jt4C(EEEv0&jO1li>*= z;yJ(z*zt2EysbpixC4GL0HnlQxVR^_8M1Wo020Dqt@xH?tz>tyQIdLPMfNHYExDy@ zZ`a9GBdoGOuF0JWF!PhH9^H;u$2ae9e79=13n&YXH5;Ayq23Rvej8ei$68@Hru25< zDJ|KeJ~>N@v`*mvGqR;Ka_zS2?fLaQNw$jB;hyr#?G?Eh9{%lB(5xG1%)PNyEFtLN zURxuo@p$LpQ(d;P-M|=W$QHSh`CYn>38HfnqkoDY7F`<+kyg9e;>JT|GG5M{w0%7Z(H^jql&|KEoWGKItn+ndFbXgXrF80lFtM`+qQi z%3W=fsIS#=-JamzBW!BVb{KdPJpYt}RtFg&)E_&vB^?gJS*X6vFPlL-Qec%FG%5L% zG4tS%5E^KjK?9BSoO0Sy10vfPXcTfQS_iM23L;UaTcABRKX%5)@JS{c&nJ~>^NjDg z%8ZT1_f%Qgs@+u5&<=dmu!6jl*AJ)!iGn!?^6{~61u|0zYc$=DNp-Ij?uXbzt(`woi1jnv=bo+QZ?s9JbCKv zP2*Gb!b{Ed-j#09slKd4z74l`4zdbQycQaGSyne$`Mg}OG6PoE*&Yy>2<(QClCL*A zmktdEC)jUn+NZNv2xV?`b%OfZy{NZ-efjO+D?C(RG;KY{<@cqESC$=bn_ir7ZUP{^ zPT9U4+AL-WyN7I?Xdh;I=+JM)4;DN*9Kv8E0KhdoAQ!-wbzRlb=tU+()g0Y&Q5NE3t=ucmZ8%E8=0-bz1fv*Qwt88<8LH}4OrMWBe-6yfO)V$z|1+2w<2^` z5FjvU7q=*ed?~7$y+vCl=A}tM1jl=NWgpMtILxI*!qwv$hW{{QbnRE<5+xpg)#-eY zVP4SgK-({04h*<3xv0aPlYt~If$RkOF(V>A94epmHt4U6MBJ>U!+~4Nu|DX+1G(DW*+!r*7n9UaDJkHK^pG@ zx7nw{;)Q*iUy9+~o>;mS#8}QCP!|53ZVv~Jf9zt9t@EcG*n3qytd=A4Z641dd-iWS zd)CA-y7bwfa^gLaew!=j^lQOwMy*7NtslkUg`XguR;P{FWZKr@JBJCcUihO6d-TFU zWZaUPN!I+H2NaTbcdIs~=W6k@X|Mo(K!LyCJIU)}JrP#@_!MWcs2YB|dsA)zVAS9> zzgHy@c9`s^(uW)ZoepYMrZD2|}^;^Le!xfh=7kMpQDaOAFLVccWeq;HX~SWYLV^ zf7AbtN5t99)6xIAy}i{};M|$+b?WcvrYeh(PE<6OqBGL7e5e0OoNZsnF%xSGG4=cA zrZZxUMCrcuOi%h*@1$#<4$h?M8R;Cp)Bhyy;N1HF@BD3EVbX#BGmIfWBhIPym(Z#8 zpPm^^Cj_~?B!zosZDWtz@7oK_=Yw;8Kw#jp)i)=7}Z>$IL7W6k&%*{=8vC8 zS1mD)*S&c+ob$4JL~O&(W)LUp;!XaQ+xe~-gVVj8CL^$SjQl~?SKPE!7oJXqHOZ_R zxWI&3nBQh$;cs${n~@S6r(QdQN{>&&a;-lG*SGqi@P_p7jO=B|iwED9N_xT7nBr~Y>ZQI4BGy%RhXPk^_N1coLYh-y)QP{lC)}1k1=_mT?kTfj!w$KComQ3nD!^Yy=1XM# zy59a~NI4Zr7&jUC}^4=?G)zyjACv)I?&_|{5A+;bDjCi?v^=uG9%F<6bZDGQN`sl+J&fPtrR zf38|9zkLevBu-;;Ixyo+YoXBeFX_y&Tx7JFXXlj7vm}XiblP5}IA^VkpKVR69gnU( zp#L@Zm21S{(y%Lf5qdx@@etg&F>hUK^&i=HB|RRvh?as5p|6F2)q9}>?18{NJyd#$ zK!BZ*Qr~6YrDjA-l`mP&@3S(BG=8twiSbEy5Q4_MN92``l)$NJWf|m1HWsM}h8g5! zw+ZU2K+b8VVt5N)d{xzonAr8bFJU|FO-#l5o4lu=4StD7d>q(bG!w7KguEKy!aZe^ z(?5f^5|$lM+cj*RW&~Dmg{v26;8@O)1H2}AwGj|obf0Z;X{9;J1HR;qOjksMS13WC zf{fMx`EW{>G@qOjlnS?4?>&US-q7P0;L9dE{G$XcO!%V!uUB+Gxs6YvRdT9~iPz+g zJdhXU9W8mJZZ1#O@iRQ&ygLUxuAA}r*ueK)>h*Bj68+bGdo_QdmSE0!8Qq_}izgn- z_U*~Ln7p`H0#X9J@rp-LIjQ24jJ!KJWuM23NVi|j9UCN~ zO1&d_3=LAhUXVLlkq27F=@wdXv#8QL@<4ZsGJPN~XfZj3vJaEH_~b>LMlbZ=@5l>U z@#qEdUi2b14G1o#?kiqctHLWM2bnP{G}KH6FiD5>f@~OmvsLfA%g`@2Ch{MHTq~ z!P;0jPR(QS{Qdchd6K;MqFIM)fw{LEkDCikmOKyJ(zKTEc{d(!#^VP7BwsjM&5B3z z((S`qcz|DF6_u)Oi-7{POv4wIZJh3O^}svr-+O3-RAPp5fb3URmcvHP#ak0f#9OC; zu6cyU%t)ggD9+#1V+4*52e7P@icbIQFVEPsXav?%OZM#vJeaBMBqLSqtTg}3$%q$t zv}xF~s&}K91UJnQeMI)Ss!|(5pZ+y(+gS7d$kiw7lqhQhZ4!{t!ZfT$v`(fGLmt;f zeWlLjF*YDN%trS(Xo`ZPiO1t(tJoz?toECv(WYIHyZAD7gmGFL`cESJQjyT7V!y-TdVtVr~3(& zmy_S28v8h4Cv5TxC~0r@GkgMgYa6ykGliG6f5aDt0T4x=dEW^Sb`jH}6CNk0gk7An z&w)9j60$1U^dYN7^b3;B$?0dBO{i#9Yo_+KN1yF^d-PCk%HpVIa#J=(8aaxK<y(|I-SjC(_f(DL1H7xp+q}=u& zu{ki0ASXScc88F>rt_s2)o zsr_3iIn4I9)@mTVbt4*2p)n*&`gar)Pi77wdHYfnIjzmF!(rA@j?jk9roqM5x>IUc z;L3Z5{*(x5N)60|JvrIq(uPMW)}D+|8fp4X#jzb_U3w%X0__RN3PCe>4GEQBj*D)& zYzqc||J)Fax3|Dt71BP7z+%JajPNLie3ro}ozqB8SbX9TitYYLPUDlaIh#;UWI}n{ zljp1}%4J`Q%L#kxK?y=otXpslw*qP&uHVfyC_ucSBg1Rv9`QAc+ETX7!x`gy} z32Ai+y9`tq12heckfzPEIM6Fl8nY8Cz5YBS!Vkpa@l)r|qkr?s^071D|K_0QxwZI8 zD@@wp>#0j{>j`y93JbJQ%c|DGM+!I zc*!FDb{=1x&SIV<-OJ~2c{1rKvRr?ZdtU*M;EF{J3!H#^M&AJ76k43zE{55X0&K>b z+Phvw+Ap4+&ldjYTLmbK^+qO0@MzbsDwlAg`d70_#4(6iZi9A!wgbq0NRL1&B8 zw1T#MT9a(BwEC26OEzBex!=UKYvQ`!M6LyU{{P7-V=IkptWxFtZ!=8Q#yGYGvuc>4l`t0ywMuL)%;`k3}TU>1+{+=rkr- zbUK5>f{3zJBncYUGx(d6(->l7pzL@o)Fr&l@k*v1_#=jRcOpo`A z%u`B}i%A-fXA0ata?Nn&dPDKm#80YMjqwBBbFrAEO85A~8dujn+1Idw?ObmPJq3*o z7~I`H3&HDF!um?)oo-$F5HheF=&#; zusCyV+N?TYZj!zOxxSDo<~u&5YfP~-i4Bl>k{aXUGoKj3`_T2uPqj4KEJ%>Up+P&% z9y={%6M1q*m?%<~$dj`+ZO);{g!7RUV5I*>m+e$tW^+NjqAnMU@q5jJQtVs70pZtvzGb=bx+uo zb4YoEfGjSS5DS&SlMwNr`+S2d3iAi?gmV&p>tzip1H5iEH)K6quG)sN2G7N^WKkU_ zWlYw-_O;~ECWef&^(tDEV!9=(=>wUO)Bm2ukWQwq?#ODoBL6cZXa5CW&K0t-Zpf0{ zLPnkp;j`JaoXBYj;H?ujg=CXvBBu?J)0+vK-o#G!q;F8V=3?o-N1Oz=SqLN}W^)>L|G}F=<*qUhxxfzoZ!a`sdxnR>8alkR8 zwSezZ57pGOa=^FNNr`wP=4B1gK10UcM3|RVK$PXb4CA;bbsVQczw8FVQ6iyVcB3A; z@n3cWxjIShA93ziec}#pT9G~5Hg%Q?FVF@jMw;1>u!?{bgUlrfOuzl9$_P(HQo*sN z=uD(7kLqa#6()>>PLk8>RRp*e<#Yw9$1A#Bf%9-fKfv`ZkdYF{$)LFuAOg&QV&onP z!HSeBGYVLGa}8y?NuUlTBhox6rz=lX-K-qyyhXFuDVPcoS7K#cS0+qFnizB^BAp=1 zLD(D)?n35Y5Zw~OlrRyom21?lH%KVKhJ{z=p}g&T(kiViLjoeF`{J#pdbC%oD1#LB z?wD5~>qI(JobrVgc{wDho{M=7BCj^mi^|I!kOMF;hh64ZR*A()my_DU@Q9dH(BNdE@q%JUjebXiYk>sez}+RU67ot z$R=RWS_Pr%4J<>;ckNAlfO@8loy~%>$?05N(Aiu}CcZ-0-GeU0mF5}LlQV`WeJ(c4 z`qlU+Z2TgQ=XbC{X3nHk1+>8sw6RNTPqGy-xUayk)7jR=72tFwRgkwzDx!H)GEI}> z)kOUK+SKINwti2(SPc@yL$86&KNi!h28gY#+SDOSR{zDwjC>_EO`$&C_IC)3NE9Y> z6jHt|ffoq<26B^;XRpgLeyIQA8dwa?6nUI5MoM!X;Qbem& z;5vz6qhKC4sI@cTJeg?tZ{twYX`-f#2A(lT#d+|}U1v3(u7Go|(G>1MZ*)t;xk_T; zrdr4SUh>Mjs1JhQ^T&;dr(Gi=#z<(xLf`9U@1g^2_WK=RJ@-=gGf%q11(pa!?S%DM z^0UAg+bJUfe6DMJj)c-J?H~q1VmV^URV`cHh8ub|e)UlUzukxr!~kq9$bN zWt$=094~pZ19qVH_R-*qdE?ta{N@@{Ycq$>J+{67@#XW&}gDMJJCMPHk8V;0Ecj zfz$OfmaKWCfo5NF6({tnuI|-$`DVFp0Qq;>cOfF7|2fvsH?ao0`4E1%wVAr|@iUeh zUno5HjQJM0ej7j9wv*^nn)h`3YRqj**^Gm#jXhu5o4h^Gsz5VS~zTez23Qo;kicYa}77=8XczA z*SzhhedO^j8jB6B>ty^jWLfhf-5W&^vcG$2!A&Q*J#V&ik4vemtXV{hkF50|dL<@| zJSJ-3CBEJ#ePk>BD+(x()c1c?^P(%)LGxvukV2ei-yn>$RQCfq(QR{|I5!3&LyU@foB- zXIzM~@+*RyRiEiIZ6qcRzR`3ysgbT-;Qw znL<2YHF)IYbtUvi6xd$q^7t&JQzJ1RNs`}4iH9XKmX<`nDmpa|^7*N;EKAXqliP1z zELnO=t~EC93v5S{RM4fu2oe~~nij2*5$^lkg9f=Ibun3!YfRV#4)N(cbHJFZDeN4U zYKI5WQH4@wO6DbqkQ*@G5^)w07eU^!3Z`PL3P`bNlJW{B;w*cS2UMmX7G?gYn{bt~ z5uqxoct{Ejm~4gaO(ujR>$fZ4u&?w`t6#~RgoFxLcC?K5VvH1df}9=AuYwwu@W8jjUMat+kB70X*Egw zz6U^|;2>tyA*3)*P+1w=V5OSX1gxXu2mH7Qu6FX}nX#Nd@eLe9IxIeGi=VPEU2;$~(h5 z8{AzJWR5NIAbmG|>dB&eq(u!@2)sVM)6@BmqeFm>`6~5Nr!4W^L)`~MM)gr+bJ2(m z;-asJEid)+{`0r{oaB_!;oE)TR391Z_6uI6w!XM%%R7Ikzkj>GZ?~z|jI8bk``coE z54ShJ@nCoJCip$<-FWfFJworBbmbQoq}Yhssq5ZlX1rm%V2NNrq>n^Cc$HdP$@ZI) zL8nH~ZQa-HtLkJzW8Ib%WN4B0VPHFb$W+Y-CwGe3bq)`8kL1C)3Th0Ic}^KsxRL6j zRaM4#i>T1}*l-%Mi!~G~@aIX!>3DAU_i>w#NdX8}TE8L0&_ruM{!eq{BiDySm=5q8 zTMqGBLAC|Cn6E-+&3&icB3hSd-)@5qBh6$0$-v-A<~!{d1zr&6$+i|fu>-Gx>lGrEgvAU+DLkc3Jn)RvC-gSJUT+hD>d9Q>6O zro~F#Q9?4Br`al=b7kFs!6q?FT??|RAaCDoTRut~wz^EBK3|i5<5e17Dcsm*Rud>R zTHMCFLa33PKlDljTN>9TDSw!OpXWrD*0ovo9B{dL!w>Gm+my_m`h$cp zYx=^23m?KDb*=dtXM{O!QwvqO{nA#0-fZ4W#OizxbEDm3mjnZkg__9-_ zj-Co?BG%i8S$~5&%ybJ;O&wndW*b2qD-Z+tPH|xAq)ZKV+xnKrp>|@S}gdMO@mH>2}0`?F5}{sL}S_!C{W_{kluDO z6siWqvnK5HVW=Co`nr5FTIyW@NRTp+A(e)RaD={M-+f;Q;xhdk2?;f~$>5-;lP@yI z!%bc!d_=$%=+@W zV?BUvN<5c5`0df(nMt@NH&f~!V<&~_ zj8pdjiKS)5s837)!}Si#0f^!bA_kxR#YN*rpIB!N1q$oT6YDvKTjwnzg{HU_e5m`U zr=ki{8SJh>Q~zD>8}fV_g)SP|7-51QNqb=oL~iPkN1mkg-Uepm9@yNZKN+pmw=|hZ zNJ(hdNJN>E+s zq)kj{1RK@n?As-X*t<`f;C2SwI?XE_xvP$xX#pgPMqM!O^npq0SONSB+Nf_qlrt2= zi_XGAe_^3dFOmuKbxu$9c%#$mmfC3u>`W7wSXDw7WSLizNtz3E*@z3^=r9%$qOT=I z=(5=PSXHbSX~7E}a?*R3Vb5_`K1~}G`8qSwaxpY6W0NA@DI9Ia_RXtY;SE*@MVcB4 zsO`hcMe`P@cbBC~E{sP{i8!fkO{oPUt`Km9lX}{*eFHDE9bN^$ie;3iL zOTE>J?1yWhk6YnoZ_&SOgX_&@d(pq_B}x8nDW4=ES#yWUfs;Y*uQtU0Q6#qlLlhqP zsvwf~qjru=QX`qC*1!`!5sGP82B6Y*?TT$4tC0e(*k<3T)I^HftJMv^RZ9x4400~1 z`GmrNl4#f5Ttf(jIBw2q-)`Gcr|)>ZSE$`BM9hZU2xN8{9$J#?MhcQ{+d~yjB%qnJy=K0k1DEMn-6X#NO-JkVGb$s<{kBuMCL15L3`YdBvpw zS&#;tqA_as!tfszWM)8+186EZCdHLb7FV*ks9eh6?BjOvBwWSPO<9T!mf}IqEHV=H zfuqn(@I&G^y=umLPsq%O+duF{ppqxxpt)r$7rHpCr=7)4eD;yCi4gN)Gy z8Do%GyWq14LB%x^A4eYz{Sa*IodG6-^?kR^-+J^dNF~5`3Zn3^KH$CVggzDY0v~uc zq$vj!aB4T?tw-L9ZiLmnS8+J3yBqeR?pJK%vW~&_t=qDtYVa;s4U+y8wb9+QN{|KH zp(G#TqA-XrO@_fGTJtpoCa$I025uuqOv(_j{gwl`Dlr8G; zA+>$bQpOUvrdR^MDutAHCs+bMAd!Zp4e!A5cKk3ccqB!ro2(*K`+-{NzE5 zNvN$0YhKnN4bli=id(+_C?3*MJk2j3#y#%vOxzC$5f=(Z)JO_?R19#r z{Dem17ru`&mnjMm_2jXwD)D?|r`~?SCrXsS0%1FdweiA2@Pb7IAOsNvhMFe&g}MmS zNH!2A`?#7Q`WTYOTGCefaCOOc?(EJmZh8a z5zqs5MfV~8tqhc0&RC`c$1?wW3gsehNALXe8Mvr3mFC<{ze9qV}ARE z2JlBbNHloMWe00TC>l#b>-V^nh#U(PrB4C(8JB0~*;2BZ(S(#RVCb zP0(9?Yh(wGO}1OAY=YqZbz<3YfV&6jE|Ubk(YNTER1c}icQM%4oLt9X?LmuCNwgS9 zH9@9n-s!{tZ}k)OX5Z54ROS)f*sr!X*fC7Ijz?%@M^O+$-1k;V2{m@oONuX|UPagX z<{PmAt_}1dehd#S#oO;2eZjL@cF>DS-WGO_uGW;4G2-KXt-YZ>w0KxU*&jAGKtQw; z_>UpA=_pBc`En+llJFZ{2byVNAw56P#mc&0XLTb^>?xYf*9tV7>mr{Ga5^Bo!NT1E zbhG@U2??A?G94O)9q)&2iO3;{0+a+*h(xWPv7t*x()6f3;u&VNAhii3bdsZdF*Ey- z)O_*5fclH~{q;WawR2gt_1EYlFA2SbEDrzI`j%b=o$PHxA3-{Zu=PeCg*b|bv`0{Y z;m1Qi1oRlXenhh6NS{HvelOoMbedAYXK%K@#@?)lJVA{wjC)*5XU2c?HWOK^W`6W2 zU@|qu4bl;4z)K%?l7}*|UW947;J5vaz8*l_MxTYNg?;6Ab=DV3wcnLE$TUqy;u;SS zPe4b?@v}S-J~!6I#Ku)U$`HedUWlN&B=s>b04BG5P_gSKC|wl@^^&5H(x(d{bw*g^ z(laF@GZJ~A95Z~yfN<92ci%Defc-wcX6XAcBI$Nbp8ynXL_DRetFY+%9A>YM|bxZ}f`q%qAn3JhAx9n< zvdQ=eK{W!9?7n8urS0k+19r-&i}8>oAtE59pf_}_V|zz7@Gybz;+EzNdK%K;?x@h) zs1=#whG8GN@>b!Wm5T-i_z=AB_eB>&4UH1C@9_(HL;TW>mZr6hHrRkmeE)jd+{^8n z0q!{=_{(6nQ51Y|hvNgz%W{0+C03Zh1LD-vz`P@N;;d+cx^f8&<#D87XW;dIl-^iw)*B+ob1b+zqQyuvb~M>t z4YasgmdW$%0k*VjAP2fT#56+=X@Xgtbo{Oe4I1E%52>DjNn@%X7Bvi#$TDz zrD}~(Kg3cb*0oRG``IVI{MM77{o^P9{PX|(;Lkq!<@=w0`<&UnPw{{rhh|{qfIP`Ja670kZLC%^oqhP2%q_g=Yi@4=0G_wL>k zO@I80cSKwN`N5w(`M-Yu>EFKl=?~uf^zZ)q>7RY;rPGo8};q$()$*}Qi5-d=h}fBDWw zAHMtK{eOD$-S0pBm$zY!p$uPN%}C_2_hMp)1ltqR25uhsK}2^UO}S2mFkPx}z;q;W= zHwlkYOfd*4Lw;oo*s#7^LbOZi4LdyXI&)FkfS%%hkfibDQaRf=_3X z8JbN>8Wsd6qpm;V;_Xa>CQ!PzOJCzIOIyHi5&PJ7A}XFGViqWvGZvHUduv=cN+aS$@Ce#f>E~P}>2o%UE{sLD0{=Hkf*bX}V9XqfG zArNiE`9{||1lk&qZCJcyhl_|dK!gyG$cOBs3zm2qqD-)!J_d$Cwv3nwYyrKBc8JX3 z;T3!6Tp8G&-NRQ%l`F0jMjMw#fE-2?V68F0OelRCnf@crv1*#qVaWHK`9|n_y0MO} z(8TmSX&MFeC}H*s1c7oA1ZQi~=qh2{>EKXJ`WwcO6p}TmqB_9VJKJNi30K>(P2IwL zdy`zZa_hISat=;UY0OeTvfZ7)hv7gRPc!}E^t76=jpUFU!Ab8SzWvt4CyU=4 zj7;Eq4@V#oBe|jZ!|7>*Q*BW|SvV_F9-aYO4{->=Jhr=BI7o%XyZp7TqJLtUte*8P z!r}nfN{^hDKXSyZ{t9J}H040$5?fOo`RO0M^YMr8u|00Amme2-TG%!hu!nRAavhed zRl=+v*dg8{yt}DBo}Oy4_sH{)JuO+!nHtHXS1>qs0HiuEl_^8JX*(|NLRt#~J(i!F z0s_s&ko$5@NEZPgDl^CpS`Lz<-vASRNNN|8B_jxmfH}20jr5W!7bRcU_44hUOuhyA zb*DZ3hrfUF?k_07C~<9?ro1JqLXs1atHO`O3o~Wk#Y5M(yQJG! zov05O@k9r&7qHqW11znSCb_^4oPbc!Y=Z2fQ2*%H|NWy6e)8n)KYsF~9{~NeSWB*4 z8u8Kzqrp-kItq5Vy-lo}`}WbWO#c7OZU_3^|^0W}ISB$A~3 zutXrXS2d1`24H|An@ZT_Zxb5Xg+@ry8<5|NQnVCsJ_s0P=@kbSkP0VBBE~s8P(~jBHvNpax@{{8G?EQIq(aav1Sz8l3tQ&66(Yc zM8!9ui}6s1)Cvw2X(n~P9}1j-7i(~M2p-|`F?#sv=A6?njXc0AnUN+2U>AAT5IA@b zh7r*YFt#Af9GXzbHO6-TOD>7!Qa+h@cdmsVPP1MMI+jj{1JL zrS06^-P2GX+g)O{qmg(GUQ_|HNNZ`39>VDmspu6T4mFxKzV)@;yLVWe1?TWYr?k~} zm+4Z8F#@N0TWQ*us&*pOVe^1coQxB61Sc4!IYCZrIGjKQQ-TsskU}fKc7$Jwq9H|P z4wG83bhboUm}wFQ;1#oop6HA28g;j5Wm{nk%Q)vv#oT2-DS|VnTyU158!k$~xt?m) zQSO{`!bHeB_+3r)!C5K5F}(3I?U~9C)*@F zRE2xm5q(jbfs!?1{cdjG*}S#=`i<%Kv%~f?^TjUQ&tZB8g*mF_Oe08=0xp}~vkw^$ z_u$e5$#0!1WVP7qQrA=^vvnsp8AkrX0{v@-@j>L~c*@jAv+IE7N!NB?+N{)-mD>8c@X3ebuAa>c>dy|!OY{GLG0?@e{;awyw+SfhzkcV*Km7HRcYi^YdAqyYckev7b9e8-&Aa#SNPwx- zk;=q~=4;jB=0W=Z+iyR8_s2@}H@>m6eecHfje{x{7n7=#Y>HBZ!L>ff$Qev?tX4k%`WQ`R4KH5J_>HmPync| zf9wgtPzF{X|J9G5zWwJP{rXQo`S3#uB^ErF)nVH}NpPsTVTPGp;Hpfd0Caq;^tF@H zlgXLQCOzkEs*>}mq|IXaG$hpOXq1!*)WyBa>z$sCk{JcuYM0Pgl4QUZ{d>0<(MebB{=Hi|vF7Uf9bzrYzTR*#Jn5RPLG=B8fDbJP zd14n>51m2p0Cyi8ka0e^G$N!493G&)ws-Hci`$?gQ(fEBjQwgmA<%n>M0Y@(L&8Gr zb+`H;oCo(iv*S9QN4k+I7GMYnDT={d0(|5@Qs&}h(5*luOv@z^%S1IT)F9pH=I%Tz%ejUO8PBk2x6SB-(Ia%}1xF^VEDV!>BThOC+e2#-NmmCTWsun_Dm6 z-;vk)H~-}6pZ?!Z-~E%P-+TMxAO4}*02jrND87X#J`&?Xn4pB&3L}A%utz`$q6;tk zE(BjkN2c}i_)pie7yWgXt_yXoD(YBO;=~SUs9YKbAacCk12Vk)74)sYd-Ah)7$^!< zJWQPIDwk5B!ofiqxuzi0BN(9wW4#_-g#JMdg)PAfoX8CcM$ek0rqCEnAb0PgpNz@d$XIDjaQ&`5B_y}VjYjAU~6;)*F= zWw25E&5u8M@83WEFulq_Zk0>aO5TK34xhm)V=F9OWjxg?ORzY`dN;q&{n-~f59xcU$4nYCW*7OnPbb+LQJzg(|QR%I1vk2Kmn6>rG(b&GncRjV205QhqtD+S`2 zQ#`FMqEMm*I_yb&?jw5Z3I$G!1~($VISCR=Nkg2Gn8#dV9;>!@bVgFaw7Ylr-i?_R zOw`;dr`1s<;EG;{>P#c4Gqtc0rd2r(auyZsP57nuW)|&@P@0sfC1w)JvW@zz6b{V# zobW?mBxx%?cKq5Pr@ogfNd!&J2{~OZnaf$oKLT_!me(MtG|@ zw)*k9>NIoEMK5>IP6xf-K~5iC>Z0pi^tdBJRmBzw4=pY6d$BSYZWNo7j4QcfmGTe4 zJidpco3ZP@hV4K%lFFqKv`Au&KuBrbSgfVqUMJqql^8+80a!G*fs&xL2Qk{t)Qjto`hR|ZBsl^a`2t7~iUtJ=KQyuJj#YSn9N zt2Ov_b9wDX^%^O6b7^Ubd~G(G&70)w>eAL$t*Nz1LOj{Htlqe`TBqFM@ zY`wnRY}~jud6=?w*{1A=wGPu+T3K4XrnQk1GW%qEBnNPh#5REstl@ifi{T*kmWsq)q~d5l$kZT|$qtv%w5UlkV%gpx zSUuYh;0AY{?(Gy^B{ru68dZFb@k*jRkm3f22Vy7#=m& zK@4K)@c-#))mU^AVN%BT;hsQU<@2F5I4Q|y6q!AW?Ud~{hxaL%6=c{xJsr_N5hVID zMHBbR64{jYsKnV7A)!QLa18{07~+s#cd1)z7e}d}PU!)NbTi;KO}>+y(H#mEQU;JT zh!fPJG$ZwX6IlxK6_biAjzb09Sz%^#}Wi;?QoCX z81}3{(^a7HEq=9{$UEq|W4nHj>~=ZWW5?_I$EM?X>>ylSX|8T)OZDpTvDVVos$V5> zGDMG4ps9jwL@-NsBbs!_5D%8n(!O$YZKY9bY8jLup_u}=iW_K3*n(3+E`j@GI1s^v z8iUcdq*o=qNh>TyCVl*P&%f6@u=Nm`HG?K{xt1vzve)V66y(yN1!(H(R-Hb*1pdA3 z)iR1`a@LkvUj>DfO9&3|cP`Ae$pgadiThX=S=d#0D0^*}K>LmjX{-e-cm%uIK~X;| zEb24BqEQ#HNDM$M;L}aEpvapl(J7}Mq^}h5P<4(--k^c)c#-XRo8b_5qIAS(ISCyvB8i`%=z&iY z=eAbiC(V!BS{12#YE4AbGDUzyX#m$&F7KZfz#>%99Q$Xk8XAfq;S&4)mBYhBjfgT* zFGMeO)bRsP0DP4PK4XNPlFtZ2?LfnzIhWSq8z#h@A)AM!6dQwj_i>vDJrLWJYBMzN z07Vi!)ER_>Fi$qHdD4o^z&>V8KP2A3?95X{mjL@m-&PSOgrRuKHiqPbeLf#zzfOR#{oRYS}5GYoLYA?HBJFBMr=*_@+-36r^W z(&uCP(@;g7IP&ADr8Sqos-ZrdNtPaK6}cn>1BBRPo2WYOP}Dx(?fVu8x7AHtwEF`4 zm_*m*yNVbo1h^Y_un23mh!F$`v2=VTybO^e%*em#JjPwUW++<|7wkP9JcPe$(EUXd zm=Pqya+#5!u2@NKwhPs1CUFE&9tMO8bq4qzhSegiN?$OQK>{tOq6k*G7iM6fY3nS* zUZx;to%rocvsRWBk{pz5m!n^4o>D0r45tLfwtS^ltrDNW7p!Wwm(Yr?U@&s5M8sfO z7MUwJ=k|dgM|=Jj(~@X1Yk|y+>aUo?8YIqMowS*SO6U z7;6ZtqSE5m70V+7WfZ!lweIn9L?M={C@cUb*4-6$K}cxyN^5NiogZ{Y9bLwB!8~CM z$y)7ak02CmpPm-IP9Qg3>`@yOY1*~TNqyZ&5LLB=tr6tkgqw#_qnQlMDY3$S^wk1c z1LauS2?DZ~ixCPNlMFs@Nn!a@%}DAvDqzntZOB)$kuv&OG`3+n;oYc@LEZA;fe*hP zJRosUHb^9uBF>(a+M<&Wfxo9k*&1Ys73M1p+@YYqQ(8+%Vy$V08Q`I7cd)K~MdNO* zO(k}x!R^$cfyN4&TU$eO^~N$H!g}MOu$m)8*|rzyQhZW3P^}4?_T0BRTB6_V{I@04 zB;VH6p5ao2Eg@k3J%fZ6&6=On zX7)*R{WfIOqvl@~jpk*bRF&YNND@WNQZt4m*P{brr%(y^o(|nvIv0Ko<-#@kk_W^Kjz02 z7HSBv{h6nV1~3qTpAW^|=#ar#mgSKj8>~c&{1rLocq>)Xik&=!h@jZpON%Zz5-OIr zgJK5tZLjO%y_DD;PFjx~TI#Rhgxp7AVWF<%mRVSUj5hFptsa{A0KCJu~5r(&@ng!Ygu;+-Vga)??3c&_o&xN0BL9VclaMGhXQFuaUDV$8Vac!$15;(EX3dzkSd37Y>9>B#0%{RcUV6oFZ9J_~aP7#& zrs; z;Uu6n&$DqUJ&BhYJ&z@0xfF0H3KxS)SQTp)C6g-n6uKj_?So>+1d6|erB{>>j6qAt z;28O!Nppq0nj*-^dU_F<4N1`=uqwN>gy2?~2$j&hdB)cOcieQ?(-P7VSTDJaNh~^M zfdsy4)B;K2*Jb!adh4+XB>&$xf1iYk6Q7fZE%9}|Xv1TpcyEmOLW=50w%Ss=KuUN< z5LC&hBuO6>b)VLX_GztbmyF%0RE@}w9yPmTV)<7eI#Zs#iH9rG zxS91xA{w-mE6LSrp{kFRXU7bz1_euqQhq(+cka|>99A;DCWSi0RIke6F7G8N!yWi{ z{~U{LKgA)=ZMvzBa)@1!#ZrR-K(3tT5<&&eAqMy`B+Inz4daMArEp|G_c1iEOIl2E zCuU>^JsdG-uPVvFK+<7j!h=E%0kQ*ijZhw%K`k+ry?=>>y$S}!7X}&p7AQH^YWd=DW^hq!&1s9#r0X{o?3?zljjGIRozEHy@4Bst8$Wfvu|I z7Mr1Jw72?|tvec`B0q>^jRU8nG0~q^uXLRr1g!-TpnL))i}FZyE%HS|B|$p^Eu|vu z2sx_iD7@0dOCn(;f7fW@Wsx_M zza&P<0zP&ziQ2VK!p)wqYOGpbaZ#dwQpJ0!4S2yG4&;GO_zEEEod6#>_*h+p`FxFq1$}-VZwQC?4HHlf=prBwwhS7_ z-zv@w&VUd)r>EnK9XVa>YX;oiAm6-)U2KOKgoDfu3*PElKZ=H7>&lg$6ZPW*v*Qo0 z+_r;Ve1yHIe`U+{YAy6Q93z;$2i!s zNrH68+SlF~LPCr;h8X?~!T(?DIfok34hBOFX~*~g{)9*H!Rh!UI~7<3z#qt@aYX*~ zF&tg^bEpXwfRc76B!GDZmf`Gx;j8%B0A?^;qVpeUNb`F=I#~^A1OG@v+Mx^o9}nRF z!6Wkj68zuj0lWqjo`Yep6dbVSZW3PN4nE$q56EfSFrDtgLTXc9f&2K1wg}T%)Hc8i z)3Un*$4l+H9QiUTQY?b)5Bx2o_V~SFsqrQ?G{JZQcuir(fMhTaBI76hZRll95Sr2w z#(`DDenL!1@`K~AvBnD&u?`$hZ$b-fG*?&?mz!0F+NNw|xr%Db)SJ%rd$p=Anp~_I zh9TqAPBTNLgXS`t5)NaF8EPEY3j#7%yo{f~N_8<0-TE?sM2YXJ3~7os*H)B3Ewfc! zt)@el%-HdA-h=#X(45>?q&$GlT%k+zXVdvA^e$bPXM_A)ul$8$idFG`2%w;XZc7ZOfh^(i*xsKOk zEdXsYPL!4DH!A?W=-#tjQf}HA_Vxn$PpDZp_5QwbxBnpYJC2}vdAgaaoG=@A$+RR|nK$()lIl6-YQ7kUt*{e2BIrZ~{h z9&V$3?ZJbv;}7vR|-4I z16*-BAaq4tYcDo8)l`1*Hw>L6W!t)8=vvn~0+tCv`?T~b^31IzL*LgraTxi73KbS= zXrwt|1?V@e<%6Zt5PM16Kq0Y5C)M@>LmwRzoAl5me}Q+UN#$-m%5;=&z7hpauLn!d z=G_AOg40uCXJSE$p2)DSx@P3}dM>^m_(QlP7Z$Q_XvuW1;n4Ob&aZMrv&@iL66>cv zcxwh)Yd$o=nBOI7Xp**(AkxOs14DPsuHr~ypaz5L!A(OC&JIhjtfhBrzaMR12jaHEG^JI^_f3(5HepZ&U?&je@+^ zhCQ`qUcbaL5+-P03nPE1wJB`HHiDdoVk0@`&6jD!E}HOf+t5Ri6cSrk^)b8e5k6^Q zmP~WPO3@bCQqgy~tF_c+A|^{mY{A6*BG^H+0<~$^Ss}4s?!9Q}k$H(EB}JO(i2i8d zgya?6$K2eIaC5m?y?SKmT{@#G)d-|2N8Q5zCoU3SGgN8Juk;xBA9wu7^r5np?DkBs%R&M z+qqU>HHSegxrQ% z1J)zHxxTXL8Ha$;_t>e> z=q)ZVTGla-0Y)Y%X6h$qVJ1f}bEj`G7n>FrY-dNAG7J{6@a%5)28gI`K{x~t2f9Wy zlZ>aDVT27`1#4b;;A&TfTe!U9 z60EUaw8FxMik4vOEnf33YMi-HN2oOKLY7(ZzzKD(7BskBpJ>C7RM)1Yx~`|FuG?`5 z)z#=USF4@QilDkK#nxubntLU-_yt2*_=@2E5_C&`9NIlxq49IH1l^Dy4xJ#3D#U9? zOVGCbKnqu>6(6*AUw$Lb#Im`&*)P1gd$GkZG5btLcwoCguvci96)i!p%KG$Og(r5u zmTiEc@=C`Jx-h6alv=y($06BhAX=kOF1C;0{Jtd{he~qPZ)863LBFZIXT1UD(-QPj zrUrO6X$ks9<~1>ROwh~nHN2@f5gup>`g-Oy=rgqhy_TJ+TIa>$I$vXTYDINk2guMl zwNW%I919*6wi^z|jKvu$?Rv%S+Qseq#iiZi(m`?QZgJ^Oap}G~+IZZ&hHA-Pw&a_! zAK8_G<2hP_4rO2TJsZPdnBEBT>>La;D+M`6PAZWz)DmYVlpvT$KfI6+h z4ILO0FwzEg&~v;BP>LHvvma;DhV{~Zk#^#$28d#6aBa9BLt=QaILnrWe z^A+^idJvnBZ=eU(acsW>OBs#isivx(V;^@1i~H*nIRl+Odve^Y%@28~*O?qU+XC znjs@JdpU9ZN}OY&ZlzxJ8ydR7-{4mX13<~Ih|4LcgOo{kmtibwa~i5C>_(T^%Rof4 zR$-kz>Vl~ml=y**wWS5%b3BP3QF);^V=A|*bey2$V!;meu{)%Tl2F30mJs5T4TE{Q`b}||k##jw$pUi;MhLoK;}qe5dBUdXzbv$9 zNrk}C3`Poas!!6^DRPf>1}ZD1vdR+ndEDb+;0)~Gq?mIfQwjV2@n*M6ogGMKdIo8` z+pQc#-YknYbRob}=7`g!Z)r_J$Ff1f*3;&+#nSC(ce{*4*9^iE(6u(``cBPN^7X*H zwGf4q*~>7+UJ67<=mjk=r?{U#b$8V*7qis}%eYobh*18?HK|V<=S~QprL(HWI7V** ze-%ppN^X=Pq_KSqk`4}R7otj$T|>PfvQ!LE%M*4(3Ztkq0diVQLWII$%UVxRty*7# z2iNS|;VlyJo6udN&c>KEyBFt$IIqU2bZ@z`eY&|MJPuRXfy_WeUYEm{^-b)7482=| zIEWl!+BU2RrPjjts1s4kHADLd3xlIFtWYojc)P`zL!*EtClDXMN>{7nKz}WsMaEOw z7t(Fy82x5Z)|f-`*!k`Fw_-K0$fKY}W!i^ljU zJLr-RxBVlqrs1vnq6VSd3#;6MFS@KTM!pI3SI_m2H5A~(2Zw$@QC2abqH? z3Iz0h$aVk`hh&<3E02oaC^#K&DyM_PGyi^~Pd>2rnDfZ4&^o*Iu<&*1oG7yG6BVt*rsdjY$+7uW+5 z<%{l|;xkN+C|$Gs?tEFj!o(FH_y>NZrFjxcjpeSNug6Hc=0`2{ns?2C9XyvlFsM%i zGadQY3P+WIN0lwkWS+kARIok1>oJM;Ll$I zke%VUUDS0#$mcTy{2O`rd&6^{S9>_)dCd&KFC0MM4*QYan{Ej1aJrL8h~utYekZ)+ zM1ep1wZu%r%daH}hPJ=5N)i6bYTJ?*l}7s1P^D(H$J|A1jr(!0=XkwCyMt#~=cW8Q z2Zdnf$=;`fb2oL;0zCAmIAfsicaH1`e=fKGkoJ8K5B*8EKZE!&KIqyy<^??A>^j-5=5w5g2|P+KY#u*S!Nn9gahMd9uwmiQI03(_rH!)>9`o zKqJK+hcFsnhn5s$cpFR*Kpd!irbapNNeiREe}pSU0;9E>3Y{h!24i3;8&*cgCyiRg_J2_L%{IjI*x3|WdSTy7G!Es4nD!9lANWi zB&YPycF8zW=aoQIn5<-ER%e;(jjj`&Yo=ZBr8xIgp_yxucgDGPfyfWWO|^@`WRYEt z%1n`9a5+Ca{nVqt4*M0`jV@%VVSHmDfHXc z)>M>Xva~!bk6=Y~Bq6V(F(3KiZHuAGmE6mSlT+fb(f<}kFAK{>Ezx2^a z^1h8FHuR-p0dmba$0g4kTvPWuqDuku6!_(O_r=VX-d z81ZP8+387hBx2|RYMsCzwy5xVa>FN?^O0G>@)N>#8QWx;YH&ivsaBLxr}Zlg&2cqL zl|-6WBsKIWt4iON&v9zGrw=Ouh)*aXq5@eb?A-&pcbT~ik6%mi5KD#1zKsXHg7r>@ z1*(XsOcjx`oExi>h|aH)h!m4AMHSGfqkX#1HKb8%%eHb$$n%vFm8rV0tl&)4pslt! zQn98&D)J6`Tyh5;`a(}RjrL2Wu7$=sw~2!~2^!G5<3k)#0pz1$`AsQ#nOcHUr<)#H zW*frJ`pl?~LJ34N3>VC#9agGu4+e1r2VyU)Co?l&rXfn-oe!S0jZ$bfDKwjTXwr%o0884?X9vk);6FaO?n6{-%{UkANK5wvw-kCS zOj?+S9VE``iPVZO#_Ix{*w^9mqCZk==L!DQh1a)5S z8Ei_@##yi3uE+Q7Z1*j%civ03%odB?uTz<1odZ?zX_T(~8eRFd0&K?9rC7q-orhISYuMi1@!S;P@`>> zLyQ~C)$$OdRi}d%9r&oj-ML_;_*=Yn&lv2s{5SxK!xSdwYu0^pr#@j1IIhj!E_d5>niD@DC8z+HJb zhBW2VDBmoM9jz7cqoTGIl`Q2jicx@U`?M?!fOWP_3731$}%`#B2764xi9Is{8P#EE1tES|Ks?7w% zDWR~}4{!*W;zHmM@z%;A!FaXWN*N?X8yptPkjUyWiKIwivOEhMN)+FDJD{04wEFWe zqp2|#t+x8RC#9hlNjX6ceSL0O4Q-|zu#5w$trZGvXzh!U+0eFrC&e~(#vawH&y(Qh zq9`K|jMZ*q@L`{kHX=2@*mM!I4=i7L#^==w_&ip3YMMxz@;oTi78R>3F2rey-5;+q zYdfZoF0nwI`G#psb;E!$VM@ROFV4%P563JWH^#3QvFJm8(uw8c{j8aDdf^If`uVTl zXzblvXG~(fNTYs17q2q0=Z!5)8IR7y7|NPobQH*}cgwd3V-4#|MM#jW8rs1%YB4K`S@wKBT9!6a4lBlN){7L5wC*ItlN$YJhka8((Z% zsFR*dxe+Rp2s8>L0+}|xkRtO2V|yF5FGc1PMCJ{~W;W{o)kWqFZkpYA4n*dKZ*wNX z8q$bKe5QvKQl{~ah~Y4Cl1QyUk(Y<+V^t0;M%6V|6mJQ&X1T9NS1Co^Jy?)epGTr* zQ0IxfHSl>UaR|w}ey}0fkv*gL2czd3&9eEN(*XoVnROzXDzK4s2D=&f13IMh1e=)b z&NcZ8x(&Cg8xOoz4ITIaP!HM^x8%+QJp+iVt~1ZN8KzjgZ?f~tqo18Ad_&GK9M!8p zxR>Mx315tJjFGx)GQG@X&=1-E%EO9ZU&3Xag-JTs0`NxjmWb3%&S({gc-f~cP>AbA z>3y8-c}y6W9qvC>vg*VsVb_m?4xR<1&ol%~(X8_Uh%;93`JFbC8SKuKO4gaqgotyH zUoxRztyPWlomy#9eod->LsT}5p7Jx z{ZitD#hNcbM^glMK>@bAzUQ8hOD9cmRgT6`T#A|a>_?m5H*3QR&+Dbu0ZPwmq0#>JMh!nwe^joIIP;jgzThMBSxIoB|GP^M?Q@pD!Uvv2<8 zsW!hfY&a)o8v5tjMT#c-oXf+*IX&A2Qq{n-uT68RwaI9LFXU?GD&S{${eF>%LNx6v zOsiU+usykU_?aNNv*@GJz;{iWCYrTTFaf4#no`5`%$Fsn1e#%W=4X`DI@LB zu7pE}hPlhGZ+X&_fz+OUnnr%ctO@={#s)`Vo8L0>u{Cr;%~oc-+Cbi@OD5 z$)w{;gQ9r+kftwZ)|QXsloLRnPp>57*_8(v;1LE?t&*%)u2aIIOh%&wA7)S|O&4E` zjA&*R(+X2Dtu%`#_Y5M8O{HF9fxd1?NS$LC5D}aPC<@P~Vp5`nDQh@3Oc<0)#|eWs z(+3KBzCsDnok5i%U*Kp$%HoX=C)8lZUkz^jm8}VtFcxvzcZSnoLlenIR!vcr#{iUZiyKyEmaEur@GgP&5w8YGymTCo%lL3#OTezLmM^2s0L?^i=W(T!YFM!qOAKqv-z1>-29L*}T zDF^jLJKrT{X|>cSg0*7k`z*}L&TNIK4stp(#3ddgZ>eCOSvy1-trPDrF)xfI>V*N} zJ1HALOVe_Cgi<^iH8CFB5+mW4ib(k1 z^^j~Ss(W%wwq-`OFBeknsi17n_)L5zq1V)bPl&y?%&79^BC1>lU;BKZa`6Gy)WJ^^ zVQrZa;>$&ZcqYW!bIZ9ryEtm_V{>a zO-7qHi)i!c`MIUOj9PYH3^FNfS(9-n&E-NIa=y4_=X56c%tDu?$g~Nu%bGm9Pm%UV z310U3pp)~*CsPMIF+f?9v0Kd|c1w*=_IX0%JTb`9GK&d8$eN7dYOWSaJY*EIFF0cT zFB@lUHUoqv;|7~+6ATc3ha!!sQ=BH$*a~C!R*KlYFJq1U*NiomV)>^GHnzeT;gv!w zwC69{*zB_86~^tY)Mu0>uQ2XsrSYXKc@|mn3S*L1mcEoFuP`=YW%+rKB^P^0aTxi7U6TE|btz6z z*N$x67zH?r18>CSmNy+YB0;PWdl9zwM>H+9w6SIpP_#Y%B0;c%41V5~}=%mwJi5y9w`PNyg*xLa*Y3>zl7=NgHJnb^oqS zkI!NkN0H<8!qx~j$~D^sx0u$5;k(v+Em2muogkQ*tdsf_HfC*%&2-jk%JgTgO5rhU zEnr(VyItyc)S9oMY_L22PI@Q7o4m|`9GKMGZLfneDVc1G|-ZEIQ@P^TJFOiAEl#tedV z!8PG9d4fq*m?Cz=v}#o(5NvC0S-_gM%Y?m90mPZa$CJ-S2yx&m6Hvf=&YsgjQ0|ia z=Bx%hC?q(UcbbrD%~umTW^e=y0oGRcG}hll&FIq{v^S1l$uPfO6d;1TAS$ z#?;&9A9PmKNDQN$AUbeLH9^;6>~rdfD5l>?50X}eak3^Y%gR?WTB%wI;8fyWCa)8+ zjrT_ZelvCgx_t*Y1ixPiu);WlDV_&Kfz#{3ebgZoARsuhA7*Vim;XbyeBj0bAl9KB zML6(USN_}n@5M{FTCMzEymn|W+m*LAE3a28YY!^z#Y0&p$Pt@wTE)gww_lbb zHQ#&|yHDN4xU8T>02=z!w_TW_C*No^+leVlR#UK7*o`xF)8&~xa*Zbm63(|0J${MA zzC>bQBC#)#*cS$gC1`-7zTXX7qrUBRUA$!n-P?W~;@kcaNaipK4UqbV(VSyNT&=oi z2R$4i&vJlnz2?UrP}*CrgT3e;?nJtQY$#1$e52x-E}2@(q52{6hw$Eq_eO#;Q@w?4I#)i^Pz)%$p0B>NEu^?)zx12DNW0>QN z2j{Q#$PiHz!_!k>rPE)s5q}Mfz@$zpG%Q=t%RxX$eZlE)z4D zk4{fD|KJVWiNO2;xHSK8E?QWqT9$Q}yf+`=6R5$4v@xce7DN+*_&iEe8&T_PyLa!H z^ow(NqDNGuT8Hz*SaqL5L4m+*EfEFt&<;ZUl4Sm&J?Bt|Db7b`6gUIjFc`g+tVh9# z*p#GMQe77(VIE7!%!@(b)6>l$uun`UB!6{mY`_>=IO*6?r>|o%2Y8(%2yzst5+sT) z=nl_`jjRY2d?BJE3m1K|G9mzWPWN$}md+<@sL~-x0oK_Ew9b)U=^)n07e%_If;zL9 zppF zg_8L#bhc6jNjPXL*|jZR*3v~aATD8uqs?v?0tWH!q(IWTIDzDUZ5bp3v`ovQ7al^3 zpb?acuEk5L=V}C~##5G`v#RUGtIW%PDRjP&1!wWZHoIIB%NLRm zho()>91vv=s53$8N-r>WYpp9wiRsdWxuxU;r%Hce19{fI&|f{k-jRm1dv*3>x50ie z1r&Qy6iw_6)hdyP_PTSZdy4jWUh=U{CrMA@uyHae+ zk>qOV4=|NL6U#iy3JvJoK3j*~c<4GEJHot27e{lxHFCNwrB6!hEY>KLGa#nny4W&6 zTsMem+R{LO3fm@y5{Z2rXcAz^si;)gVDyz8hEC7ZeKZnhE8C&);$bH)`<;b55~ncx zoqtG-b?k9Q)*V=)k{qCfizve|Ty2w0d6uZ4RNTbQx~dFC6)Y@sKAO0;0=H!gu=nbKGj0`oE4yuv zU|_%v`L$%%LT)LU1-7^=vIT@$vbaI=TaTIQ%6lbOMA&b#>9?Z%O(O`|G3hTSZ|+1v zhQm1Q>%Ky!3Kh8^I{^!d>&AenxcT6j>D!LSq?~l!ap^@$o={BH8i=tX1%xefEG%ZU zAGUeS(;VGS7Rj>&Y}6Q=WMv(S$`wwfWHb|YwD%e9VbPBjA+MP4$-PEh?BWQ|rN)>j z04xJ@+wzLJnbLhid*WLpB}*%3D?^seY--?;;;fx5+w=VBI_Xz4xZH&8*Fus(9pV-( zr?KOpDEfJDVuM(_LZNGM6!{*Z3A2Seq8S>Wc3e>wz!qhasu^a~#~v}9%YjT0y{#*f zzi>#TMHsAeRe_)%+^{=+oq*rEI*LrEYvIM3U`;ctW>Q%P=^55A{ax()FN&;Buc94n zZW_9F#U46W2DWGS@Rjf+Bx~Kf5|eG9p%E2%x3rzRyL*D$h5t67m2Y&Y?C%rOKOPJovEazZqJKl}@I0(&<4Sd%=B3S`p1#AdiKBtC4=h#*? zZn5U8irg!*>|@)Bif2!%Wv84N2-8Y)kqI-?3EmQ;HDr&(xJIH}@_2eWO339u{QwF& z6uof)QK~=r0KFLr6U#9PwC`dQ2Z0~x+D+SWad$5AIn?Gz)wz&Z1!*WUl0(O{UH7C2 zj$j!?VGdhE#1)6#KNEn@J-^A*g8}B}rV97(hq(LVwVb{{cC}AgueMYY=ol!P?(J)* zr&Z%hty*6Kljwrj^w~xWdWBm%lP%%&v{r>1`$~AZR;}`GZ`)Dd95|j1=DFk{00oj> zt6p|s5QZE9i+5kpdwzgw|3Y+ddb+kOrhC;2Hy~6r9@5a-_^P#9-4K|#B{GD{0dN8I z87I%Wet2mFI;fj)d+Bu}nY%Iv%C5N=uRTmqHUj>|O*RY1vdNqkmJk2qhd=qxUw?P* z$@~BG$-n>mled5MQz(j2jEi7P~E;mibDW?LnQxP#TavTjos%?8tR6suz zl%m1<$5RsJjgvISV+f0)nzS&fNa+lk>z3V61YqQvV%Q3r3UJ4EJF#m=m|Zz((ja}K zL3?8%bIXoM$OORJ;zG;zP=2Y+(AySklu&D2=5#UFp}^i7`sB+HO}_JshK+X_x-kUx z%A26re_{hSpqOSX>Z}IjelU!w?n<#B^iCnS2|CjtXsgig_=`3{13&g6+~uq9iiJm0 zl5T7l6Com9DEVeoNSs=cc!eTDpDrxWzk+Or`#Jr_$~;ROU*IMg*Bx=4(KOQQ#4s3i zRT7!?gCa9*z_7wbdQi%$kMs%Luz(~Y~&-ClP!ToJkNS{L)Q*{FRIwb7&I!>0hU`k6y>+x zGVwK*E=W7HySNfhbi(xwePUjxL)RxaZ-q<(GIXJl=7bdnSFI&LoU{!jvjj1(>uTH5 zVXu;GRLmX=N-Qj-9%&gPLHnY);w;_)bLd1Y1=!H>JXkpR(ITj(HLhNb*Rzi>6h_%Z zXt#$l36&fQ^^oMC08So+EQB6u6@TOT@=zTd{R$ zQ)z`#f*QgDCkk7Tu8gD{B9Ta#hZK0dQ2pXH-*>U?2{&kPl>(Vw*=NvirX2{`*r*rH zF;Et*5pBU43~<*Wiqe9;c3Y_5O)oR^9 zq263tStdUkt1FErKhigpBaJ(8;6x`CF5b}+v@Jg$Izbqz-|lC>QRmPE-A%RWdtLG6 z-q0Emd&AbK>x4tsK51!(E`F?`o;_@7tHZ|{B6;9iTCH0Bs+J_^)zZeU&ED9Z;>PBP z?npHJmMld-*aW@7oZrZPir`+TfZx9Dz^P5pn@SP-5xZ`Md-f;jr3v4^k?n#_PD{|s z6RLiF!uQuEe1CDm_pgonK1ZQcIUt7|fc5&A%@g%XHV^KVt#?@Z#gSj$jB#*M8QOt8 zsJKoDqxQyrwR`1*^vee6mJTH-{n9P{(owqcgF(fK@SxJCsS)~PzQw(<2cT9hH~~Z1 z9!;!Qp=t6!aCC;|4$GSx^fLQ6z+vpdxDRAU+Q1Haj#oMGqsSjc;y>xun4_ew+ zaMP|gI?&NcX-AU$c-$){KaOMb)t6D%+8LVNZPc+I#OC80s1JYd@1l4-d4h)4%jRw! z9a^`BroV~?*3HtgYDGSwoND@8&CL*LoD2?wjbQ z^~wDV1uoxvAQ}gwgWyMC|VXah|M7rKqwWU3r!qhA*I~q6n1La zasw+}Efyt*2g%7*Oofh-Oh9hlv#0J9a3+1qeVk3-nE@mniqq zAlK6T81nL#pBkDtl~0<U%`5tqEXNeCpeJWuk7)<7Zcy;^@(;Yb8EH?zHAg&1Vl({3syJvMt zkPc+@M}9}7-kx(uk;c*;m1iSm$w-TKQb9YggT^8FEGpjQ;2ejGrw)oZ39R|6H}!Vf z`}f+^_pbt>iD#DQ0Gt5n8P96=E*1bk*JVt{b1}E^R9oN-*KxrZXT6U%r&>6kAVj^8 zH?vDsd?RP({$J!u7PEeKcXA4_>{2Eh;-YS4y1Pm`ERQG3!ikoj@sbw5csKJMjwB~+ zTzlvctM3#imhD0J;IuEtbc_;EROhjxW*tqFSEv0`1 z+RdU}IH1>Hls-pnAIb(Qk=@f~xT#z)jM@>^ndy|+BJ~7;wH#^X?HU! zhq^3sUYLJf*(k0_eaEj88+`&^(UCFL)-M}xNQ}$M2g}8sYt?DT{hEp~2OML9X#9vc zx{$>o7>64OlKJ4rLnpxDW@NB2Z3v4#aO?7VL?NhblUet}*e(fp(i@~vNBbHKp4?Yw z2C(Sl+#BM>)P|TeBleRxHk@aJ_(L2JGiuFXj&xe!^!h**Pd^)+pUu}Y7b`pTDHTe| z{YrungHH$nfR176#<>VtXpGq1WkJQdOaW`U!P0HdH*RX^)R#dSyy}HOIv}Z9 zE?g``ZGJd}CpYyt!@QJ?bYjSImJfrc!W{j$AjcKm^cSj^R;Z)zZX*@_n)9={QaitI5d zml;fvMxn5Kl0;|%=t}v2Dwio0=?xu{GI@4RzHB`F2XkQBBpsA1Vwm2nR-Ldz3Y(qr zsN`63#24+{5U!1bF!=IcB#2?qo3z<-z;YE=Z31AG#qpTrY+boRp=6%;abR|7 zM#qZ~g(xDBoaiH*_R<`F9ZW!Gzc6XNFZgB2X7SAK%54tab6=Khq!aJT8dJN~>c#su z)6TQFELj&9cU$r?Pr58?Oi@&8jGz0|w`F=JXT2^9qyi+*!{*S@41W8`SIT-65#=-A zh_dA(ES-VLOi5P8sk$xgDe{ei7U=f zyYSOOEbw-~0B>TZEXij%y;%fsQ$T@O0ES415TOOaIcal6c7c!$tLB4&f2<{?N=Xbc z3rm(Qg1DEDfE<}{9!W>J0Iucwx_n>RBZEqZO9T6l888jhIn|I!wP!G9p@86Wg`vyh zdI?2BTGSBWfq%qrC9>)CFqKDe%8epoVb*52=cB+5`xP539t%Yh86`Ux$D%R%7BOEw zOE8$|s`Hy&k&<&4;D@Q)!lNtun_c3fVu>@Qep8scaOis>zUg4M8_rD9rK|5fr&Qfk z_|dy){FsK#%y^PluN*@C38-@B;p~U)azu5O)+S=LR1LW3pAB-Ggw7OXc26CV9->N3 z!D|pXH=JSb+CktS6W^-Ii0YyStd2JvOR1Ht8^g(!+RPK}`p4ePQ$5GUlbO14fp^G- zTpX$KeKr?Js>`YFkg1c{70K!CURF-;kCoHY$bJ*#^zPUusN91lCmLr8NqQ17g3ipC zpYJBMUDrRxT^cuW_M0?ay;Memw7@YZi5rV)Z0^7>5|u~i7t6@PW#;R?O`h6d6iFW=1rWb|GTt{ zACKR~sm)NniJ2i?ty#Q@Q>~n750~1tb;s`I5EC;O{=DP6PUqygN4dn=7PI3w+fJ2L zpJ#FO`Szr`sAKjdvox%&6z|DYD>LP<9_LaP;$W9HeA|A!*^?dv`7g7l8P3cg*JL>? znA*6uS`3R^OFZFljpQ3{G?%OSG|W{*7B%qQurl;RhXx;GCNO2t%n^j0Y0fVl)P2v1 zv?*-5Cb=CHFHpg!bFWao&GIE;>h0QE2_2AY>a$y;{za|PIEoy=c@xnX4D%viw8E6A zVLX+gLj{&}I%|%!lUbcYW8-qCErvkq<876}5*&QBOD!HrVIDD!+6=lT^;3Qoo)R>o z?#iWd9J&g_UfL{7+Emxs^;>U_x2mqqZc3F2@~SNCSe{a@ngWCKIaH8#rm^FiaAcL+ z-UACK2n^0?S7O$skgnvpm~yS2TP-T=zDYhTfrrlMQO4(Dj&&caGaHFIw~*&j89Jb!;8HuZ%5SP+eK_Qn{t34PJfdgt$r%5~EHm8hK0v7gmS}%t^v%;u1varvzAZa;9!i^!@I1>ipS6W&P z0-%he+sMOoNS1#)5%+vK;&~Xr>}(K*O>=& z!{AKH`b&|{l1ILbPq?uOE0i-dLD~_6qI88R#R7$fY8SER$Cv`fkx%jPUGD-AiEOTX z4=_PxeL1@aWaU|nD96cpN)3HzWF(|fQfv~ve}g+iOrZ7~Yl9!Kj7r;7`q z^bboZ{RTUTjioW8{9Ne#m;m+sbUtn8V(ENX8^`OVX??L^3cWAheO5I8>~y|5mkG2! z6Z+J-&?i?F_Onp5Y8P+M^^6Gj)I6pl-kEHrzE%W@FA4ZB3HZ;LfKQ*qDTw$65=3+oq0h*o#;QU>=cD1MHd|e|T~M$|Qey zGLglcfo4n{lIhTyj3wZTFak-auhwcyt33Yt5yV1n)o=q1T1~u!`mIJ2FQaa2wYh|s zmEgt?Sa4&K8fyMdJUGCC>4Y~O&xx>(jnh;7f>kx5e&8R^dH8tl2F;xF^xZ#s`n|WG zzWd{+-}}{*Z+`IPw}15MPk-~|XaDn~fBVi{RpY~OERCiGB%NBVK(r!W6gHFv+ry_n_{r1nz5VeI|M2M#{^ipj z{PUA{zW33G@3ctnvxi0^R^?Go%}S=g3qiJ}9*$(U$gx;=+wNUtNU zszIi7wIFHG$d|HHrC##mAS^28r+an0IKuybcVD;U#;v4zzfVyr`}8#9R6&KGLZPTb z_sEhQ)>=B&TC&f~bad!Y>=K*DY_d(V)s|bl-m86sjhI)M%emW^*_hbJ*!U7a{gK6H z%Pk+z=tAtOLZN^}X5vF4k-4?tv{CRSg(%-vuu2TKT*seZPw?Mt9ejR0T=ze}p5wpi z`mYse13j0pB1y!vVXmqKBND`MLW?&J*Zv(8lFDLE<^4l z{p|b9lrhQ7ugR@cnW5T)N9CI^H%P12@Ohzj`VegW>#p7ZEdz=2tVEVhy93 zl@F{`Te5+jT5I<{kD9ArbRnu1K$LH$zBuY%Pl&&MgU{9hRnZx;R`7 zuGh8P%l>R8B~+xWvK|}Koyp+gVljNrCQJG~T)I>Ay@P{g^FaL<$x(TyOanM@KbyUB-&~@L>niULt0P%YjLNd(sBhvo!(hW+VWgdv4zl2N##iGfVuE z=pgkv+7d)zb<4WT@Chyh-oEcGFQ$_b5@N&L*>PZX?|!xho%$Pw?G85UUVUWcjfQvE z9+j!RmxGV_PBa;;{#d{YGWk>T;lt#Mfv2@wOxqRl@$6*KXw!r8Y7!;UthbJ~WDW9! z?M6!;TC^5sM>aX{<}z$>FX?wb8q>fTRcqR-zeaO5AC~ReNaRCo zf$X-s$uj_E@9u7|QGcV&-5=PNmBN4K#zZ0Y_H5~IZyjw599`=DYs;P8^P%@~h^!Ms zcR}x*5W)MPyO{MVh^*T{cQNk{;E`KU9IsA3d|0icdf4c4ZB#Q3vDN(9d^DUE&hi!h zauz@OGjxJY{*LZE^wtT_h;_4s&-}he{`S(!5pK!ZZpY7;7!>v+%MTxpPpXvYH>Egl zfx#ltiaFF$99q&KZTaNw;i^|AzAqsiEsO{DuvPeA zT7WRL^MO>U4|c%6!`0yR_|T6})GXQF!0&pBH8m*Qd|oZEd!?0dufdA0Ej;RnFTQ>G zs>&*T9lFqx@hb$$?uWw*XjE##eT*vd9L`VQ_y7CLZ~x3JvY5Pme`t|?iwJP>vgU*> zlx)EE=JUE^R2lrbzp9%Pigj-dBdBG#rDwP$oBw!ZxuD(h3Upgm`}f36XU2UNG{I$4pFlGed*${W1YB76esrAC;9EJsFF%6 z+Qn@}yIl=XS``qyz8`Tpol<)9k~t0ztiio`_rb>UV*q2CZ&$M}fk{1vK9IrU z{dJ8FpF4Zoj;bxy9rg=7sctOkU17W#((Xvn{?(o}eEVbAi>wR!?O%T6T-RNCfh*_r zvG$Ttv?SxNTP5RYayt0@dbR#*B_WTWJbUu$34$3p;R*`Rfdz5k9deoN(M?>oyqU{v zMO(NmbT0n)27}_@;C4LMuGDi}>6CF;XSdn#-DC_?78^|`7jNdn#VNa5OjdFUrcc=5*TVv6+?cfWokUG3=8!vac)cGY=BXdc$XM;`XbyPnB zf7o-A((%cIm9baDwiLOAQ!=eZM+KXXv=lpoE-SZ~U}gl7-{anjJU#9e-l~Bqn^sIWgt)+-z~*+rUa$6?zdf7p_V)bYRyy`YO58!agZ&L-LsT~mG)-7;H>ba)>FWn}77J`; zJCp72)2r3fsK2VnWxH(GwB1BQE__??+VZ`% zz>M!N-6-7ol5^QxSK{SO4mE*;G&S36b=qmQ`?i%^w!QLQF`bVmv(ihb#d~hXhF=bG z=F)oC%r95u*yj|;ay4I21nTn%K3S}20G`dqS$&?4J%BYn{RfT zFq`l4-VWZb+EkZ^qb|a9w5tB@4#Ve0yLQ-DciK8Tv_$hsb4>2>b&py6LA;7t47+FZ z%h{?Zw;`sbVQ_ze-zl9Nq!`f3_$=C@ZJp7pa~sbU_nh5O$EcQW+@4iCn5ZM+`3|Y+ z%EanlX+iIGk2$+$O?yl$yJm0gT>@W@2Zu>C!eBfaN5{wEqL@)OQ@7 zD4rt2D?IDscX6I*X_6udPfmId;F$N-c<^%Us(S?|J(s3&I4)wZIl^`HqI&dpvRJNS z>l9pb7T zbje=i(HVXp{t#UbUS6`FCeg*<>XQBCo9OM}^(FiHNpz0i?_Wl520vUx?+5SLL#L3t z^P*P4oL}84ob;597xT-DqMGw>8!p-ssz$_Cu+|r~*i_4AT)*?`1n{yeqF=h(;eYRr z7M&f#d7rob*wW;5y>D2+DVt*ZVe(6HdgwEl)xrT{8-N1*-H=7whYD;}x4Od+mWxjs zE^u2|-|YhITtVRL?rb%!(=HLf&r> z`L7+sds8;LTr7&&%5G3T@=g~CH$+E7)_%Qh* ze;Rh!*65o#gG~7T@DN>iR=~x_pP~F1Hh43iPmAH~CKkA~Z5MYW$G3~rUke4_>xZl2 z=hbjg3~y@kg>AC@$R=CMX8AEPkyB>X>+{L%yZO};qPQq*vekFRVl^2Jr{TwItdAtg z=8*0phWf4b@Llz)BVqQYLhOjd|K=`&UD{)0@0-WS07)N@2g^g1X1(a)$DA5jmS->s zcaL#EqkjHk_-;6vf-p|Y;IKx+^?b5?GApYK3zBBLvYv1=v%^!YqZT}@IrUzz8)gFE zAiEA2JJWURE^>iC8N$$A+6vve2hBMuutY1y^Tqqu#q7g}>auA`CoMi-oxz&tU}vv? zo5BxP$4eZ8#LwXPq!-~2Ylwh>Gg_^qZIjMn%cj!m+z}Qur{s+2=7`4IL|~*#F3DDR zi;OlWh3Z6rU2?TY^w=(Tw>0#Gd{5TV6&Aex>#cnu|20^Tu+dQS58bO{kD5Thc5CwX zuzyVXy6);uwAZlRY}{Fv7MSQG)F7&JWvlY@i9E$+-#CXQBK zHdc#ECwvwO)_g zqBO?*FdlsFjWN$Eiwo)KW!;kSq-~C=J$u?=s)@eudhl)6gYUW?{AD~i4(S-y*RP&G z3s0giZ?q5n`PbQptUc(=*?}&d9jLMoS^Lqsvmbqwedt*u`UBm1vXNou>F$iY-_lS~ zq9p7VPmA+nwLLHI>6Tmw+uz=r4#CGk|NB}v>LDC1H*HpI<@@ll`6$jd;zBqY*@FlB zgoGHiW3Fs8?#6VyE`*hjVAWkiBP`w4f;$&%jm(Mr#h{Ox?D_p(>^YjwFHhf2hl|3S zoo~sZn-%O}(%+q3?k29??A@KS?=SNirh+}#_o9n^H(SXbef9cZzWwu)*H0gJCu?xI z8rrP9v$ig_-ty9~;qT~Xx(!DopqeM=!^!j$Q18j}hfkk%2V-=x826(c)%EwIT=?+C z)8L!peR$_Ydidh$>u;X?b9W#e7e{A5GP&ArODJbi@`rcBhztyIc?~lqj7(V8lP6|4 zD{7DTr}I8q_uKtI!EkmuKYw~Y92b-{{C1e2@$!FSNKo&{i>JRwT+nRcjo`q=HCAnQ z-(F1@pSMcinKH0}C|kAr%zTqYxNB4I=H!=-=%E#cmy7w;vbd%CtH1hR32N5+^?THX_4eJU z30(j^-DcQrm2~lHqwF1P!A9M8tpn#5IKI)X2lwJt&;C23R9;t%`E$uEl9(k5r;}L` zpA|0nBxgEYN2Q^rzq8S$T$L36%Xq(JvUe#!zedM)3~(pIx~QbtPKLc%zi#quV@EH% z8cwGd!wZ}(JDacO%V;=#b9sKp81&1%RPa^t=5+Y(mde+@^j}HsUKMX1Km6hMsBmq| zZdA1{60m7=Zu9jnhIOSr@mk%ojX$RUt5)l-!I!SCPO`Xc33&%u{QJKLx>Nz9em!0M zvbNjm<1Cmw>7b0SVIRu;W=rpnWVpuG@*dPZzlrPW6?T)@Th@3N^VO@_i_TjewHkeW z+}Lz(xoO?p^S7n32%8P##qhk0k+bqQ>Nzi}@{dZhOz@p3UmCq#h>jOt$|}sG>?rei zvK$dZ`Phr@dVA@wFURA_Z2Z-5R8-L&?Y+0SxBacZ5P{1V+acP%5~uR0i~D8bwO zy=wko4cD&?9_VyzvL8HZig)S1;!{~hS^8}Gtz8=e0&Y*6wrnk-*VPK!6g#iRLjI=om?+?-0_?BPmwHe8;C{p-p3d2u?y z_kR|{V6>QACSx(uG;!?v?xxC*=jO`$h)Y~cM!7%pMFJ)FdL1m!%gjOP8=h6 zL$PuzjjxBxvpOX{bHnw(F$TOy(R>G?Q}LU;?VhLahT&OHvu6K!jN^LK7Hzf@%3REq4Mn&&4w^jM~o>`j)PmU`@ej0fM0 z*O62**M0Bn<};cs4^1j1ju{^+W76I_QaLx-u5!|3Quo$Tnn)>k6%=`r3lx+(+wx_G z!voh3s|Te7pRL!n>65|oFx8nZbGFO|{@|T;IwA+WV?t$3$JG2`Mbp1|~wRX5#Etb)Bs~e~(zFHvL&;kqF<7$15 zEHNGDcI+qKjl*abA(C0$k*%KRYPdQJqwCXt_+0Uf2@_;_$})+6ff6|rLTjA`nx{;p zbT>;i%M-dQMe-=iI8&US$V9U&bA=?!MIe)eNq0vomWe=e&PI%4^K>%~$VwhyU;=Fivnf2%o1(&JvlZz+?&2sUGEuX(a_D&7@2z ztzwxmnIOR0EUDZ_YP|HGEV zR~6UgN9}W+*Z!yqqIp5BWcP=IUCj%&mD>8%z%{S@=r3XLb~2p~!q2|?>apNY!oW>H zQsz<)PlsRp={~6cMKuOSr!3F72vV*YSD6@o3W{|U{KOR7{OSh9J^{=95}e0bs#s26 z9VKzfSpQ6ZnxgN?qWnANd|ARgd7|lc`VlE655Eq#nCK6Nr z+EQHPjHeflf(>Vo-@U{ z2+BXG(pVVI6h6#TmKkFnb`%VR$XIHu^3@pzF_$dIo$?P`BYoQl71OtcR&{C0A17b# zAx&Cf+(C4nvrJ}s#3keCqGD;1>VO+2GJKmeAu*+~luI25%o<7!L7{;DbL`3)SE-Ig z!i>o=pD}HW|FI&HG6n8PHB$m}B4;woMfvLrDVAorh^ddpjN+VOm<2PrFflhwrl|-F z(+StHpwS7q2HygF-oUg6~qQS%MJ|8OzgD#5rdQ zTGn4@P^eUW`AGnxJQdXqH_Aa0sFdXi*g!C)6BCrJ^JU9BXK|ZQUwtKoe7pytfLM8w zi9jn(s&8lvGZ?EZ0;H zBf=F+@D@rcQ(Y^jNvY>da2;!w%M3kaS}6kw$ug1eOCY;OFab$SHRCzj2R$UkM~GRLCQNaRi_Tca#mF#| zW{`hcc5u)p1$PO_bRvb-ze6b*q}%-@PPZz}OpYaxWGPQn`Rkr$Oe7?}Ti*`c+fd0$ zt3WdWjKCGk6sCEr%4{p_6;!awGUBfwX|^1k^!I2v9{20ureqq5MH(g{l9?os;eK41oZwt6QO^jh37)|R zEu0H9OMrk?Li!dnLk?V><_t>A{n)w;6Fk!a*1?#J6g0p8abI(@jW8_BFo)z!@>G<+ zmU4#pS791ADo7u}(3{(mf3?>1i;uLeSinSu1a+kvt6G34AuQ(dQB2tzBRq=!g4d5b}5f+I^p;asd zX>n9fI2WS{-ILm2mC7Ho;$aMs09juk*EaL`3qZpwd#vxJ?E0%H+K|`q`G|XR@+zy5mpes)q z&HM~Rl_}{8^gz&HNLNHBz)0p`*07#H421Dsc8kQv%m=cqL;K08+XEfIemRj;8Oc_k?Ig?OS z!mtF5ar1?Q(TIyUCzAOqnbVw{fWt6{#&#a(31=VySES@(PK&j~PM}<3T`vjzWk$su z5LSxVDFz4AL0lDNG?~U3%dk*#c)(u@MbIJ%v|$Fbxx`G3sm`#ZeyteKY3V}2% zzV=!QS}xk9Aeh~QK{ERE#FbL;;%$Xn>S64J@azAcn$F45A~L!bk|FHB>Z-LoAue0caA7+}))V zEY;SQkmO9^md;s9daZS1iN=9q7O7w+ltw6jJrc}lnsHLHMYw)ymV<@d=M1rk=O=@) zNEF5b>-pGZ3`2u4A{LWO(IDn_q2uW1#ujX(@Rqy&h^4Q>1Yl?a5wtQIk-0+C%nOby zb%3yJ1u0WtqJ%+zOT!Gv519nMhQxBEVkfih>t$?c1&3jTf(3jrXnvYYJwi7{Kr?hK z$yk$e*m*OSaHRsTcT~bS*xu<3Hy2>>Mstji3|c`5h7a?UNdppjC6KW!fdWht#z_Qo zrfD^8wJK033A~d~nK3~fq1vQioJ2-YcdZJ>+=V$d*USKhs{?=@hy#QQ;*eQTktN1> z2~IO>!g2Fc;Dn8^hb9w%T?-K>aPR<>m&q8I8YDp%6w8T{oN)jsZx$jgh?N%*k){>1 zV9?h_GOi2=0X6LPQ%)-_AO~Z#Wh@Xx2m->MAZU2z^bESi34jDn zPc_qIa!bjW#B(SD8e&~vFYIr2<*=`zYng?UBL`bcyk%i)(1fjl1Lr(pCZz?t#j8R& zUD?8~nx#ZotnavF0*f?Q=5oSo2_{_1+21+3%PQO*)gT3M1Q zF(m+2PTk%F<`6A#u^?-W`?a>57NQjlSjYW1vtkX;#&tj&Hvlbo4f7H3Y+|q~&}0A> z7A9(F9|(EElrRR@gl+9qu4yUG?fMimf+P`1X^7%Bti{XRU|NgYz&55C#$s9^1elXO zrp0=fXBDI+N*S#6Eu;mdpeY@q4OGTbC_9H}$##{NfHr6V+EO?ygar_UeWVM~a#RjJ zaDdiNa1PIcFvLO@&Z2TmY7ICG*y(>=m9UEwsM&Bu5knj-QN$kHSR@MUo*veB&zGPmhTmdXH@lV)7WzZb2-?{T zwUWp>)QWn^_~fr;&V)sh4H%2vZz8&b9RUFo2V(<*vG}@$v7}UKC1VwXQ#}^P(#+ss zYurS!F#VBrHo@{f$4u>DD`qj8qW!g^^%cOjg`0NiP{CNG+!~vZ4Gi!wMrE2n30ZSF zkX>pqEGBQ3lQ2Yv7WN=E$T@>Xav0W6+783|4_OQwTLYy-k+D~9?owKEP_HbQ@{o1o#xib# zSckOS)esxcFrnBVD~1gKI|7iwGTZZ#5fFNhU;%sRvkt)qjwBAj#!UnZ7J`oaX#A=Z zLB_-izs5}fTiNL?fDM`eHgJnd4`8w6bc;g>Z0mAaN3Sq^+MNIgUp+XmbF-9;6Y>It zbtLo<)~~e7WpES1VnU<^Bth7~n^8+8kTD=yk6^uBz#~`;B`t-#(HT3VnM1Ha3&F;9 z1RLj?K$Zotu^q`0zyih4Jm<`?-df-hTI+h58>V3DF&_Q2A#4M|!T?Az;Sg-xLa>k_ z+K#dEi>Z+IBHWY|w-9VlN3cN?!3He^8?+E?>=mF#u(4M+9>N9<2#ZZvOpzYL1}zNh zjmZwf#!UXoufaLd!xZEBDp3Bu>>;nPMG`wSfH? zEtEy#+_IofxTT_SuP95oci2ox=*CoFi;`?cL@M7s%*NCiH3D|w_Ir8h{KYZh1HwDk zE6h9wR`W~@4Yy>^g6c1~fA2bLg@HPuMsfLpprkVCW#<6~)MXX3^EOKyOOZ~of91|q zim;vK5s@;oVOpm&^f(pMm}ipdl$rpHg-1gH^Q$9s^{1WW>@)~_45+WpCAgTn5L@qy zQN@MTNCey{$5W0p0VhEY1SbSoE17s#F zsJ$l{77CWbYV9?itx0wvvD#IfJ6$#PLZcmtM?y1|y08U2;Wj*acQyt`RI%PB~#Mk(NbDU6mTw za9$NW*oFz;XlCJ-)uUKu2;Wico5rqVJQHq| z;j&=)1e?-!A!Tun+7L>3r8(&Z@9lE6(Q zMD4gLZKXmpf^AN(`L8H?QM(VKzt*NHm1iE#?PMdJF3+5XnC1qb;o8XwrUK6b_ zOL7OHo{~5DWOi08CaZ_=*6!cq5dzHM>>>_j*#BSBagAtE{B${4AYDiEq+zQG_2}_9 zMcqFR-wxk|QCJ;!3{Rq^EbkAmmf=a{PDqz`{fX(5DgwQYg^ng6(D$-fyraMw>*#c_ zJj}RI-24BNANwf|LoDiNA*LN?Av~Ha&qACHM(aq+B {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.index,\n class: _normalizeClass([\"menu-item\", {\n 'is-active': $props.activeIndex === item.index\n }]),\n onClick: $event => $options.handleSelect(item.index)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: item.icon,\n class: \"menu-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t(item.titleKey)), 1)], 10, _hoisted_2);\n }), 128))]), _createElementVNode(\"div\", {\n class: \"toggle-button\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleCollapse && $options.toggleCollapse(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $props.isCollapse ? 'angle-double-right' : 'angle-double-left'\n }, null, 8, [\"icon\"])])], 6);\n}","export default {\n name: 'SysConfigTabs',\n props: {\n activeIndex: {\n type: String,\n default: 'status'\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n expandedWidth: null,\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n titleKey: 'sysConfigTabs.systemStatus'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n titleKey: 'sysConfigTabs.uploadSettings'\n }, {\n index: 'security',\n icon: 'shield',\n titleKey: 'sysConfigTabs.securitySettings'\n }, {\n index: 'page',\n icon: 'pager',\n titleKey: 'sysConfigTabs.pageSettings'\n }, {\n index: 'others',\n icon: 'cog',\n titleKey: 'sysConfigTabs.otherSettings'\n }]\n };\n },\n computed: {\n collapsedWidth() {\n return window.innerWidth <= 768 ? 50 : 56;\n },\n sidebarStyle() {\n if (this.isCollapse) {\n return {\n width: this.collapsedWidth + 'px'\n };\n }\n return this.expandedWidth ? {\n width: this.expandedWidth + 'px'\n } : {};\n }\n },\n watch: {\n '$i18n.locale'() {\n this.$nextTick(() => this.measureWidth());\n }\n },\n methods: {\n toggleCollapse() {\n this.$emit('update:isCollapse', !this.isCollapse);\n },\n checkMobile() {\n const isMobile = window.innerWidth <= 768;\n this.$emit('update:isCollapse', isMobile);\n },\n handleSelect(index) {\n this.$emit('update:activeIndex', index);\n },\n measureWidth() {\n const el = this.$refs.sidebar;\n if (!el) return;\n // Temporarily expand to measure natural content width\n const prevWidth = el.style.width;\n const prevTransition = el.style.transition;\n const wasCollapsed = el.classList.contains('is-collapsed');\n el.style.transition = 'none';\n if (wasCollapsed) {\n el.classList.remove('is-collapsed');\n }\n el.style.width = 'auto';\n // Force reflow to apply changes\n void el.offsetWidth;\n const natural = el.scrollWidth;\n // Restore original state\n el.style.width = prevWidth;\n if (wasCollapsed) {\n el.classList.add('is-collapsed');\n }\n void el.offsetWidth;\n el.style.transition = prevTransition;\n this.expandedWidth = natural;\n }\n },\n mounted() {\n this.checkMobile();\n this.$nextTick(() => this.measureWidth());\n window.addEventListener('resize', this.checkMobile);\n },\n beforeDestroy() {\n window.removeEventListener('resize', this.checkMobile);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysConfigTabs.vue?vue&type=template&id=2718059d&scoped=true\"\nimport script from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\nexport * from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\n\nimport \"./SysConfigTabs.vue?vue&type=style&index=0&id=2718059d&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2718059d\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_SysConfigTabs = _resolveComponent(\"SysConfigTabs\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"systemConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('sysConfig.logout'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])]),\n _: 1\n }), _createVNode(_component_SysConfigTabs, {\n activeIndex: $data.activeIndex,\n \"onUpdate:activeIndex\": _cache[0] || (_cache[0] = $event => $data.activeIndex = $event),\n isCollapse: $data.isSidebarCollapse,\n \"onUpdate:isCollapse\": _cache[1] || (_cache[1] = $event => $data.isSidebarCollapse = $event)\n }, null, 8, [\"activeIndex\", \"isCollapse\"]), (_openBlock(), _createBlock(_resolveDynamicComponent($options.currentComponent), {\n class: _normalizeClass(['main-container', {\n 'collapsed': $data.isSidebarCollapse\n }])\n }, null, 8, [\"class\"]))]);\n}","import { vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"date-range-calendar\"\n};\nconst _hoisted_2 = {\n class: \"selected-range\"\n};\nconst _hoisted_3 = {\n class: \"selected-range-inputs\"\n};\nconst _hoisted_4 = [\"aria-label\"];\nconst _hoisted_5 = {\n class: \"date-range-separator\"\n};\nconst _hoisted_6 = [\"aria-label\"];\nconst _hoisted_7 = {\n class: \"calendar-header\"\n};\nconst _hoisted_8 = [\"aria-label\"];\nconst _hoisted_9 = {\n class: \"calendar-title\"\n};\nconst _hoisted_10 = [\"aria-label\"];\nconst _hoisted_11 = {\n class: \"calendar-weekdays\"\n};\nconst _hoisted_12 = {\n class: \"calendar-grid\"\n};\nconst _hoisted_13 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [_withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.inputStart = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.startDateLabel,\n onChange: _cache[1] || (_cache[1] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_4), [[_vModelText, $data.inputStart, void 0, {\n trim: true\n }]]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString($options.rangeSeparator), 1), _withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.inputEnd = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.endDateLabel,\n onChange: _cache[3] || (_cache[3] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_6), [[_vModelText, $data.inputEnd, void 0, {\n trim: true\n }]])])]), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.previousMonthLabel,\n onClick: _cache[4] || (_cache[4] = (...args) => $options.goToPreviousMonth && $options.goToPreviousMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-left\"\n })], 8, _hoisted_8), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.monthTitle), 1), _createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.nextMonthLabel,\n onClick: _cache[5] || (_cache[5] = (...args) => $options.goToNextMonth && $options.goToNextMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-right\"\n })], 8, _hoisted_10)]), _createElementVNode(\"div\", _hoisted_11, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.weekdayLabels, weekday => {\n return _openBlock(), _createElementBlock(\"span\", {\n key: weekday\n }, _toDisplayString(weekday), 1);\n }), 128))]), _createElementVNode(\"div\", _hoisted_12, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.calendarDays, day => {\n return _openBlock(), _createElementBlock(\"button\", {\n key: day.key,\n type: \"button\",\n class: _normalizeClass([\"calendar-day\", {\n 'is-muted': !day.isCurrentMonth,\n 'is-today': day.isToday,\n 'is-range-start': day.key === $data.draftStart,\n 'is-range-end': day.key === $data.draftEnd,\n 'is-in-range': $options.isInRange(day.key)\n }]),\n onClick: $event => $options.selectDay(day.key)\n }, _toDisplayString(day.dayOfMonth), 11, _hoisted_13);\n }), 128))])]);\n}","const DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateKey(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction parseDateKey(value) {\n if (typeof value !== 'string') return null;\n const match = value.trim().match(/^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})$/);\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]) - 1;\n const day = Number(match[3]);\n const date = new Date(year, month, day);\n if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) {\n return null;\n }\n date.setHours(0, 0, 0, 0);\n return date;\n}\nfunction shiftMonth(date, amount) {\n return new Date(date.getFullYear(), date.getMonth() + amount, 1);\n}\nexport default {\n name: 'DateRangeCalendar',\n props: {\n modelValue: {\n type: Array,\n default: () => []\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return {\n displayYear: today.getFullYear(),\n displayMonth: today.getMonth(),\n draftStart: '',\n draftEnd: '',\n inputStart: '',\n inputEnd: '',\n awaitingEnd: false\n };\n },\n computed: {\n previousMonthLabel() {\n return this.$t('dateRangeCalendar.previousMonth');\n },\n nextMonthLabel() {\n return this.$t('dateRangeCalendar.nextMonth');\n },\n startDateLabel() {\n return this.$t('dateRangeCalendar.startDate');\n },\n endDateLabel() {\n return this.$t('dateRangeCalendar.endDate');\n },\n rangeSeparator() {\n return this.$t('dateRangeCalendar.rangeSeparator');\n },\n monthTitle() {\n return this.$t('dateRangeCalendar.monthTitle', {\n year: this.displayYear,\n month: padDatePart(this.displayMonth + 1)\n });\n },\n weekdayLabels() {\n return [this.$t('dateRangeCalendar.weekdaySun'), this.$t('dateRangeCalendar.weekdayMon'), this.$t('dateRangeCalendar.weekdayTue'), this.$t('dateRangeCalendar.weekdayWed'), this.$t('dateRangeCalendar.weekdayThu'), this.$t('dateRangeCalendar.weekdayFri'), this.$t('dateRangeCalendar.weekdaySat')];\n },\n calendarDays() {\n const monthStart = new Date(this.displayYear, this.displayMonth, 1);\n const start = new Date(this.displayYear, this.displayMonth, 1 - monthStart.getDay());\n const todayKey = formatDateKey(new Date());\n return Array.from({\n length: 42\n }, (_, index) => {\n const date = new Date(start.getTime() + index * DAY_MS);\n const key = formatDateKey(date);\n return {\n key,\n dayOfMonth: date.getDate(),\n isCurrentMonth: date.getMonth() === this.displayMonth,\n isToday: key === todayKey\n };\n });\n }\n },\n watch: {\n modelValue: {\n immediate: true,\n handler(value) {\n this.syncFromModel(value);\n }\n }\n },\n methods: {\n syncFromModel(value) {\n const startDate = parseDateKey(value?.[0]);\n const endDate = parseDateKey(value?.[1]);\n this.draftStart = startDate ? formatDateKey(startDate) : '';\n this.draftEnd = endDate ? formatDateKey(endDate) : '';\n this.inputStart = this.draftStart;\n this.inputEnd = this.draftEnd;\n this.awaitingEnd = false;\n const displayDate = startDate || endDate;\n if (displayDate) {\n this.displayYear = displayDate.getFullYear();\n this.displayMonth = displayDate.getMonth();\n }\n },\n goToPreviousMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), -1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n goToNextMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), 1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n selectDay(key) {\n if (!this.draftStart || this.draftEnd || !this.awaitingEnd) {\n this.draftStart = key;\n this.draftEnd = '';\n this.inputStart = key;\n this.inputEnd = '';\n this.awaitingEnd = true;\n return;\n }\n const range = key < this.draftStart ? [key, this.draftStart] : [this.draftStart, key];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.commitRange(range);\n },\n handleManualInput() {\n const startDate = parseDateKey(this.inputStart);\n const endDate = parseDateKey(this.inputEnd);\n if (!startDate || !endDate) return;\n const startKey = formatDateKey(startDate);\n const endKey = formatDateKey(endDate);\n const range = startKey <= endKey ? [startKey, endKey] : [endKey, startKey];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.displayYear = startDate.getFullYear();\n this.displayMonth = startDate.getMonth();\n this.commitRange(range);\n },\n commitRange(range) {\n this.$emit('update:modelValue', range);\n this.$emit('change', range);\n },\n isInRange(key) {\n return Boolean(this.draftStart && this.draftEnd && key > this.draftStart && key < this.draftEnd);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DateRangeCalendar.vue?vue&type=template&id=65a4b58c&scoped=true\"\nimport script from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\nexport * from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\n\nimport \"./DateRangeCalendar.vue?vue&type=style&index=0&id=65a4b58c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-65a4b58c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"status-panel\"\n};\nconst _hoisted_2 = {\n class: \"overview-cards\"\n};\nconst _hoisted_3 = {\n class: \"card-icon\"\n};\nconst _hoisted_4 = {\n class: \"card-content\"\n};\nconst _hoisted_5 = {\n class: \"card-title\"\n};\nconst _hoisted_6 = {\n class: \"card-value\"\n};\nconst _hoisted_7 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_8 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_9 = {\n class: \"card-icon\"\n};\nconst _hoisted_10 = {\n class: \"card-content\"\n};\nconst _hoisted_11 = {\n class: \"card-title\"\n};\nconst _hoisted_12 = {\n class: \"card-value\"\n};\nconst _hoisted_13 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_14 = {\n class: \"card-icon\"\n};\nconst _hoisted_15 = {\n class: \"card-content\"\n};\nconst _hoisted_16 = {\n class: \"card-title\"\n};\nconst _hoisted_17 = {\n class: \"card-value\"\n};\nconst _hoisted_18 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_19 = {\n class: \"charts-section\"\n};\nconst _hoisted_20 = {\n class: \"chart-card trend-chart-card\"\n};\nconst _hoisted_21 = {\n class: \"chart-header trend-chart-header\"\n};\nconst _hoisted_22 = {\n class: \"chart-title\"\n};\nconst _hoisted_23 = {\n class: \"trend-controls\"\n};\nconst _hoisted_24 = {\n class: \"trend-date-panel\"\n};\nconst _hoisted_25 = {\n class: \"chart-content trend-chart-content\"\n};\nconst _hoisted_26 = {\n key: 0,\n class: \"empty-state trend-empty-state\"\n};\nconst _hoisted_27 = {\n key: 1,\n class: \"line-chart-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"chart-card\"\n};\nconst _hoisted_29 = {\n class: \"chart-header\"\n};\nconst _hoisted_30 = {\n class: \"chart-content\"\n};\nconst _hoisted_31 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_33 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_34 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_35 = {\n class: \"center-value\"\n};\nconst _hoisted_36 = {\n class: \"center-label\"\n};\nconst _hoisted_37 = {\n class: \"chart-legend\"\n};\nconst _hoisted_38 = {\n class: \"legend-label\"\n};\nconst _hoisted_39 = {\n class: \"legend-value\"\n};\nconst _hoisted_40 = {\n class: \"legend-percent\"\n};\nconst _hoisted_41 = {\n class: \"chart-card\"\n};\nconst _hoisted_42 = {\n class: \"chart-header\"\n};\nconst _hoisted_43 = {\n class: \"chart-content\"\n};\nconst _hoisted_44 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_45 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_46 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_47 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_48 = {\n class: \"center-value\"\n};\nconst _hoisted_49 = {\n class: \"center-label\"\n};\nconst _hoisted_50 = {\n class: \"chart-legend\"\n};\nconst _hoisted_51 = {\n class: \"legend-label\"\n};\nconst _hoisted_52 = {\n class: \"legend-value\"\n};\nconst _hoisted_53 = {\n class: \"legend-percent\"\n};\nconst _hoisted_54 = {\n class: \"actions-section\"\n};\nconst _hoisted_55 = {\n class: \"action-card\"\n};\nconst _hoisted_56 = {\n class: \"action-header\"\n};\nconst _hoisted_57 = {\n class: \"action-content\"\n};\nconst _hoisted_58 = {\n key: 0,\n class: \"progress-container\"\n};\nconst _hoisted_59 = {\n class: \"progress-header\"\n};\nconst _hoisted_60 = {\n class: \"progress-phase\"\n};\nconst _hoisted_61 = {\n class: \"progress-percentage\"\n};\nconst _hoisted_62 = {\n class: \"progress-details\"\n};\nconst _hoisted_63 = {\n key: 0,\n class: \"progress-count\"\n};\nconst _hoisted_64 = {\n key: 1,\n class: \"progress-time\"\n};\nconst _hoisted_65 = {\n key: 0,\n class: \"progress-message\"\n};\nconst _hoisted_66 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_67 = {\n class: \"error-icon\"\n};\nconst _hoisted_68 = {\n class: \"error-content\"\n};\nconst _hoisted_69 = {\n class: \"error-message\"\n};\nconst _hoisted_70 = {\n key: 0,\n class: \"error-suggestion\"\n};\nconst _hoisted_71 = {\n class: \"error-actions\"\n};\nconst _hoisted_72 = {\n key: 2,\n class: \"action-buttons\"\n};\nconst _hoisted_73 = {\n class: \"restore-section\"\n};\nconst _hoisted_74 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_75 = [\"src\"];\nconst _hoisted_76 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_77 = {\n class: \"file-card-header\"\n};\nconst _hoisted_78 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_79 = {\n class: \"file-name\"\n};\nconst _hoisted_80 = {\n class: \"file-meta\"\n};\nconst _hoisted_81 = [\"src\"];\nconst _hoisted_82 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_83 = {\n class: \"file-card-header warning\"\n};\nconst _hoisted_84 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_85 = {\n class: \"file-name\"\n};\nconst _hoisted_86 = {\n class: \"file-meta\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_DateRangeCalendar = _resolveComponent(\"DateRangeCalendar\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_Line = _resolveComponent(\"Line\");\n const _component_Doughnut = _resolveComponent(\"Doughnut\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", {\n class: \"overview-card total-files\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.fetchIndexInfo && $options.fetchIndexInfo(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\"\n })]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, _toDisplayString(_ctx.$t('sysStatus.totalFiles')), 1), _createElementVNode(\"div\", _hoisted_6, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_7, _toDisplayString(_ctx.$t('sysStatus.clickToRefresh')), 1)])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(_ctx.$t('sysStatus.indexUpdateTime')), 1), _createElementVNode(\"div\", _hoisted_12, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_13, _toDisplayString($options.getTimeAgo($data.indexInfo.lastUpdated)), 1)])]), _createElementVNode(\"div\", {\n class: \"overview-card system-version\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.openReleases && $options.openReleases(...args))\n }, [_createElementVNode(\"div\", _hoisted_14, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, _toDisplayString(_ctx.$t('sysStatus.systemVersion')), 1), _createElementVNode(\"div\", _hoisted_17, \"v\" + _toDisplayString($data.version), 1), _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('sysStatus.clickToViewChangelog')), 1)])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"chart-line\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.uploadTrend')), 1), _createVNode(_component_el_button, {\n class: \"trend-calendar-btn\",\n circle: \"\",\n \"aria-label\": _ctx.$t('sysStatus.selectDateRange'),\n onClick: $options.openTrendDateDialog\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"calendar\"\n })]),\n _: 1\n }, 8, [\"aria-label\", \"onClick\"])]), _createElementVNode(\"div\", _hoisted_23, [_createVNode(_component_el_radio_group, {\n modelValue: $data.trendGroupBy,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.trendGroupBy = $event),\n size: \"small\",\n class: \"trend-group-switch\",\n \"aria-label\": _ctx.$t('sysStatus.uploadTrendGroupBy')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"channel\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelType')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"channelName\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelName')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"aria-label\"])])]), _createVNode(_component_el_dialog, {\n modelValue: $data.trendDatePickerVisible,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.trendDatePickerVisible = $event),\n title: _ctx.$t('sysStatus.selectDateRange'),\n width: $options.trendDateDialogWidth,\n class: \"trend-date-dialog\",\n \"align-center\": \"\",\n \"append-to-body\": \"\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [_createVNode(_component_DateRangeCalendar, {\n modelValue: $data.trendDateRange,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.trendDateRange = $event),\n onChange: $options.handleTrendDateRangeChange\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createElementVNode(\"div\", _hoisted_25, [!$options.hasTrendData ? (_openBlock(), _createElementBlock(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_27, [_createVNode(_component_Line, {\n data: $options.uploadTrendChartData,\n options: $options.lineChartOptions\n }, null, 8, [\"data\", \"options\"])]))])]), _createElementVNode(\"div\", _hoisted_28, [_createElementVNode(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.channelDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_30, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createElementVNode(\"div\", _hoisted_33, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"div\", _hoisted_35, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_36, _toDisplayString(_ctx.$t('sysStatus.totalFilesLabel')), 1)])]), _createElementVNode(\"div\", _hoisted_37, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.channelStats, (count, channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_38, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_39, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_40, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_41, [_createElementVNode(\"div\", _hoisted_42, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.fileStatusDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_43, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_44, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [_createElementVNode(\"div\", _hoisted_46, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_47, [_createElementVNode(\"div\", _hoisted_48, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _createElementVNode(\"div\", _hoisted_49, _toDisplayString(_ctx.$t('sysStatus.statusTypes')), 1)])]), _createElementVNode(\"div\", _hoisted_50, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.aggregatedTypeStats, (count, status, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: status,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getTypeChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_51, _toDisplayString(status), 1), _createElementVNode(\"span\", _hoisted_52, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_53, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_54, [_createElementVNode(\"div\", _hoisted_55, [_createElementVNode(\"div\", _hoisted_56, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.systemMaintenance')), 1)]), _createElementVNode(\"div\", _hoisted_57, [$data.isProcessing ? (_openBlock(), _createElementBlock(\"div\", _hoisted_58, [_createElementVNode(\"div\", _hoisted_59, [_createElementVNode(\"span\", _hoisted_60, _toDisplayString($options.phaseDescription), 1), _createElementVNode(\"span\", _hoisted_61, _toDisplayString(Math.round($data.processingProgress.percentage)) + \"%\", 1)]), _createVNode(_component_el_progress, {\n percentage: $data.processingProgress.percentage,\n \"stroke-width\": 12,\n \"show-text\": false,\n class: \"progress-bar\"\n }, null, 8, [\"percentage\"]), _createElementVNode(\"div\", _hoisted_62, [$data.processingProgress.current > 0 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_63, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.processingProgress.current.toLocaleString()) + \" \", 1), $data.processingProgress.total > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createTextVNode(\" / \" + _toDisplayString($data.processingProgress.total.toLocaleString()), 1)], 64)) : _createCommentVNode(\"\", true), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.records')), 1)])) : _createCommentVNode(\"\", true), $options.estimatedTimeRemaining ? (_openBlock(), _createElementBlock(\"span\", _hoisted_64, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n }), _createTextVNode(\" \" + _toDisplayString($options.estimatedTimeRemaining), 1)])) : _createCommentVNode(\"\", true)]), $data.processingProgress.message ? (_openBlock(), _createElementBlock(\"div\", _hoisted_65, _toDisplayString($data.processingProgress.message), 1)) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n size: \"small\",\n onClick: $options.cancelOperation,\n class: \"cancel-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.cancelOperation')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : $data.processingError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_66, [_createElementVNode(\"div\", _hoisted_67, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\"\n })]), _createElementVNode(\"div\", _hoisted_68, [_createElementVNode(\"div\", _hoisted_69, _toDisplayString($data.processingError.message), 1), $data.processingError.suggestion ? (_openBlock(), _createElementBlock(\"div\", _hoisted_70, _toDisplayString($data.processingError.suggestion), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_71, [$data.processingError.recoverable ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n size: \"small\",\n onClick: $options.retryOperation\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"default\",\n size: \"small\",\n onClick: $options.dismissError\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.close')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_72, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.rebuildTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n disabled: $data.isProcessing,\n onClick: $options.rebuildIndex,\n class: \"action-btn rebuild-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.rebuilding ? _ctx.$t('sysStatus.rebuilding') : _ctx.$t('sysStatus.rebuildIndex')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.backupTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n disabled: $data.isProcessing,\n onClick: $options.backupData,\n class: \"action-btn backup-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n }), _createTextVNode(\" \" + _toDisplayString($data.backing ? _ctx.$t('sysStatus.backingUp') : _ctx.$t('sysStatus.backupData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.restoreTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_73, [_createElementVNode(\"input\", {\n type: \"file\",\n ref: \"fileInput\",\n accept: \".json\",\n onChange: _cache[5] || (_cache[5] = (...args) => $options.handleFileSelect && $options.handleFileSelect(...args)),\n style: {\n \"display\": \"none\"\n }\n }, null, 544), _createVNode(_component_el_button, {\n type: \"warning\",\n loading: $data.restoring,\n disabled: $data.isProcessing,\n onClick: $options.selectRestoreFile,\n class: \"action-btn restore-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\"\n }), _createTextVNode(\" \" + _toDisplayString($data.restoring ? _ctx.$t('sysStatus.restoring') : _ctx.$t('sysStatus.restoreData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])])]),\n _: 1\n }, 8, [\"content\"])]))])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_74, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"file-info-card info-card-newest\",\n onClick: _cache[8] || (_cache[8] = $event => $options.openFileInNewTab($data.indexInfo.newestFile))\n }, [$options.isImageFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[6] || (_cache[6] = $event => $options.handleImageError('newest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[7] || (_cache[7] = $event => $options.handleImageError('newest'))\n }, null, 40, _hoisted_75)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_76, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_77, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.latestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_78, [_createElementVNode(\"div\", _hoisted_79, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_80, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-info-card info-card-oldest\",\n onClick: _cache[11] || (_cache[11] = $event => $options.openFileInNewTab($data.indexInfo.oldestFile))\n }, [$options.isImageFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[9] || (_cache[9] = $event => $options.handleImageError('oldest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[10] || (_cache[10] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_81)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_82, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_83, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.earliestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_84, [_createElementVNode(\"div\", _hoisted_85, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_86, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, vScale, _parsed} = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = (_parsed\n .slice(0, start + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = (_parsed\n .slice(end - 1)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart | PrivateChart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart | PrivateChart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n\n (chart as PrivateChart).height = round1(chart.height);\n (chart as PrivateChart).width = round1(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js';\n\nfunction getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nexport function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n _getAxisCount() {\n return this._getAxis().length;\n }\n\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift();\n }\n\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets) {\n axis[valueOrDefault(\n this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId\n )] = true;\n }\n return Object.keys(axis);\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n const {labels: {pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: string): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: string): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options?: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase as {\n new (options?: AnyObject): DateAdapter;\n override(\n members: Partial, 'options'>>\n ): void;\n }\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const {vScale} = controller._cachedMeta;\n const {_parsed} = metaset;\n\n const distanceToDefinedLo = (_parsed\n .slice(0, result.lo + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.lo -= Math.max(0, distanceToDefinedLo);\n\n const distanceToDefinedHi = (_parsed\n .slice(result.hi)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

    (props: P, final?: boolean): Pick;\n getProps

    (props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = undefined;\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n if (this._init === undefined) { // Do not trigger events before install\n return;\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined; // Do not trigger events after uninstall\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n // @ts-expect-error\n const clip = getDatasetClipArea(this, meta);\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (clip) {\n clipArea(ctx, clip);\n }\n\n meta.controller.draw();\n\n if (clip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\nfunction clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, x, y, outerRadius, innerRadius, options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + PI / 2) + x;\n const endY = -r * Math.sin(endAngle + PI / 2) + y;\n const startX = r * Math.cos(startAngle + PI / 2) + x;\n const startY = r * Math.sin(startAngle + PI / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n ctx.clip('evenodd');\n}\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import {_boundSegment, _boundSegments, _normalizeAngle} from '../../helpers/index.js';\n\nexport function _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n\n for (const segment of segments) {\n let {start, end} = segment;\n end = _findSegmentEnd(start, end, points);\n\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n\n if (!target.segments) {\n // Special case for boundary not supporting `segments` (simpleArc)\n // Bounds are provided as `target` for partial circle, or undefined for full circle\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n\n // Get all segments from `target` that intersect the bounds of current segment of `line`\n const targetSegments = _boundSegments(target, bounds);\n\n for (const tgt of targetSegments) {\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\n\nexport function _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\n\nexport function _pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\n\nexport function _findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\n\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {isArray} from '../../helpers/index.js';\nimport {_pointsFromSegments} from './filler.segment.js';\n\n/**\n * @param {PointElement[] | { x: number; y: number; }} boundary\n * @param {LineElement} line\n * @return {LineElement?}\n */\nexport function _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n\n if (isArray(boundary)) {\n _loop = true;\n // @ts-ignore\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\n\nexport function _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n","import {isObject, isFinite, valueOrDefault} from '../../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.line.js').default } LineElement\n * @typedef { import('../../types/index.js').FillTarget } FillTarget\n * @typedef { import('../../types/index.js').ComplexFillTarget } ComplexFillTarget\n */\n\nexport function _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n}\n\n/**\n * @param {LineElement} line\n * @param {number} index\n * @param {number} count\n */\nexport function _decodeFill(line, index, count) {\n /** @type {string | {value: number}} */\n const fill = parseFillOption(line);\n\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n\n let target = parseFloat(fill);\n\n if (isFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\n\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @returns {number | null}\n */\nexport function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n // @ts-ignore\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @param {number} startValue\n * @returns {number | undefined}\n */\nexport function _getTargetValue(fill, scale, startValue) {\n let value;\n\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n // @ts-ignore\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n\n/**\n * @param {LineElement} line\n */\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {_isBetween} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\n\n/**\n * @param {{ chart: Chart; scale: Scale; index: number; line: LineElement; }} source\n * @return {LineElement}\n */\nexport function _buildStackLine(source) {\n const {scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({x: null, y: scale.bottom}, line));\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @return {LineElement[]}\n */\nfunction getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n\n/**\n * @param {PointElement[]} points\n * @param {PointElement} sourcePoint\n * @param {LineElement[]} linesBelow\n */\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n // First point of a segment -> need to add another point before this,\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n // In the middle of a segment, no need to add more points.\n break;\n }\n }\n }\n points.push(...postponed);\n}\n\n/**\n * @param {LineElement} line\n * @param {PointElement} sourcePoint\n * @param {string} property\n * @returns {{point?: PointElement, first?: boolean, last?: boolean}}\n */\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\n","import {TAU} from '../../helpers/index.js';\n\n// TODO: use elements.ArcElement instead\nexport class simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n","import {isFinite} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\nimport {_getTargetPixel, _getTargetValue} from './filler.options.js';\nimport {_buildStackLine} from './filler.target.stack.js';\nimport {simpleArc} from './simpleArc.js';\n\n/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nexport function _getTarget(source) {\n const {chart, fill, line} = source;\n\n if (isFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n\n if (fill === 'shape') {\n return true;\n }\n\n const boundary = computeBoundary(source);\n\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n\n return _createBoundaryLine(boundary, line);\n}\n\n/**\n * @param {Chart} chart\n * @param {number} index\n */\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\n\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\n\n\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n const pixel = _getTargetPixel(fill, scale);\n\n if (isFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n\n return null;\n}\n\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n\n for (let i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\n","import {clipArea, unclipArea, getDatasetClipArea} from '../../helpers/index.js';\nimport {_findSegmentEnd, _getBounds, _segments} from './filler.segment.js';\nimport {_getTarget} from './filler.target.js';\n\nexport function _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const {chart, index, line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n const meta = chart.getDatasetMeta(index);\n const clip = getDatasetClipArea(chart, meta);\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis, clip});\n unclipArea(ctx);\n }\n}\n\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale, clip} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n\n ctx.save();\n\n let fillColor = below;\n if (below !== above) {\n if (property === 'x') {\n clipVertical(ctx, target, area.top);\n fill(ctx, {line, target, color: above, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n } else if (property === 'y') {\n clipHorizontal(ctx, target, area.left);\n fill(ctx, {line, target, color: below, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipHorizontal(ctx, target, area.right);\n fillColor = above;\n }\n }\n fill(ctx, {line, target, color: fillColor, scale, property, clip});\n\n ctx.restore();\n}\n\nfunction clipVertical(ctx, target, clipY) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction clipHorizontal(ctx, target, clipX) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(clipX, firstPoint.y);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(clipX, lastPoint.y);\n }\n }\n\n ctx.lineTo(clipX, target.first().y);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction fill(ctx, cfg) {\n const {line, target, property, color, scale, clip} = cfg;\n const segments = _segments(line, target, property);\n\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n\n ctx.save();\n ctx.fillStyle = backgroundColor;\n\n clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));\n\n ctx.beginPath();\n\n const lineLoop = !!line.pathSegment(ctx, src);\n\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n\n ctx.restore();\n }\n}\n\nfunction clipBounds(ctx, scale, clip, bounds) {\n const chartArea = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n\n if (property === 'x' || property === 'y') {\n let left, top, right, bottom;\n\n if (property === 'x') {\n left = start;\n top = chartArea.top;\n right = end;\n bottom = chartArea.bottom;\n } else {\n left = chartArea.left;\n top = start;\n right = chartArea.right;\n bottom = end;\n }\n\n ctx.beginPath();\n\n if (clip) {\n left = Math.max(left, clip.left);\n right = Math.min(right, clip.right);\n top = Math.max(top, clip.top);\n bottom = Math.min(bottom, clip.bottom);\n }\n\n ctx.rect(left, top, right - left, bottom - top);\n ctx.clip();\n }\n}\n\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\n","/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n id: 'filler',\n\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import type { PropType } from 'vue'\nimport type {\n ChartType,\n ChartData,\n ChartOptions,\n Plugin,\n UpdateMode\n} from 'chart.js'\n\nexport const CommonProps = {\n data: {\n type: Object as PropType,\n required: true\n },\n options: {\n type: Object as PropType,\n default: () => ({})\n },\n plugins: {\n type: Array as PropType,\n default: () => []\n },\n datasetIdKey: {\n type: String,\n default: 'label'\n },\n updateMode: {\n type: String as PropType,\n default: undefined\n }\n} as const\n\nexport const A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n} as const\n\nexport const Props = {\n type: {\n type: String as PropType,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n} as const\n","import { isProxy, toRaw, version } from 'vue'\nimport type {\n Chart,\n ChartType,\n ChartData,\n ChartDataset,\n ChartOptions,\n DefaultDataPoint\n} from 'chart.js'\n\nexport const compatProps =\n version[0] === '2'\n ? (internals: I, props: T) =>\n Object.assign(internals, { attrs: props }) as unknown as I & T\n : (internals: I, props: T) =>\n Object.assign(internals, props)\n\nexport function toRawIfProxy(obj: T) {\n return isProxy(obj) ? toRaw(obj) : obj\n}\n\nexport function cloneProxy(obj: T, src = obj) {\n return isProxy(src) ? new Proxy(obj, {}) : obj\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions)\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey: string\n) {\n const addedDatasets: ChartDataset[] = []\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n )\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset\n }\n\n addedDatasets.push(currentDataset)\n\n Object.assign(currentDataset, nextDataset)\n\n return currentDataset\n }\n )\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey: string) {\n const nextData: ChartData = {\n labels: [],\n datasets: []\n }\n\n setLabels(nextData, data.labels)\n setDatasets(nextData, data.datasets, datasetIdKey)\n\n return nextData\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'dataset',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'nearest',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'index',\n { intersect: true },\n false\n )\n}\n","import { Chart as ChartJS } from 'chart.js'\nimport {\n defineComponent,\n h,\n nextTick,\n onUnmounted,\n onMounted,\n ref,\n shallowRef,\n toRaw,\n watch\n} from 'vue'\n\nimport type { ChartComponent } from './types.js'\nimport { Props } from './props.js'\nimport {\n cloneData,\n setLabels,\n setDatasets,\n setOptions,\n toRawIfProxy,\n cloneProxy\n} from './utils.js'\n\nexport const Chart = defineComponent({\n props: Props,\n setup(props, { expose, slots }) {\n const canvasRef = ref(null)\n const chartRef = shallowRef(null)\n\n expose({ chart: chartRef })\n\n const renderChart = () => {\n if (!canvasRef.value) return\n\n const { type, data, options, plugins, datasetIdKey } = props\n const clonedData = cloneData(data, datasetIdKey)\n const proxiedData = cloneProxy(clonedData, data)\n\n chartRef.value = new ChartJS(canvasRef.value, {\n type,\n data: proxiedData,\n options: { ...options },\n plugins\n })\n }\n\n const destroyChart = () => {\n const chart = toRaw(chartRef.value)\n\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(() => {\n chart.destroy()\n chartRef.value = null\n }, props.destroyDelay)\n } else {\n chart.destroy()\n chartRef.value = null\n }\n }\n }\n\n const update = (chart: ChartJS) => {\n chart.update(props.updateMode)\n }\n\n onMounted(renderChart)\n\n onUnmounted(destroyChart)\n\n watch(\n [() => props.options, () => props.data],\n (\n [nextOptionsProxy, nextDataProxy],\n [prevOptionsProxy, prevDataProxy]\n ) => {\n const chart = toRaw(chartRef.value)\n\n if (!chart) {\n return\n }\n\n let shouldUpdate = false\n\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy)\n const prevOptions = toRawIfProxy(prevOptionsProxy)\n\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions)\n shouldUpdate = true\n }\n }\n\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels)\n const prevLabels = toRawIfProxy(prevDataProxy.labels)\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets)\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets)\n\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels)\n shouldUpdate = true\n }\n\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey)\n shouldUpdate = true\n }\n }\n\n if (shouldUpdate) {\n nextTick(() => {\n update(chart)\n })\n }\n },\n { deep: true }\n )\n\n return () => {\n return h(\n 'canvas',\n {\n role: 'img',\n 'aria-label': props.ariaLabel,\n 'aria-describedby': props.ariaDescribedby,\n ref: canvasRef\n },\n [h('p', {}, [slots.default ? slots.default() : ''])]\n )\n }\n }\n}) as ChartComponent\n","import { defineComponent, shallowRef, h } from 'vue'\nimport type { ChartType, ChartComponentLike, DefaultDataPoint } from 'chart.js'\nimport {\n Chart as ChartJS,\n BarController,\n BubbleController,\n DoughnutController,\n LineController,\n PieController,\n PolarAreaController,\n RadarController,\n ScatterController\n} from 'chart.js'\nimport type { DistributiveArray } from 'chart.js/dist/types/utils'\nimport type { TypedChartComponent, ChartComponentRef } from './types.js'\nimport { CommonProps } from './props.js'\nimport { Chart } from './chart.js'\nimport { compatProps } from './utils.js'\n\nexport function createTypedChart<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n type: TType,\n registerables: ChartComponentLike\n): TypedChartComponent {\n ChartJS.register(registerables)\n\n return defineComponent({\n props: CommonProps,\n setup(props, { expose }) {\n const ref = shallowRef(null)\n const reforwardRef = (chartRef: ChartComponentRef) => {\n ref.value = chartRef?.chart\n }\n\n expose({ chart: ref })\n\n return () => {\n return h(\n Chart,\n compatProps(\n {\n ref: reforwardRef as any\n },\n {\n type,\n ...props\n }\n )\n )\n }\n }\n }) as any\n}\n\nexport interface ExtendedDataPoint {\n [key: string]: string | number | null | ExtendedDataPoint\n}\n\nexport const Bar = /* #__PURE__ */ createTypedChart<\n 'bar',\n DefaultDataPoint<'bar'> | DistributiveArray\n>('bar', BarController)\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n)\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController)\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController)\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n)\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController)\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n)\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n)\n","/**\r\n * BatchProcessor - 批量数据处理类\r\n * \r\n * 处理批量数据获取和处理的核心类,使用 cursor 分页机制获取所有数据。\r\n * 支持进度回调和取消功能。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\n\r\n/**\r\n * 批量操作错误类\r\n * 提供错误代码、是否可恢复、建议操作等信息\r\n */\r\nexport class BatchOperationError extends Error {\r\n constructor(message, code, recoverable = false, suggestion = '') {\r\n super(message);\r\n this.name = 'BatchOperationError';\r\n this.code = code;\r\n this.recoverable = recoverable;\r\n this.suggestion = suggestion;\r\n }\r\n}\r\n\r\n/**\r\n * 错误处理器映射\r\n * 根据 HTTP 状态码返回对应的错误对象\r\n */\r\nconst ERROR_HANDLERS = {\r\n 401: () => new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n ),\r\n 403: () => new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n ),\r\n 400: (details) => new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n ),\r\n 500: () => new BatchOperationError(\r\n '服务器内部错误',\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试,如果问题持续请联系管理员'\r\n ),\r\n NETWORK: () => new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n ),\r\n ABORT: () => new BatchOperationError(\r\n '操作已取消',\r\n 'ABORTED',\r\n false,\r\n ''\r\n )\r\n};\r\n\r\n/**\r\n * 根据错误创建 BatchOperationError\r\n * @param {Error|Response} error - 原始错误或响应对象\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\nfunction createError(error, details = '') {\r\n // 处理取消操作\r\n if (error.name === 'AbortError') {\r\n return ERROR_HANDLERS.ABORT();\r\n }\r\n \r\n // 处理 HTTP 响应错误\r\n if (error instanceof Response || (error && typeof error.status === 'number')) {\r\n const handler = ERROR_HANDLERS[error.status];\r\n if (handler) {\r\n return handler(details);\r\n }\r\n return new BatchOperationError(\r\n `请求失败: ${error.status}`,\r\n 'HTTP_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n \r\n // 处理网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n return ERROR_HANDLERS.NETWORK();\r\n }\r\n \r\n // 其他错误\r\n return new BatchOperationError(\r\n error.message || '未知错误',\r\n 'UNKNOWN_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n}\r\n\r\n/**\r\n * BatchProcessor 类\r\n * \r\n * 用于批量获取和处理数据的核心类\r\n */\r\nclass BatchProcessor {\r\n /**\r\n * 创建 BatchProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.batchSize - 每批数据量,默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.batchSize = options.batchSize || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * 获取所有数据记录\r\n * 使用 cursor 分页机制循环获取所有数据,直到没有更多数据或操作被取消\r\n * \r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 所有记录的数组\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async fetchAllRecords(includeValue = false) {\r\n // 创建新的 AbortController 用于取消操作\r\n this.abortController = new AbortController();\r\n const allRecords = [];\r\n let cursor = null;\r\n let totalFetched = 0;\r\n let batchCount = 0;\r\n\r\n try {\r\n do {\r\n // 检查是否已取消\r\n if (this.abortController.signal.aborted) {\r\n break;\r\n }\r\n\r\n // 获取一批数据\r\n const response = await this.fetchBatch(cursor, includeValue);\r\n \r\n // 合并数据到总数组\r\n allRecords.push(...response.records);\r\n cursor = response.nextCursor;\r\n totalFetched += response.records.length;\r\n batchCount++;\r\n\r\n // 调用进度回调\r\n this.onProgress({\r\n phase: 'fetching',\r\n current: totalFetched,\r\n batchCount: batchCount,\r\n message: `已获取 ${totalFetched} 条记录...`\r\n });\r\n\r\n } while (cursor && !this.abortController.signal.aborted);\r\n\r\n // 如果是因为取消而退出循环,抛出取消错误\r\n if (this.abortController.signal.aborted) {\r\n throw ERROR_HANDLERS.ABORT();\r\n }\r\n\r\n return allRecords;\r\n } catch (error) {\r\n // 调用错误回调\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : createError(error);\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 获取单批数据\r\n * \r\n * @param {string|null} cursor - 分页游标,首次请求为 null\r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 包含 records 和 nextCursor 的响应对象\r\n * @throws {BatchOperationError} 当请求失败时抛出\r\n */\r\n async fetchBatch(cursor, includeValue) {\r\n // 构建查询参数\r\n const params = new URLSearchParams();\r\n if (cursor) {\r\n params.set('cursor', cursor);\r\n }\r\n if (includeValue) {\r\n params.set('includeValue', 'true');\r\n }\r\n params.set('limit', String(this.batchSize));\r\n\r\n try {\r\n // 发送请求,传入 abort signal 支持取消\r\n const response = await fetchWithAuth(\r\n `/api/manage/batch/list?${params}`,\r\n { signal: this.abortController.signal }\r\n );\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw createError(response, errorDetails);\r\n }\r\n\r\n // 解析响应数据\r\n const data = await response.json();\r\n \r\n // 验证响应格式\r\n if (!data.success) {\r\n throw new BatchOperationError(\r\n data.error || '请求失败',\r\n 'API_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return {\r\n records: data.records || [],\r\n nextCursor: data.nextCursor || null,\r\n totalProcessed: data.totalProcessed || 0\r\n };\r\n } catch (error) {\r\n // 如果已经是 BatchOperationError,直接抛出\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 否则转换为 BatchOperationError\r\n throw createError(error);\r\n }\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n * 调用此方法将中止正在进行的 fetch 请求\r\n */\r\n abort() {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.abortController ? this.abortController.signal.aborted : false;\r\n }\r\n\r\n /**\r\n * 重置处理器状态\r\n * 在开始新的批量操作前调用\r\n */\r\n reset() {\r\n this.abortController = null;\r\n }\r\n}\r\n\r\nexport default BatchProcessor;\r\n","/**\r\n * IndexRebuilder - 索引重建类\r\n * \r\n * 处理索引重建的完整流程,包括数据获取、排序、分块上传和完成。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport BatchProcessor, { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * IndexRebuilder 类\r\n * \r\n * 用于重建索引的核心类,协调数据获取、排序和分块上传\r\n */\r\nclass IndexRebuilder {\r\n /**\r\n * 创建 IndexRebuilder 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每个分块的记录数,默认从后端获取\r\n * @param {number} options.maxRetries - 分块上传最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || null; // 从后端获取\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.sessionId = this.generateSessionId();\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 从后端获取索引配置(分块大小等)\r\n * @returns {Promise} 配置对象 { chunkSize, databaseType }\r\n */\r\n async fetchConfig() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/config');\r\n if (!response.ok) {\r\n throw new Error('获取配置失败');\r\n }\r\n const result = await response.json();\r\n if (result.success) {\r\n return {\r\n chunkSize: result.chunkSize || 500,\r\n databaseType: result.databaseType || 'unknown'\r\n };\r\n }\r\n throw new Error(result.error || '获取配置失败');\r\n } catch (error) {\r\n // 获取失败时使用保守的默认值(兼容 D1)\r\n console.warn('Failed to fetch index config, using default:', error);\r\n return { chunkSize: 500, databaseType: 'unknown' };\r\n }\r\n }\r\n\r\n /**\r\n * 执行索引重建\r\n * \r\n * 完整流程:\r\n * 1. 获取配置(分块大小)\r\n * 2. 获取所有记录\r\n * 3. 按时间戳降序排序\r\n * 4. 分块上传\r\n * 5. 完成重建\r\n * \r\n * @returns {Promise} 重建结果 { success: boolean, totalFiles: number }\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async rebuild() {\r\n this.aborted = false;\r\n \r\n try {\r\n // 获取配置(分块大小)\r\n if (!this.chunkSize) {\r\n const config = await this.fetchConfig();\r\n this.chunkSize = config.chunkSize;\r\n }\r\n\r\n // 获取所有记录\r\n this.onProgress({ \r\n phase: 'fetching', \r\n message: '正在获取数据...',\r\n current: 0\r\n });\r\n \r\n const processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' }),\r\n onError: (e) => this.onError(e)\r\n });\r\n \r\n const records = await processor.fetchAllRecords(false);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 排序(按时间戳降序)\r\n this.onProgress({ \r\n phase: 'sorting', \r\n message: '正在排序...',\r\n current: 0,\r\n total: records.length\r\n });\r\n \r\n this.sortByTimestampDescending(records);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 分块上传\r\n const chunks = this.splitIntoChunks(records);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n \r\n // 使用重试机制上传分块\r\n await this.uploadChunkWithRetry(chunks[i], i);\r\n \r\n this.onProgress({\r\n phase: 'uploading',\r\n current: i + 1,\r\n total: chunks.length,\r\n message: `正在上传分块 ${i + 1}/${chunks.length}...`\r\n });\r\n }\r\n\r\n // 完成重建\r\n this.onProgress({ \r\n phase: 'finalizing', \r\n message: '正在完成重建...',\r\n current: chunks.length,\r\n total: chunks.length\r\n });\r\n \r\n await this.finalize(chunks.length, records.length);\r\n\r\n this.onProgress({\r\n phase: 'completed',\r\n message: `索引重建完成,共 ${records.length} 个文件`,\r\n current: records.length,\r\n total: records.length\r\n });\r\n\r\n return { success: true, totalFiles: records.length };\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : new BatchOperationError(\r\n error.message || '索引重建失败',\r\n 'REBUILD_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 按时间戳降序排序记录\r\n * \r\n * @param {Array} records - 要排序的记录数组(原地排序)\r\n */\r\n sortByTimestampDescending(records) {\r\n records.sort((a, b) => {\r\n const timestampA = (a.metadata && a.metadata.TimeStamp) || 0;\r\n const timestampB = (b.metadata && b.metadata.TimeStamp) || 0;\r\n return timestampB - timestampA;\r\n });\r\n }\r\n\r\n /**\r\n * 将记录分割为多个块\r\n * \r\n * @param {Array} records - 要分割的记录数组\r\n * @returns {Array} 分块后的二维数组\r\n */\r\n splitIntoChunks(records) {\r\n const chunks = [];\r\n for (let i = 0; i < records.length; i += this.chunkSize) {\r\n chunks.push(records.slice(i, i + this.chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当所有重试都失败时抛出\r\n */\r\n async uploadChunkWithRetry(chunk, chunkId) {\r\n let lastError;\r\n \r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(chunk, chunkId);\r\n } catch (error) {\r\n lastError = error;\r\n \r\n // 不重试的错误类型\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' || \r\n error.code === 'FORBIDDEN' || \r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n \r\n // 如果还有重试机会,等待后重试\r\n if (attempt < this.maxRetries) {\r\n // 指数退避\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n \r\n this.onProgress({\r\n phase: 'retrying',\r\n message: `分块 ${chunkId + 1} 上传失败,正在重试 (${attempt}/${this.maxRetries})...`,\r\n current: chunkId,\r\n attempt: attempt\r\n });\r\n }\r\n }\r\n }\r\n \r\n // 所有重试都失败\r\n throw lastError instanceof BatchOperationError \r\n ? lastError \r\n : new BatchOperationError(\r\n `分块 ${chunkId + 1} 上传失败,已重试 ${this.maxRetries} 次`,\r\n 'CHUNK_UPLOAD_FAILED',\r\n false,\r\n '请检查网络连接后重新开始重建'\r\n );\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当上传失败时抛出\r\n */\r\n async uploadChunk(chunk, chunkId) {\r\n const checksum = await this.calculateChecksum(chunk);\r\n \r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n chunkId: String(chunkId),\r\n sessionId: this.sessionId,\r\n data: chunk,\r\n checksum\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 完成索引重建\r\n * \r\n * @param {number} totalChunks - 总分块数\r\n * @param {number} totalFiles - 总文件数\r\n * @returns {Promise} 完成响应\r\n * @throws {BatchOperationError} 当完成请求失败时抛出\r\n */\r\n async finalize(totalChunks, totalFiles) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/finalize', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n sessionId: this.sessionId,\r\n totalChunks,\r\n totalFiles\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n throw new BatchOperationError(\r\n error.message || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 生成唯一的会话 ID\r\n * \r\n * @returns {string} 会话 ID\r\n */\r\n generateSessionId() {\r\n return `rebuild_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n }\r\n\r\n /**\r\n * 计算数据的 SHA-256 校验和\r\n * \r\n * @param {Array} data - 要计算校验和的数据\r\n * @returns {Promise} 十六进制格式的校验和\r\n */\r\n async calculateChecksum(data) {\r\n const text = JSON.stringify(data);\r\n const encoder = new TextEncoder();\r\n const dataBuffer = encoder.encode(text);\r\n\r\n // crypto.subtle 仅在安全上下文(HTTPS / localhost)下可用\r\n // 通过 0.0.0.0 等非安全上下文访问时需要 fallback\r\n if (typeof crypto !== 'undefined' && crypto.subtle) {\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n // Fallback: 简单但足够用于校验的哈希实现 (FNV-1a 变体, 产生 64 位十六进制)\r\n let h1 = 0x811c9dc5 >>> 0;\r\n let h2 = 0x811c9dc5 >>> 0;\r\n for (let i = 0; i < dataBuffer.length; i++) {\r\n h1 = Math.imul(h1 ^ dataBuffer[i], 0x01000193) >>> 0;\r\n h2 = Math.imul(h2 ^ dataBuffer[i], 0x01000193 + 0x10) >>> 0;\r\n }\r\n return h1.toString(16).padStart(8, '0') + h2.toString(16).padStart(8, '0');\r\n }\r\n\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n * \r\n * @param {number} status - HTTP 状态码\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n );\r\n case 404:\r\n return new BatchOperationError(\r\n '会话不存在',\r\n 'SESSION_NOT_FOUND',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 410:\r\n return new BatchOperationError(\r\n '会话已过期',\r\n 'SESSION_EXPIRED',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n * \r\n * @param {number} ms - 延迟毫秒数\r\n * @returns {Promise}\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n\r\n /**\r\n * 重置重建器状态\r\n * 在开始新的重建操作前调用\r\n */\r\n reset() {\r\n this.aborted = false;\r\n this.sessionId = this.generateSessionId();\r\n }\r\n}\r\n\r\nexport default IndexRebuilder;\r\n","/**\r\n * BackupGenerator - 备份数据生成类\r\n * \r\n * 处理前端辅助备份功能,获取所有文件记录(包含分块文件的 value),\r\n * 构建完整的备份 JSON 文件,并触发浏览器下载。\r\n */\r\n\r\nimport BatchProcessor from '@/utils/batchProcessor';\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport packageInfo from '../../package.json'\r\n\r\n/**\r\n * BackupGenerator 类\r\n * \r\n * 用于生成和下载备份数据的类\r\n */\r\nclass BackupGenerator {\r\n /**\r\n * 创建 BackupGenerator 实例\r\n * @param {Object} options - 配置选项\r\n * @param {Function} options.onProgress - 进度回调函数\r\n */\r\n constructor(options = {}) {\r\n this.onProgress = options.onProgress || (() => {});\r\n this.processor = null;\r\n }\r\n\r\n /**\r\n * 生成并下载备份\r\n * \r\n * 完整流程:\r\n * 1. 获取所有文件记录(包含分块文件的 value)\r\n * 2. 构建备份数据结构\r\n * 3. 获取系统设置\r\n * 4. 生成并触发下载\r\n * \r\n * @returns {Promise} 包含 success 和 fileCount 的结果对象\r\n * @throws {Error} 当备份过程中发生错误时抛出\r\n */\r\n async generateBackup() {\r\n // 获取所有文件记录(包含分块文件的 value)\r\n this.processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' })\r\n });\r\n\r\n const records = await this.processor.fetchAllRecords(true);\r\n\r\n // 构建备份数据\r\n this.onProgress({ phase: 'building', message: '正在构建备份数据...' });\r\n\r\n const backupData = {\r\n timestamp: Date.now(),\r\n version: packageInfo.version,\r\n data: {\r\n fileCount: records.length,\r\n files: {},\r\n settings: {}\r\n }\r\n };\r\n\r\n // 将记录转换为以 id 为键的对象格式\r\n for (const record of records) {\r\n backupData.data.files[record.id] = {\r\n metadata: record.metadata,\r\n value: record.value || null\r\n };\r\n }\r\n\r\n // 3. 获取系统设置\r\n const settings = await this.fetchSettings();\r\n backupData.data.settings = settings;\r\n\r\n // 生成下载\r\n this.onProgress({ phase: 'downloading', message: '正在生成下载...' });\r\n this.downloadBackup(backupData);\r\n\r\n const settingsCount = Object.keys(settings).length;\r\n return { success: true, fileCount: records.length, settingsCount };\r\n }\r\n\r\n /**\r\n * 获取系统设置\r\n * \r\n * @returns {Promise} 系统设置对象,失败时返回空对象\r\n */\r\n async fetchSettings() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/settings');\r\n if (!response.ok) {\r\n console.warn('Failed to fetch settings:', response.status);\r\n return {};\r\n }\r\n const data = await response.json();\r\n // 返回 settings 字段,而不是整个响应\r\n return data.settings || {};\r\n } catch (error) {\r\n console.warn('Failed to fetch settings:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * 触发浏览器下载备份文件\r\n * \r\n * @param {Object} data - 备份数据对象\r\n */\r\n downloadBackup(data) {\r\n // 将数据转换为格式化的 JSON 字符串\r\n const json = JSON.stringify(data, null, 2);\r\n \r\n // 创建 Blob 对象\r\n const blob = new Blob([json], { type: 'application/json' });\r\n \r\n // 创建下载 URL\r\n const url = URL.createObjectURL(blob);\r\n\r\n // 创建临时下载链接\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // 使用日期作为文件名的一部分\r\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\r\n \r\n // 触发下载\r\n document.body.appendChild(a);\r\n a.click();\r\n \r\n // 清理\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * 取消当前备份操作\r\n */\r\n abort() {\r\n if (this.processor) {\r\n this.processor.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.processor ? this.processor.isAborted() : false;\r\n }\r\n}\r\n\r\nexport default BackupGenerator;\r\n","/**\r\n * RestoreProcessor - 分批恢复数据类\r\n * \r\n * 将备份数据分批上传到后端进行恢复,避免 CPU 超时\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * RestoreProcessor 类\r\n */\r\nclass RestoreProcessor {\r\n /**\r\n * 创建 RestoreProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每批数据量,默认 50\r\n * @param {number} options.maxRetries - 最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 50;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行恢复操作\r\n * \r\n * @param {Object} backupData - 备份数据对象\r\n * @returns {Promise} 恢复结果\r\n */\r\n async restore(backupData) {\r\n this.aborted = false;\r\n\r\n // 验证备份数据格式\r\n if (!backupData || !backupData.data) {\r\n throw new BatchOperationError(\r\n '备份文件格式无效',\r\n 'INVALID_BACKUP',\r\n false,\r\n '请选择有效的备份文件'\r\n );\r\n }\r\n\r\n const { files = {}, settings = {} } = backupData.data;\r\n const fileEntries = Object.entries(files);\r\n const settingEntries = Object.entries(settings);\r\n \r\n const totalFiles = fileEntries.length;\r\n const totalSettings = settingEntries.length;\r\n const totalItems = totalFiles + totalSettings;\r\n\r\n let restoredFiles = 0;\r\n let restoredSettings = 0;\r\n let failedFiles = 0;\r\n let failedSettings = 0;\r\n\r\n try {\r\n // 1. 分批恢复文件数据\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: '正在恢复文件数据...',\r\n current: 0,\r\n total: totalItems\r\n });\r\n\r\n const fileChunks = this.splitIntoChunks(fileEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < fileChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = fileChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('files', chunkData);\r\n restoredFiles += result.restoredCount;\r\n failedFiles += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: `正在恢复文件数据 ${restoredFiles}/${totalFiles}...`,\r\n current: restoredFiles,\r\n total: totalItems,\r\n percentage: (restoredFiles / totalItems) * 80\r\n });\r\n }\r\n\r\n // 2. 分批恢复系统设置\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: '正在恢复系统设置...',\r\n current: restoredFiles,\r\n total: totalItems\r\n });\r\n\r\n const settingChunks = this.splitIntoChunks(settingEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < settingChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = settingChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('settings', chunkData);\r\n restoredSettings += result.restoredCount;\r\n failedSettings += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: `正在恢复系统设置 ${restoredSettings}/${totalSettings}...`,\r\n current: restoredFiles + restoredSettings,\r\n total: totalItems,\r\n percentage: 80 + (restoredSettings / totalSettings) * 20\r\n });\r\n }\r\n\r\n // 3. 完成\r\n this.onProgress({\r\n phase: 'completed',\r\n message: '恢复完成',\r\n current: totalItems,\r\n total: totalItems,\r\n percentage: 100\r\n });\r\n\r\n return {\r\n success: true,\r\n restoredFiles,\r\n restoredSettings,\r\n failedFiles,\r\n failedSettings,\r\n backupTimestamp: backupData.timestamp\r\n };\r\n\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError\r\n ? error\r\n : new BatchOperationError(\r\n error.message || '恢复失败',\r\n 'RESTORE_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 将数组分割为多个块\r\n */\r\n splitIntoChunks(entries, chunkSize) {\r\n const chunks = [];\r\n for (let i = 0; i < entries.length; i += chunkSize) {\r\n chunks.push(entries.slice(i, i + chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n */\r\n async uploadChunkWithRetry(type, data) {\r\n let lastError;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(type, data);\r\n } catch (error) {\r\n lastError = error;\r\n\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' ||\r\n error.code === 'FORBIDDEN' ||\r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n\r\n if (attempt < this.maxRetries) {\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n }\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n */\r\n async uploadChunk(type, data) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/restore/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ type, data })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n\r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查备份文件格式'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n}\r\n\r\nexport default RestoreProcessor;\r\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/es.set.difference.v2.js\";\nimport \"core-js/modules/es.set.intersection.v2.js\";\nimport \"core-js/modules/es.set.is-disjoint-from.v2.js\";\nimport \"core-js/modules/es.set.is-subset-of.v2.js\";\nimport \"core-js/modules/es.set.is-superset-of.v2.js\";\nimport \"core-js/modules/es.set.symmetric-difference.v2.js\";\nimport \"core-js/modules/es.set.union.v2.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport \"core-js/modules/web.url-search-params.delete.js\";\nimport \"core-js/modules/web.url-search-params.has.js\";\nimport \"core-js/modules/web.url-search-params.size.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport packageInfo from '../../../package.json';\nimport { Doughnut, Line } from 'vue-chartjs';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler } from 'chart.js';\nimport IndexRebuilder from '@/utils/indexRebuilder';\nimport BackupGenerator from '@/utils/backupGenerator';\nimport RestoreProcessor from '@/utils/restoreProcessor';\nimport DateRangeCalendar from '@/components/DateRangeCalendar.vue';\nChartJS.register(ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler);\nconst DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateInput(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction getDefaultTrendDateRange() {\n const endDate = new Date();\n endDate.setHours(0, 0, 0, 0);\n const startDate = new Date(endDate.getTime() - 6 * DAY_MS);\n return [formatDateInput(startDate), formatDateInput(endDate)];\n}\nexport default {\n name: 'SysCogStatus',\n components: {\n Doughnut,\n Line,\n DateRangeCalendar\n },\n data() {\n return {\n loading: false,\n rebuilding: false,\n backing: false,\n restoring: false,\n indexInfo: {},\n version: packageInfo.version,\n // 从package.json获取版本号\n loadErrors: {\n newest: false,\n oldest: false\n },\n trendGroupBy: 'channel',\n trendDatePickerVisible: false,\n trendDateRange: getDefaultTrendDateRange(),\n // 渠道图表颜色\n channelColors: ['#8B5CF6', '#EC4899', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#6366F1', '#84CC16'],\n // 状态图表颜色\n typeColors: ['#10B981', '#3B82F6', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4', '#84CC16'],\n // 上传趋势折线图颜色\n trendColors: ['#2563EB', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#06B6D4', '#EC4899', '#84CC16', '#64748B'],\n // 批量操作进度状态\n isProcessing: false,\n processingPhase: '',\n // fetching, sorting, uploading, finalizing, building, downloading, completed\n processingProgress: {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n },\n processingError: null,\n processingStartTime: null,\n // 当前处理器实例(用于取消操作)\n currentRebuilder: null,\n currentBackupGenerator: null,\n currentRestoreProcessor: null\n };\n },\n computed: {\n // 渠道分布图表数据\n channelChartData() {\n const stats = this.indexInfo.channelStats || {};\n return {\n labels: Object.keys(stats),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.channelColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 文件状态图表数据 - 将Block映射为\"已屏蔽\",其余为\"正常\"\n typeChartData() {\n const aggregatedStats = this.aggregatedTypeStats;\n return {\n labels: Object.keys(aggregatedStats),\n datasets: [{\n data: Object.values(aggregatedStats),\n backgroundColor: this.typeColors.slice(0, Object.keys(aggregatedStats).length),\n borderWidth: 0\n }]\n };\n },\n // 聚合后的状态统计:Block -> 已屏蔽,其余 -> 正常\n aggregatedTypeStats() {\n const stats = this.indexInfo.typeStats || {};\n const aggregatedStats = {};\n for (const [status, count] of Object.entries(stats)) {\n const mappedStatus = status === 'Block' ? this.$t('sysStatus.blocked') : this.$t('sysStatus.normalStatus');\n aggregatedStats[mappedStatus] = (aggregatedStats[mappedStatus] || 0) + count;\n }\n return aggregatedStats;\n },\n // 当前趋势维度数据\n currentTrendGroup() {\n const trend = this.indexInfo.uploadTrend || {};\n const groupBy = trend.groupBy || {};\n return groupBy[this.trendGroupBy] || {\n series: []\n };\n },\n // 趋势图原始日期标签\n trendRawLabels() {\n const trend = this.indexInfo.uploadTrend || {};\n return trend.labels || [];\n },\n // 当前范围是否跨年\n trendRangeCrossesYear() {\n const years = new Set();\n this.trendRawLabels.forEach(label => {\n this.extractTrendLabelDates(label).forEach(date => years.add(date.year));\n });\n return years.size > 1;\n },\n // 用于横轴展示的短日期标签\n trendDisplayLabels() {\n return this.trendRawLabels.map(label => this.formatTrendAxisLabel(label));\n },\n // 是否存在趋势图数据\n hasTrendData() {\n const trend = this.indexInfo.uploadTrend || {};\n return (trend.labels || []).length > 0;\n },\n // 日期选择弹窗宽度保持与项目内其他弹窗一致\n trendDateDialogWidth() {\n return window.innerWidth > 768 ? '420px' : '90%';\n },\n // 上传趋势折线图数据\n uploadTrendChartData() {\n const trend = this.indexInfo.uploadTrend || {};\n const series = this.currentTrendGroup.series || [];\n const totalColor = '#F97316';\n return {\n labels: this.trendDisplayLabels,\n datasets: [{\n label: this.$t('sysStatus.totalUploads'),\n data: trend.total || [],\n borderColor: totalColor,\n backgroundColor: this.hexToRgba(totalColor, 0.1),\n pointBackgroundColor: totalColor,\n pointBorderColor: totalColor,\n borderWidth: 3,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.28,\n fill: false\n }, ...series.map((item, index) => {\n const color = this.getTrendColor(index);\n return {\n label: this.formatTrendSeriesName(item),\n data: item.data || [],\n borderColor: color,\n backgroundColor: this.hexToRgba(color, 0.12),\n pointBackgroundColor: color,\n pointBorderColor: color,\n borderWidth: 2,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.32,\n fill: false\n };\n })]\n };\n },\n // 折线图配置\n lineChartOptions() {\n const textColor = '#64748B';\n return {\n responsive: true,\n maintainAspectRatio: false,\n interaction: {\n mode: 'index',\n intersect: false\n },\n plugins: {\n legend: {\n display: true,\n position: 'bottom',\n labels: {\n usePointStyle: true,\n boxWidth: 8,\n boxHeight: 8,\n padding: 16,\n color: textColor\n }\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n callbacks: {\n title: items => {\n const index = items?.[0]?.dataIndex;\n return this.trendRawLabels[index] || '';\n },\n label: context => {\n const parsed = context.parsed || {};\n const value = parsed.y !== undefined ? parsed.y : context.raw;\n return ` ${context.dataset.label}: ${Number(value || 0).toLocaleString()} ${this.$t('sysStatus.uploadsUnit')}`;\n }\n }\n }\n },\n scales: {\n x: {\n grid: {\n display: false\n },\n ticks: {\n color: textColor,\n maxTicksLimit: 8,\n autoSkip: true\n }\n },\n y: {\n beginAtZero: true,\n grid: {\n color: 'rgba(148, 163, 184, 0.18)'\n },\n ticks: {\n color: textColor,\n precision: 0,\n callback: value => Number(value).toLocaleString()\n }\n }\n }\n };\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n hoverOffset: 8,\n layout: {\n padding: 10\n },\n plugins: {\n legend: {\n display: false\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n z: 100,\n callbacks: {\n label: context => {\n const value = context.raw;\n const total = context.dataset.data.reduce((a, b) => a + b, 0);\n const percentage = (value / total * 100).toFixed(1);\n return ` ${value.toLocaleString()} (${percentage}%)`;\n }\n }\n }\n },\n animation: {\n animateRotate: true,\n animateScale: true\n }\n };\n },\n // 预计剩余时间\n estimatedTimeRemaining() {\n if (!this.isProcessing || !this.processingStartTime) return '';\n if (this.processingProgress.current === 0 || this.processingProgress.percentage === 0) return '';\n const elapsed = Date.now() - this.processingStartTime;\n const progress = this.processingProgress.percentage / 100;\n if (progress <= 0) return '';\n const totalEstimated = elapsed / progress;\n const remaining = totalEstimated - elapsed;\n if (remaining <= 0) return this.$t('sysStatus.aboutToComplete');\n const seconds = Math.ceil(remaining / 1000);\n if (seconds < 60) return this.$t('sysStatus.seconds', {\n count: seconds\n });\n const minutes = Math.ceil(seconds / 60);\n if (minutes < 60) return this.$t('sysStatus.minutes', {\n count: minutes\n });\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return this.$t('sysStatus.hoursMinutes', {\n hours,\n minutes: remainingMinutes\n });\n },\n // 处理阶段描述\n phaseDescription() {\n const phaseMap = {\n 'fetching': this.$t('sysStatus.phaseFetching'),\n 'sorting': this.$t('sysStatus.phaseSorting'),\n 'uploading': this.$t('sysStatus.phaseUploading'),\n 'finalizing': this.$t('sysStatus.phaseFinalizing'),\n 'building': this.$t('sysStatus.phaseBuilding'),\n 'downloading': this.$t('sysStatus.phaseDownloading'),\n 'restoring_files': this.$t('sysStatus.phaseRestoringFiles'),\n 'restoring_settings': this.$t('sysStatus.phaseRestoringSettings'),\n 'completed': this.$t('sysStatus.phaseCompleted'),\n 'retrying': this.$t('sysStatus.phaseRetrying')\n };\n return phaseMap[this.processingPhase] || this.processingPhase;\n }\n },\n mounted() {\n this.fetchIndexInfo();\n },\n methods: {\n // 获取渠道图表颜色\n getChartColor(index) {\n return this.channelColors[index % this.channelColors.length];\n },\n // 获取状态图表颜色\n getTypeChartColor(index) {\n return this.typeColors[index % this.typeColors.length];\n },\n // 获取趋势图表颜色\n getTrendColor(index) {\n return this.trendColors[index % this.trendColors.length];\n },\n // 格式化趋势序列名称\n formatTrendSeriesName(series) {\n if (series?.isOther || series?.name === '__other__') {\n return this.$t('sysStatus.otherChannels');\n }\n return series?.name || this.$t('sysStatus.unknown');\n },\n // 十六进制颜色转换为 rgba\n hexToRgba(hex, alpha) {\n const normalized = (hex || '').replace('#', '');\n if (normalized.length !== 6) {\n return `rgba(37, 99, 235, ${alpha})`;\n }\n const r = parseInt(normalized.slice(0, 2), 16);\n const g = parseInt(normalized.slice(2, 4), 16);\n const b = parseInt(normalized.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n },\n // 提取趋势标签中的日期\n extractTrendLabelDates(label) {\n const matches = String(label || '').match(/\\d{4}-\\d{2}-\\d{2}/g) || [];\n return matches.map(item => {\n const [year, month, day] = item.split('-').map(Number);\n return {\n year,\n month,\n day\n };\n });\n },\n // 横轴日期标签按范围简化,仅跨年时显示年份\n formatTrendAxisLabel(label) {\n const dates = this.extractTrendLabelDates(label);\n if (dates.length === 0) return label;\n const formatSingleDate = (date, includeYear) => {\n const monthDay = `${date.month}/${date.day}`;\n return includeYear ? `${date.year}/${monthDay}` : monthDay;\n };\n if (dates.length === 1) {\n return formatSingleDate(dates[0], this.trendRangeCrossesYear);\n }\n const [startDate, endDate] = dates;\n if (!this.trendRangeCrossesYear) {\n return `${formatSingleDate(startDate, false)}-${formatSingleDate(endDate, false)}`;\n }\n const endLabel = startDate.year === endDate.year ? formatSingleDate(endDate, false) : formatSingleDate(endDate, true);\n return `${formatSingleDate(startDate, true)}-${endLabel}`;\n },\n // 打开居中的日期范围选择弹窗\n openTrendDateDialog() {\n this.trendDatePickerVisible = true;\n },\n // 日期范围变更后重新拉取趋势数据\n handleTrendDateRangeChange(value) {\n if (!Array.isArray(value) || value.length !== 2 || !value[0] || !value[1]) {\n return;\n }\n this.trendDatePickerVisible = false;\n this.fetchIndexInfo();\n },\n // 获取趋势查询参数\n getTrendDateRangeParams() {\n if (!Array.isArray(this.trendDateRange) || this.trendDateRange.length !== 2) {\n this.trendDateRange = getDefaultTrendDateRange();\n }\n return {\n startDate: this.trendDateRange[0],\n endDate: this.trendDateRange[1]\n };\n },\n // 获取索引信息\n async fetchIndexInfo() {\n this.loading = true;\n try {\n const {\n startDate,\n endDate\n } = this.getTrendDateRangeParams();\n const params = new URLSearchParams({\n action: 'info',\n timezoneOffset: String(new Date().getTimezoneOffset()),\n trendMaxPoints: '90',\n trendSeriesLimit: '8',\n trendStartDate: startDate,\n trendEndDate: endDate\n });\n const response = await fetchWithAuth(`/api/manage/list?${params.toString()}`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.indexInfo = data;\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('获取索引信息失败:', error);\n this.$message.error(this.$t('sysStatus.fetchIndexFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 重建索引 - 使用前端辅助重建流程\n async rebuildIndex() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.rebuilding = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 IndexRebuilder 实例\n this.currentRebuilder = new IndexRebuilder({\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n try {\n const result = await this.currentRebuilder.rebuild();\n\n // 成功完成\n this.$message.success(this.$t('sysStatus.rebuildSuccess', {\n count: result.totalFiles.toLocaleString()\n }));\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.rebuilding = false;\n this.isProcessing = false;\n this.currentRebuilder = null;\n this.processingStartTime = null;\n }\n },\n // 备份数据 - 使用前端辅助备份流程\n async backupData() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.backing = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 BackupGenerator 实例\n this.currentBackupGenerator = new BackupGenerator({\n onProgress: progress => this.handleProgress(progress)\n });\n try {\n const result = await this.currentBackupGenerator.generateBackup();\n\n // 成功完成\n const settingsMsg = result.settingsCount > 0 ? this.$t('sysStatus.backupSuccessWithSettings', {\n fileCount: result.fileCount.toLocaleString(),\n settingsCount: result.settingsCount\n }) : this.$t('sysStatus.backupSuccess', {\n count: result.fileCount.toLocaleString()\n });\n this.$message.success(settingsMsg);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.backing = false;\n this.isProcessing = false;\n this.currentBackupGenerator = null;\n this.processingStartTime = null;\n }\n },\n // 选择恢复文件\n selectRestoreFile() {\n if (this.restoring) return;\n this.$refs.fileInput.click();\n },\n // 处理文件选择\n async handleFileSelect(event) {\n const file = event.target.files[0];\n if (!file) return;\n if (!file.name.endsWith('.json')) {\n this.$message.error(this.$t('sysStatus.selectJsonFile'));\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm(this.$t('sysStatus.restoreConfirmMessage'), this.$t('sysStatus.restoreConfirmTitle'), {\n confirmButtonText: this.$t('sysStatus.restoreConfirmOk'),\n cancelButtonText: this.$t('sysStatus.restoreConfirmCancel'),\n type: 'warning'\n });\n await this.restoreData(file);\n } catch (error) {\n if (error !== 'cancel') {\n console.error('确认恢复失败:', error);\n }\n }\n\n // 清除文件选择\n event.target.value = '';\n },\n // 恢复数据 - 使用前端辅助分批恢复流程\n async restoreData(file) {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.restoring = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n try {\n // 解析备份文件\n const fileContent = await file.text();\n let backupData;\n try {\n backupData = JSON.parse(fileContent);\n } catch (parseError) {\n throw new Error(this.$t('sysStatus.invalidBackupFile'));\n }\n\n // 创建 RestoreProcessor 实例\n this.currentRestoreProcessor = new RestoreProcessor({\n chunkSize: 100,\n // 每批恢复 100 条\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n const result = await this.currentRestoreProcessor.restore(backupData);\n\n // 恢复完成,重置恢复状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n\n // 显示恢复成功消息\n this.$message.success(this.$t('sysStatus.restoreSuccess', {\n files: result.restoredFiles,\n settings: result.restoredSettings\n }));\n\n // 短暂延迟后自动开始重建索引\n await new Promise(resolve => setTimeout(resolve, 500));\n await this.rebuildIndex();\n } catch (error) {\n console.error('恢复数据失败:', error);\n\n // 出错时重置状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(this.$t('sysStatus.restoreFailed') + ': ' + errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return this.$t('sysStatus.unknown');\n const date = new Date(timestamp);\n return date.toLocaleString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n },\n // 计算百分比\n getPercentage(value, total) {\n if (!total || total === 0) return 0;\n return Math.round(value / total * 100);\n },\n // 计算时间差\n getTimeAgo(timestamp) {\n if (!timestamp) return '';\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n if (days > 0) return this.$t('sysStatus.daysAgo', {\n count: days\n });\n if (hours > 0) return this.$t('sysStatus.hoursAgo', {\n count: hours\n });\n if (minutes > 0) return this.$t('sysStatus.minutesAgo', {\n count: minutes\n });\n return this.$t('sysStatus.justNow');\n },\n // 图片加载失败处理\n handleImageError(type) {\n this.loadErrors[type] = true;\n },\n // 检查是否应该显示预览图\n isValidPreview(type, file) {\n if (this.loadErrors[type]) return false;\n if (!file?.metadata?.FileType) return false;\n return file.metadata.FileType.includes('image') || file.metadata.FileType.includes('video');\n },\n // 打开发布页面\n openReleases() {\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/releases', '_blank');\n },\n // 判断是否为图片文件\n isImageFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('image')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'avif', 'heic', 'heif'];\n return imageExtensions.includes(extension);\n },\n // 判断是否为视频文件\n isVideoFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('video')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'm4v', '3gp', 'mpeg', 'mpg'];\n return videoExtensions.includes(extension);\n },\n // 在新窗口打开文件\n openFileInNewTab(file) {\n if (!file?.id) return;\n window.open('/file/' + file.id + '?from=admin', '_blank');\n },\n // 处理进度更新\n handleProgress(progress) {\n this.processingPhase = progress.phase;\n this.processingProgress.message = progress.message || '';\n this.processingProgress.current = progress.current || 0;\n\n // 根据不同阶段计算进度百分比\n if (progress.phase === 'fetching') {\n // 获取阶段:基于已获取的记录数估算(假设总数未知时显示已获取数量)\n this.processingProgress.total = progress.total || 0;\n // 获取阶段占总进度的 60%\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = Math.min(60, progress.current / progress.total * 60);\n } else {\n // 未知总数时,使用对数增长模拟进度\n this.processingProgress.percentage = Math.min(50, Math.log10(progress.current + 1) * 15);\n }\n } else if (progress.phase === 'sorting') {\n // 排序阶段:占 60-70%\n this.processingProgress.percentage = 65;\n this.processingProgress.total = progress.total || this.processingProgress.total;\n } else if (progress.phase === 'uploading') {\n // 上传阶段:占 70-95%\n this.processingProgress.total = progress.total || 0;\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = 70 + progress.current / progress.total * 25;\n }\n } else if (progress.phase === 'finalizing') {\n // 完成阶段:95-100%\n this.processingProgress.percentage = 97;\n } else if (progress.phase === 'building') {\n // 构建备份阶段:70-90%\n this.processingProgress.percentage = 80;\n } else if (progress.phase === 'downloading') {\n // 下载阶段:90-100%\n this.processingProgress.percentage = 95;\n } else if (progress.phase === 'restoring_files') {\n // 恢复文件阶段:0-80%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 0;\n } else if (progress.phase === 'restoring_settings') {\n // 恢复设置阶段:80-100%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 80;\n } else if (progress.phase === 'completed') {\n // 完成\n this.processingProgress.percentage = 100;\n } else if (progress.phase === 'retrying') {\n // 重试阶段:保持当前进度\n this.processingProgress.message = progress.message;\n }\n },\n // 处理错误\n handleError(error) {\n console.error('批量操作错误:', error);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n },\n // 取消当前操作\n cancelOperation() {\n if (this.currentRebuilder) {\n this.currentRebuilder.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentBackupGenerator) {\n this.currentBackupGenerator.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentRestoreProcessor) {\n this.currentRestoreProcessor.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n },\n // 重试操作\n retryOperation() {\n this.processingError = null;\n if (this.rebuilding) {\n this.rebuilding = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.rebuildIndex();\n });\n } else if (this.backing) {\n this.backing = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.backupData();\n });\n }\n },\n // 关闭错误提示\n dismissError() {\n this.processingError = null;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=90d03e30&scoped=true\"\nimport script from \"./SysCogStatus.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogStatus.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogStatus.vue?vue&type=style&index=0&id=90d03e30&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-90d03e30\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, createBlock as _createBlock, createCommentVNode as _createCommentVNode, vShow as _vShow, withModifiers as _withModifiers, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"custom-select\", {\n 'is-open': $data.isOpen\n }]),\n style: _normalizeStyle({\n width: $props.width\n })\n }, [_createElementVNode(\"div\", {\n class: \"custom-select-trigger\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleDropdown && $options.toggleDropdown(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-select-value\", {\n 'is-placeholder': !$props.modelValue\n }])\n }, _toDisplayString($options.displayLabel), 3), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"custom-select-arrow\"\n })]), _createVNode(_Transition, {\n name: \"dropdown-fade\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: \"custom-select-dropdown\",\n onClick: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.options, option => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: option.value,\n class: _normalizeClass([\"custom-select-option\", {\n 'is-selected': $props.modelValue === option.value\n }]),\n onClick: $event => $options.selectOption(option.value)\n }, [_renderSlot(_ctx.$slots, \"option\", {\n option: option\n }, () => [option.channelType ? (_openBlock(), _createBlock(_component_ChannelIcon, {\n key: 0,\n type: option.channelType,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"type\", \"class\"])) : option.icon ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: option.icon,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"icon\", \"class\"])) : _createCommentVNode(\"\", true), _createElementVNode(\"span\", null, _toDisplayString(option.label), 1)], true)], 10, _hoisted_1);\n }), 128))], 512), [[_vShow, $data.isOpen]])]),\n _: 3\n })], 6);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nexport default {\n name: 'CustomSelect',\n components: {\n ChannelIcon\n },\n props: {\n modelValue: {\n type: [String, Number],\n default: ''\n },\n options: {\n type: Array,\n required: true\n // 格式: [{ value: '', label: '', icon?: '', iconClass?: '', channelType?: '' }]\n },\n placeholder: {\n type: String,\n default: ''\n },\n width: {\n type: String,\n default: '160px'\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n isOpen: false\n };\n },\n computed: {\n resolvedPlaceholder() {\n return this.placeholder || this.$t('common.select');\n },\n displayLabel() {\n const selected = this.options.find(opt => opt.value === this.modelValue);\n return selected ? selected.label : this.resolvedPlaceholder;\n }\n },\n mounted() {\n document.addEventListener('click', this.handleClickOutside);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleClickOutside);\n },\n methods: {\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n },\n selectOption(value) {\n this.$emit('update:modelValue', value);\n this.$emit('change', value);\n this.isOpen = false;\n },\n handleClickOutside(e) {\n if (!this.$el.contains(e.target)) {\n this.isOpen = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomSelect.vue?vue&type=template&id=3c680cc7&scoped=true\"\nimport script from \"./CustomSelect.vue?vue&type=script&lang=js\"\nexport * from \"./CustomSelect.vue?vue&type=script&lang=js\"\n\nimport \"./CustomSelect.vue?vue&type=style&index=0&id=3c680cc7&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3c680cc7\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, createCommentVNode as _createCommentVNode, createBlock as _createBlock, withModifiers as _withModifiers, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"page-header\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"header-actions\"\n};\nconst _hoisted_5 = {\n class: \"group-header\"\n};\nconst _hoisted_6 = {\n class: \"group-title\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"load-balance-switch\"\n};\nconst _hoisted_8 = {\n class: \"switch-label\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"channel-cards\"\n};\nconst _hoisted_10 = [\"onMousemove\", \"onMouseleave\"];\nconst _hoisted_11 = {\n class: \"card-header\"\n};\nconst _hoisted_12 = {\n class: \"card-title\"\n};\nconst _hoisted_13 = {\n class: \"channel-name\"\n};\nconst _hoisted_14 = {\n class: \"card-body\"\n};\nconst _hoisted_15 = {\n class: \"card-info\"\n};\nconst _hoisted_16 = {\n class: \"info-item\"\n};\nconst _hoisted_17 = {\n class: \"info-text\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_19 = {\n class: \"info-text\"\n};\nconst _hoisted_20 = {\n key: 1,\n class: \"info-item\"\n};\nconst _hoisted_21 = [\"title\"];\nconst _hoisted_22 = {\n class: \"info-item\"\n};\nconst _hoisted_23 = {\n class: \"info-text\"\n};\nconst _hoisted_24 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_25 = [\"title\"];\nconst _hoisted_26 = {\n class: \"info-item\"\n};\nconst _hoisted_27 = {\n class: \"info-text\"\n};\nconst _hoisted_28 = {\n class: \"info-item\"\n};\nconst _hoisted_29 = {\n class: \"info-text\"\n};\nconst _hoisted_30 = {\n class: \"info-item\"\n};\nconst _hoisted_31 = {\n class: \"info-text\"\n};\nconst _hoisted_32 = {\n class: \"info-item\"\n};\nconst _hoisted_33 = [\"title\"];\nconst _hoisted_34 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_35 = [\"title\"];\nconst _hoisted_36 = {\n key: 0,\n class: \"quota-mini\"\n};\nconst _hoisted_37 = {\n class: \"quota-text\"\n};\nconst _hoisted_38 = {\n class: \"card-actions\"\n};\nconst _hoisted_39 = {\n key: 1,\n class: \"empty-tip\"\n};\nconst _hoisted_40 = {\n class: \"channel-type-option\"\n};\nconst _hoisted_41 = {\n key: 0,\n class: \"form-warning\",\n style: {\n \"margin-top\": \"0\"\n }\n};\nconst _hoisted_42 = [\"innerHTML\"];\nconst _hoisted_43 = {\n class: \"form-warning\"\n};\nconst _hoisted_44 = {\n class: \"quota-label\"\n};\nconst _hoisted_45 = {\n class: \"quota-status\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_CustomSelect = _resolveComponent(\"CustomSelect\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.title')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.titleTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_CustomSelect, {\n modelValue: $data.channelFilter,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.channelFilter = $event),\n options: $options.filterOptions,\n placeholder: _ctx.$t('sysUpload.filterPlaceholder'),\n width: \"160px\"\n }, null, 8, [\"modelValue\", \"options\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => $data.showAddDialog = true),\n class: \"add-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.addChannel')), 1)]),\n _: 1\n })])]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.filteredChannels, channelType => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channelType.value,\n class: \"channel-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_ChannelIcon, {\n type: channelType.value,\n class: _normalizeClass(['group-icon', $options.getChannelIconClass(channelType.value)])\n }, null, 8, [\"type\", \"class\"]), _createElementVNode(\"span\", null, _toDisplayString(channelType.label), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n class: \"channel-count\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelList(channelType.value).length), 1)]),\n _: 2\n }, 1024)]), $options.hasLoadBalance(channelType.value) ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(_ctx.$t('sysUpload.loadBalance')), 1), _createVNode(_component_el_switch, {\n modelValue: $options.getSettings(channelType.value).loadBalance.enabled,\n \"onUpdate:modelValue\": $event => $options.getSettings(channelType.value).loadBalance.enabled = $event,\n size: \"small\",\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])])) : _createCommentVNode(\"\", true)]), $options.getChannelList(channelType.value).length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.getChannelList(channelType.value), (channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel.name || index,\n class: _normalizeClass([\"channel-card\", [channelType.value, {\n 'disabled': !channel.enabled,\n 'fixed': channel.fixed\n }]]),\n onMousemove: $event => $options.handleCardMouseMove($event, channelType.value, index),\n onMouseleave: $event => $options.handleCardMouseLeave(channelType.value, index)\n }, [_createElementVNode(\"div\", {\n class: \"card-glow\",\n ref_for: true,\n ref: `glow-${channelType.value}-${index}`\n }, null, 512), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(channel.name || _ctx.$t('sysUpload.unnamedChannel')), 1), channel.fixed ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event,\n size: \"small\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [channelType.value === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_17, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), channel.chatId ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_19, \"Channel: \" + _toDisplayString($options.maskText(channel.chatId)), 1)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_20, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_21)])) : channelType.value === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"server\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_23, _toDisplayString(channel.bucketName || _ctx.$t('sysUpload.notSet')), 1)]), channel.endpoint ? (_openBlock(), _createElementBlock(\"div\", _hoisted_24, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.endpoint\n }, _toDisplayString(channel.endpoint), 9, _hoisted_25)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createElementVNode(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_27, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_29, \"Channel: \" + _toDisplayString($options.maskText(channel.channelId)), 1)]), channel.isNitro ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"success\"\n }, {\n default: _withCtx(() => [...(_cache[78] || (_cache[78] = [_createTextVNode(\"Nitro\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createElementVNode(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(channel.repo || _ctx.$t('sysUpload.notSet')), 1)]), channel.isPrivate ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.baseUrl\n }, _toDisplayString(channel.baseUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_33)]), channel.publicUrl ? (_openBlock(), _createElementBlock(\"div\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl), 9, _hoisted_35)])) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]), channel.quota?.enabled ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 6\n }, null, 8, [\"percentage\", \"status\"]), _createElementVNode(\"span\", _hoisted_37, _toDisplayString($options.getQuotaText(channel)), 1)])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_38, [_createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openDetailDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"eye\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.detail')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openEditDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"danger\",\n size: \"small\",\n onClick: $event => $options.deleteChannel(channelType.value, index),\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])], 42, _hoisted_10);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_39, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\",\n class: \"empty-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysUpload.noChannels', {\n type: channelType.label\n })), 1)]))]);\n }), 128)), _createVNode(_component_el_dialog, {\n modelValue: $data.showAddDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showAddDialog = $event),\n title: _ctx.$t('sysUpload.addDialogTitle'),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetAddForm\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showAddDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), $data.newChannel.type !== 'cfr2' ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.confirmAddChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.confirmAdd')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newChannel,\n \"label-position\": \"top\",\n ref: \"addForm\",\n rules: $options.addRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelTypeLabel'),\n prop: \"type\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.newChannel.type,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.newChannel.type = $event),\n placeholder: _ctx.$t('sysUpload.channelTypePlaceholder'),\n style: {\n \"width\": \"100%\"\n },\n onChange: $options.onChannelTypeChange\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.addableChannels, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.value,\n label: ch.label,\n value: ch.value\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_40, [_createVNode(_component_ChannelIcon, {\n type: ch.value,\n class: _normalizeClass(['select-option-icon', $options.getChannelIconClass(ch.value)])\n }, null, 8, [\"type\", \"class\"]), _createElementVNode(\"span\", null, _toDisplayString(ch.label), 1)])]),\n _: 2\n }, 1032, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.type === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_41, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createElementVNode(\"span\", {\n innerHTML: _ctx.$t('sysUpload.r2ConfigNote')\n }, null, 8, _hoisted_42)])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameImmutableTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.name,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.newChannel.name = $event),\n placeholder: _ctx.$t('sysUpload.channelNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), $data.newChannel.type === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.chatId,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.newChannel.chatId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.chatIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.newChannel.type === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.endpoint,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.newChannel.endpoint = $event),\n placeholder: _ctx.$t('sysUpload.endpointPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.newChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.bucketName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.newChannel.bucketName = $event),\n placeholder: _ctx.$t('sysUpload.bucketNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.region,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.newChannel.region = $event),\n placeholder: _ctx.$t('sysUpload.bucketRegionPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newChannel.accessKeyId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessKeyIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newChannel.secretAccessKey = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.secretAccessKeyPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.newChannel.pathStyle = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.newChannel.type === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.channelId,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newChannel.channelId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.channelIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isNitro,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_43, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.discordWarning')), 1)])], 64)) : $data.newChannel.type === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.repo,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newChannel.repo = $event),\n placeholder: _ctx.$t('sysUpload.repoNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.token,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newChannel.token = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.newChannel.type === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newChannel.baseUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavBaseUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.username,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.newChannel.username = $event),\n placeholder: _ctx.$t('sysUpload.webdavUsernamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.password,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.newChannel.password = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.webdavPasswordPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.newChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.headersText,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.newChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.newChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)], 64))]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showDetailDialog,\n \"onUpdate:modelValue\": _cache[37] || (_cache[37] = $event => $data.showDetailDialog = $event),\n title: _ctx.$t('sysUpload.detailDialogTitle', {\n name: $data.currentChannel?.name || ''\n }),\n class: \"channel-dialog\",\n onClosed: $options.resetDetailData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[36] || (_cache[36] = $event => $data.showDetailDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.closeBtn')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.openEditFromDetail\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_descriptions, {\n column: 1,\n border: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelNameDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelTypeDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelTypeLabel($data.currentChannelType)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.statusLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: $data.currentChannel?.enabled ? 'success' : 'info'\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.enabled ? _ctx.$t('sysUpload.enabled') : _ctx.$t('sysUpload.disabled')), 1)]),\n _: 1\n }, 8, [\"type\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannel?.fixed ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 0,\n label: _ctx.$t('sysUpload.configSource')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.chatIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.chatId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 2,\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"])) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.endpointLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.endpoint,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.cdnDomain || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.bucketName), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketRegion')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.region), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.pathStyle ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.channelId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isNitro ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.repoName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.repo), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isPrivate ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 6\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.baseUrl,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.username || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $options.formatHeaders($data.currentChannel?.headers),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.createDirectory !== false ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true), $data.currentChannel?.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 7\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.limitGB) + \" GB\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.threshold) + \"%\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, null, {\n label: _withCtx(() => [_createElementVNode(\"span\", _hoisted_44, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.currentUsage')) + \" \", 1), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\",\n class: _normalizeClass({\n 'fa-spin': $data.quotaLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_45, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage($data.currentChannel),\n status: $options.getQuotaStatus($data.currentChannel),\n \"stroke-width\": 16,\n \"text-inside\": true,\n format: () => $options.getQuotaText($data.currentChannel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded($data.currentChannel)\n }])\n }, _toDisplayString($options.getQuotaStatusText($data.currentChannel)), 3)])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditDialog,\n \"onUpdate:modelValue\": _cache[77] || (_cache[77] = $event => $data.showEditDialog = $event),\n title: _ctx.$t('sysUpload.editDialogTitle', {\n name: $data.editChannel?.name || ''\n }),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetEditData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[76] || (_cache[76] = $event => $data.showEditDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmEditChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.saveChanges')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editChannel,\n \"label-position\": \"top\",\n ref: \"editForm\",\n rules: $options.editRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameEditDisabledTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.name,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.editChannel.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.enableChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.enabled,\n \"onUpdate:modelValue\": _cache[39] || (_cache[39] = $event => $data.editChannel.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[40] || (_cache[40] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.chatId,\n \"onUpdate:modelValue\": _cache[41] || (_cache[41] = $event => $data.editChannel.chatId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[42] || (_cache[42] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[43] || (_cache[43] = $event => $data.editChannel.publicUrl = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[44] || (_cache[44] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[45] || (_cache[45] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[46] || (_cache[46] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[47] || (_cache[47] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.endpoint,\n \"onUpdate:modelValue\": _cache[48] || (_cache[48] = $event => $data.editChannel.endpoint = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[49] || (_cache[49] = $event => $data.editChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.bucketName,\n \"onUpdate:modelValue\": _cache[50] || (_cache[50] = $event => $data.editChannel.bucketName = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.region,\n \"onUpdate:modelValue\": _cache[51] || (_cache[51] = $event => $data.editChannel.region = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[52] || (_cache[52] = $event => $data.editChannel.accessKeyId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[53] || (_cache[53] = $event => $data.editChannel.secretAccessKey = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[54] || (_cache[54] = $event => $data.editChannel.pathStyle = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[55] || (_cache[55] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[56] || (_cache[56] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[57] || (_cache[57] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[58] || (_cache[58] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[59] || (_cache[59] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.channelId,\n \"onUpdate:modelValue\": _cache[60] || (_cache[60] = $event => $data.editChannel.channelId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[61] || (_cache[61] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isNitro,\n \"onUpdate:modelValue\": _cache[62] || (_cache[62] = $event => $data.editChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.repo,\n \"onUpdate:modelValue\": _cache[63] || (_cache[63] = $event => $data.editChannel.repo = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.token,\n \"onUpdate:modelValue\": _cache[64] || (_cache[64] = $event => $data.editChannel.token = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[65] || (_cache[65] = $event => $data.editChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[66] || (_cache[66] = $event => $data.editChannel.baseUrl = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.username,\n \"onUpdate:modelValue\": _cache[67] || (_cache[67] = $event => $data.editChannel.username = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.password,\n \"onUpdate:modelValue\": _cache[68] || (_cache[68] = $event => $data.editChannel.password = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[69] || (_cache[69] = $event => $data.editChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.headersText,\n \"onUpdate:modelValue\": _cache[70] || (_cache[70] = $event => $data.editChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[71] || (_cache[71] = $event => $data.editChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[72] || (_cache[72] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[73] || (_cache[73] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[74] || (_cache[74] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[75] || (_cache[75] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nimport CustomSelect from './CustomSelect.vue';\nexport default {\n components: {\n ChannelIcon,\n CustomSelect\n },\n data() {\n return {\n // 渠道类型筛选\n channelFilter: '',\n // 渠道类型列表\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 可添加的渠道类型\n addableChannels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 各渠道配置\n telegramSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n cfr2Settings: {\n channels: []\n },\n s3Settings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n discordSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n huggingfaceSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n webdavSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n // 弹窗控制\n showAddDialog: false,\n showDetailDialog: false,\n showEditDialog: false,\n // 当前操作的渠道\n currentChannelType: '',\n currentChannelIndex: -1,\n currentChannel: null,\n editChannel: {},\n // 新增渠道表单\n newChannel: {\n type: '',\n name: '',\n enabled: true,\n // Telegram\n botToken: '',\n chatId: '',\n proxyUrl: '',\n // S3\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n // Discord\n channelId: '',\n isNitro: false,\n // HuggingFace\n repo: '',\n token: '',\n isPrivate: false,\n // WebDAV\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 筛选下拉框选项\n filterOptions() {\n return [{\n value: '',\n label: this.$t('common.all')\n }, ...this.channels.map(ch => ({\n value: ch.value,\n label: ch.label,\n channelType: ch.value,\n iconClass: this.getChannelIconClass(ch.value)\n }))];\n },\n // 根据筛选条件过滤渠道类型\n filteredChannels() {\n if (!this.channelFilter) {\n return this.channels;\n }\n return this.channels.filter(ch => ch.value === this.channelFilter);\n },\n addRules() {\n return {\n type: [{\n required: true,\n message: this.$t('sysUpload.channelTypePlaceholder'),\n trigger: 'change'\n }],\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n },\n editRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n // 卡片光斑跟随鼠标\n handleCardMouseMove(event, channelType, index) {\n const card = event.currentTarget;\n const rect = card.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '1';\n glowEl[0].style.left = `${x}px`;\n glowEl[0].style.top = `${y}px`;\n }\n },\n handleCardMouseLeave(channelType, index) {\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '0';\n }\n },\n getChannelIconClass(type) {\n return `channel-brand-${type}`;\n },\n // 获取渠道类型标签\n getChannelTypeLabel(type) {\n const channel = this.channels.find(c => c.value === type);\n return channel ? channel.label : type;\n },\n // 获取渠道列表\n getChannelList(type) {\n return this.getSettings(type)?.channels || [];\n },\n // 获取渠道设置对象\n getSettings(type) {\n const map = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n return map[type];\n },\n // 是否有负载均衡选项\n hasLoadBalance(type) {\n return ['telegram', 's3', 'discord', 'huggingface', 'webdav'].includes(type);\n },\n // 文本脱敏\n maskText(text, showLength = 4) {\n if (!text) return this.$t('sysUpload.notSet');\n if (text.length <= showLength * 2) return '****';\n return text.slice(0, showLength) + '****' + text.slice(-showLength);\n },\n formatHeaders(headers) {\n if (!headers || typeof headers === 'object' && Object.keys(headers).length === 0) {\n return this.$t('sysUpload.notSet');\n }\n if (typeof headers === 'string') {\n return headers;\n }\n return JSON.stringify(headers, null, 2);\n },\n headersToText(headers) {\n if (!headers) return '';\n if (typeof headers === 'string') return headers;\n return JSON.stringify(headers, null, 2);\n },\n parseHeadersText(text) {\n if (!text || !text.trim()) return {};\n try {\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null;\n }\n return parsed;\n } catch (error) {\n return null;\n }\n },\n // 打开详情弹窗\n openDetailDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n this.currentChannel = this.getChannelList(type)[index];\n this.showDetailDialog = true;\n },\n // 打开编辑弹窗\n openEditDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n const channel = this.getChannelList(type)[index];\n this.editChannel = JSON.parse(JSON.stringify(channel));\n if (type === 'webdav') {\n this.editChannel.headersText = this.headersToText(this.editChannel.headers);\n this.editChannel.createDirectory = this.editChannel.createDirectory !== false;\n }\n // 确保 quota 对象存在\n if (!this.editChannel.quota) {\n this.editChannel.quota = {\n enabled: false,\n limitGB: 10,\n threshold: 95\n };\n }\n this.showEditDialog = true;\n },\n // 从详情页打开编辑\n openEditFromDetail() {\n this.showDetailDialog = false;\n this.openEditDialog(this.currentChannelType, this.currentChannelIndex);\n },\n // 重置添加表单\n resetAddForm() {\n this.newChannel = {\n type: '',\n name: '',\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 重置详情弹窗数据\n resetDetailData() {\n this.currentChannel = null;\n },\n // 重置编辑弹窗数据\n resetEditData() {\n this.editChannel = {};\n },\n // 渠道类型变更时重置表单\n onChannelTypeChange() {\n // 保留 type 和 name,重置其他字段\n const {\n type,\n name\n } = this.newChannel;\n this.newChannel = {\n type,\n name,\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 确认添加渠道\n confirmAddChannel() {\n this.$refs.addForm.validate(valid => {\n if (!valid) return;\n const {\n type,\n name\n } = this.newChannel;\n const settings = this.getSettings(type);\n\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env', 'WebDAV_env'];\n if (reservedNames.includes(name)) {\n this.$message.warning(this.$t('sysUpload.reservedName'));\n return;\n }\n\n // 检查名称是否重复\n const isDuplicate = settings.channels.some(ch => ch.name === name);\n if (isDuplicate) {\n this.$message.warning(this.$t('sysUpload.duplicateName'));\n return;\n }\n let newChannelData = {\n id: settings.channels.length + 1,\n name: this.newChannel.name,\n type: type,\n savePath: 'database',\n enabled: true,\n fixed: false\n };\n\n // 根据类型添加特定字段\n if (type === 'telegram') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n chatId: this.newChannel.chatId,\n proxyUrl: this.newChannel.proxyUrl\n });\n } else if (type === 's3') {\n Object.assign(newChannelData, {\n endpoint: this.newChannel.endpoint,\n cdnDomain: this.newChannel.cdnDomain,\n bucketName: this.newChannel.bucketName,\n region: this.newChannel.region,\n accessKeyId: this.newChannel.accessKeyId,\n secretAccessKey: this.newChannel.secretAccessKey,\n pathStyle: this.newChannel.pathStyle,\n quota: {\n ...this.newChannel.quota\n }\n });\n } else if (type === 'discord') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n channelId: this.newChannel.channelId,\n proxyUrl: this.newChannel.proxyUrl,\n isNitro: this.newChannel.isNitro\n });\n } else if (type === 'huggingface') {\n Object.assign(newChannelData, {\n repo: this.newChannel.repo,\n token: this.newChannel.token,\n isPrivate: this.newChannel.isPrivate\n });\n } else if (type === 'webdav') {\n const headers = this.parseHeadersText(this.newChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n Object.assign(newChannelData, {\n baseUrl: this.newChannel.baseUrl,\n username: this.newChannel.username,\n password: this.newChannel.password,\n publicUrl: this.newChannel.publicUrl,\n headers,\n createDirectory: this.newChannel.createDirectory !== false,\n quota: {\n ...this.newChannel.quota\n }\n });\n }\n settings.channels.push(newChannelData);\n this.showAddDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 确认编辑渠道\n confirmEditChannel() {\n this.$refs.editForm.validate(valid => {\n if (!valid) return;\n const settings = this.getSettings(this.currentChannelType);\n const currentIndex = this.currentChannelIndex;\n const originalName = settings.channels[currentIndex]?.name || this.editChannel.name;\n const editedChannel = {\n ...this.editChannel,\n name: originalName\n };\n if (this.currentChannelType === 'webdav') {\n const headers = this.parseHeadersText(editedChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n editedChannel.headers = headers;\n editedChannel.createDirectory = editedChannel.createDirectory !== false;\n delete editedChannel.headersText;\n }\n settings.channels[this.currentChannelIndex] = editedChannel;\n this.showEditDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 删除渠道\n deleteChannel(type, index) {\n const channel = this.getChannelList(type)[index];\n if (channel.fixed) {\n this.$message.warning(this.$t('sysUpload.fixedChannelCannotDelete'));\n return;\n }\n this.$confirm(this.$t('sysUpload.deleteChannelConfirm'), this.$t('common.warning'), {\n confirmButtonText: this.$t('common.confirm'),\n cancelButtonText: this.$t('common.cancel'),\n type: 'warning'\n }).then(() => {\n const settings = this.getSettings(type);\n settings.channels.splice(index, 1);\n // 重新调整 id\n settings.channels.forEach((item, i) => {\n item.id = i + 1;\n });\n // 自动保存\n this.saveSettings();\n }).catch(() => {});\n },\n saveSettings() {\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n fetchWithAuth('/api/manage/sysConfig/upload', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success(this.$t('sysOthers.settingsSaved'));\n });\n },\n // 获取容量统计(重新计算)\n async refreshQuota() {\n this.quotaLoading = true;\n try {\n // 使用 POST 请求重新统计容量(会触发索引重建)\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n } else {\n // 如果重新统计失败,尝试获取已有数据\n const getResponse = await fetchWithAuth('/api/manage/quota');\n const getData = await getResponse.json();\n if (getData.success) {\n this.quotaStats = getData.quotaStats || {};\n }\n }\n } catch (error) {\n console.error('Failed to refresh quota stats:', error);\n } finally {\n this.quotaLoading = false;\n }\n },\n // 获取容量统计(仅读取,不重建索引)\n async loadQuotaStats() {\n try {\n const response = await fetchWithAuth('/api/manage/quota');\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.quotaStats || {};\n }\n } catch (error) {\n console.error('Failed to load quota stats:', error);\n }\n },\n // 获取渠道已用容量 (GB)\n getChannelUsedGB(channel) {\n const stats = this.quotaStats[channel.name];\n if (!stats) return 0;\n return (stats.usedMB || 0) / 1024;\n },\n // 获取容量百分比\n getQuotaPercentage(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n const percentage = usedGB / limitGB * 100;\n return Math.min(100, Math.round(percentage * 10) / 10);\n },\n // 获取进度条状态\n getQuotaStatus(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) return 'exception';\n if (percentage >= 80) return 'warning';\n return 'success';\n },\n // 获取容量文本\n getQuotaText(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n return `${usedGB.toFixed(2)} / ${limitGB} GB`;\n },\n // 判断是否超过阈值\n isQuotaExceeded(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n return percentage >= threshold;\n },\n // 获取状态文本\n getQuotaStatusText(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) {\n return `⚠️ 已达到容量阈值 (${threshold}%),渠道写入已暂停`;\n }\n if (percentage >= 80) {\n return `⚡ 容量使用较高,接近阈值`;\n }\n return `✓ 容量正常`;\n },\n // 容量限制开关变化时\n async onQuotaEnabledChange(enabled, channel) {\n if (enabled && channel.name) {\n // 首次启用时,检查是否有该渠道的统计数据\n const stats = this.quotaStats[channel.name];\n if (!stats) {\n // 没有统计数据,提示用户需要重新统计\n this.$confirm(this.$t('sysUpload.quotaInitConfirm'), this.$t('sysUpload.quotaInitTitle'), {\n confirmButtonText: this.$t('sysUpload.quotaInitConfirmBtn'),\n cancelButtonText: this.$t('sysUpload.quotaInitCancelBtn'),\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info(this.$t('sysUpload.quotaInitLater'));\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info(this.$t('sysUpload.quotaCalculating'));\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n this.$message.success(this.$t('sysUpload.quotaCalculateSuccess'));\n } else {\n this.$message.error(this.$t('sysUpload.quotaCalculateError') + (data.error || ''));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error(this.$t('sysUpload.quotaCalculateFailed'));\n } finally {\n this.quotaLoading = false;\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/upload').then(response => response.json()).then(data => {\n this.telegramSettings = data.telegram;\n // 确保 R2 渠道有 quota 默认值\n if (data.cfr2 && data.cfr2.channels) {\n data.cfr2.channels = data.cfr2.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.cfr2Settings = data.cfr2;\n // 确保 S3 渠道有 quota 默认值\n if (data.s3 && data.s3.channels) {\n data.s3.channels = data.s3.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.s3Settings = data.s3;\n // 确保 Discord 渠道有默认值\n if (data.discord && data.discord.channels) {\n data.discord.channels = data.discord.channels.map(channel => ({\n ...channel,\n proxyUrl: channel.proxyUrl || ''\n }));\n }\n this.discordSettings = data.discord || {\n loadBalance: {},\n channels: []\n };\n // 确保 HuggingFace 渠道有默认值\n if (data.huggingface && data.huggingface.channels) {\n data.huggingface.channels = data.huggingface.channels.map(channel => ({\n ...channel,\n isPrivate: channel.isPrivate || false\n }));\n }\n this.huggingfaceSettings = data.huggingface || {\n loadBalance: {},\n channels: []\n };\n // 确保 WebDAV 渠道有默认值\n if (data.webdav && data.webdav.channels) {\n data.webdav.channels = data.webdav.channels.map(channel => ({\n ...channel,\n username: channel.username || '',\n password: channel.password || '',\n publicUrl: channel.publicUrl || '',\n headers: channel.headers || {},\n createDirectory: channel.createDirectory !== false,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.webdavSettings = data.webdav || {\n loadBalance: {},\n channels: []\n };\n // 加载容量统计(仅读取,不重建索引)\n this.loadQuotaStats();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogUpload.vue?vue&type=template&id=9a9d7c2a&scoped=true\"\nimport script from \"./SysCogUpload.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogUpload.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogUpload.vue?vue&type=style&index=0&id=9a9d7c2a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-9a9d7c2a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, vShow as _vShow, normalizeClass as _normalizeClass, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"save-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Transition, {\n name: \"fade-up\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: _normalizeClass([\"floating-save-btn\", {\n 'is-loading': $props.loading\n }]),\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleClick && $options.handleClick(...args))\n }, [$props.loading ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"spinner\",\n spin: \"\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"save\"\n })), _createElementVNode(\"span\", _hoisted_1, _toDisplayString($props.loading ? _ctx.$t('floatingSave.saving') : _ctx.$t('floatingSave.save')), 1)], 2), [[_vShow, $data.visible]])]),\n _: 1\n });\n}","export default {\n name: 'FloatingSaveButton',\n emits: ['click'],\n props: {\n loading: {\n type: Boolean,\n default: false\n },\n show: {\n type: Boolean,\n default: true\n }\n },\n data() {\n return {\n visible: false\n };\n },\n watch: {\n show: {\n immediate: true,\n handler(val) {\n if (val) {\n // 延迟显示,等待 Element Plus 加载遮罩淡出动画完成\n setTimeout(() => {\n this.visible = true;\n }, 600);\n } else {\n this.visible = false;\n }\n }\n }\n },\n methods: {\n handleClick() {\n if (!this.loading) {\n this.$emit('click');\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FloatingSaveButton.vue?vue&type=template&id=53091626&scoped=true\"\nimport script from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\nexport * from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\n\nimport \"./FloatingSaveButton.vue?vue&type=style&index=0&id=53091626&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-53091626\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"security-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"second-title\"\n};\nconst _hoisted_5 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_6 = {\n class: \"second-title\"\n};\nconst _hoisted_7 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_8 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_9 = {\n class: \"token-actions\"\n};\nconst _hoisted_10 = {\n class: \"token-table-container\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_12 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_13 = {\n class: \"token-display\"\n};\nconst _hoisted_14 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_15 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_16 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_17 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_18 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_19 = {\n class: \"first-settings\"\n};\nconst _hoisted_20 = {\n class: \"first-title\"\n};\nconst _hoisted_21 = {\n class: \"second-title\"\n};\nconst _hoisted_22 = {\n class: \"second-title\"\n};\nconst _hoisted_23 = {\n class: \"query-param-list\"\n};\nconst _hoisted_24 = {\n class: \"query-param-list\"\n};\nconst _hoisted_25 = {\n class: \"first-settings\"\n};\nconst _hoisted_26 = {\n class: \"first-title\"\n};\nconst _hoisted_27 = {\n class: \"second-title\"\n};\nconst _hoisted_28 = {\n class: \"second-title\"\n};\nconst _hoisted_29 = {\n class: \"second-title\"\n};\nconst _hoisted_30 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_31 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_32 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_33 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_34 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_35 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_36 = {\n class: \"token-result\"\n};\nconst _hoisted_37 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_38 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, _toDisplayString(_ctx.$t('sysSecurity.authManagement')), 1), _createElementVNode(\"h4\", _hoisted_4, _toDisplayString(_ctx.$t('sysSecurity.userAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $options.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.uploadPassword'),\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.authCode,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.authSettings.user.authCode = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleUserPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.user._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearUserPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.user._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.clearUserPassword = $event),\n onChange: $options.handleClearUserPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewUserPassword\",\n key: \"user-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.confirmNewUserPassword,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_6, _toDisplayString(_ctx.$t('sysSecurity.adminAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $options.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminUsername'),\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\",\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminPassword'),\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.admin._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.admin._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearAdminPassword,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.clearAdminPassword = $event),\n onChange: $options.handleClearAdminPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewAdminPassword\",\n key: \"admin-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.confirmNewAdminPassword,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.apiTokenManagement')) + \" \", 1), _createElementVNode(\"a\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[7] || (_cache[7] = $event => $data.showCreateTokenDialog = true),\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n })])]), _createElementVNode(\"div\", _hoisted_10, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $data.apiTokens,\n class: \"token-table\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"name\",\n label: _ctx.$t('sysSecurity.tokenName'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: _ctx.$t('sysSecurity.tokenValue'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: _ctx.$t('sysSecurity.permissions'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_14, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(scope.row.permissions, perm => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: perm,\n size: \"small\",\n class: \"permission-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getPermissionText(perm)), 1)]),\n _: 2\n }, 1024);\n }), 128))])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: _ctx.$t('sysSecurity.createdAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_15, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.status'),\n \"header-align\": \"center\",\n width: \"90\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_tag, {\n type: $options.getTokenStatus(scope.row.expiresAt).status === 'active' ? 'success' : 'danger',\n size: \"small\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getTokenStatus(scope.row.expiresAt).label), 1)]),\n _: 2\n }, 1032, [\"type\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.expiresAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_17, _toDisplayString($options.getTokenStatus(scope.row.expiresAt).expiresText), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.operation'),\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteToken(scope.row.id)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"h3\", _hoisted_20, _toDisplayString(_ctx.$t('sysSecurity.uploadManagement')), 1), _createElementVNode(\"h4\", _hoisted_21, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.imageReview')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.imageReviewTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableReview')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.reviewChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: _ctx.$t('sysSecurity.reviewChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"moderatecontent.com\",\n value: \"moderatecontent.com\"\n }), _createVNode(_component_el_option, {\n label: \"nsfwjs\",\n value: \"nsfwjs\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.apiKey')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.ipQuery')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.ipQueryTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.ipQuery,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableIpQuery')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.ipQuery.enabled,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.uploadSettings.ipQuery.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.ipQueryChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.ipQuery.channel,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.uploadSettings.ipQuery.channel = $event),\n placeholder: _ctx.$t('sysSecurity.ipQueryChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: _ctx.$t('sysSecurity.customApi'),\n value: \"customApi\"\n }, null, 8, [\"label\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.ipQuery.channel === 'customApi' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.url,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.uploadSettings.ipQuery.customApi.url = $event),\n placeholder: \"https://api.example.com/ip\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.queryParams')\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_23, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.params, (param, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"query-param-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: param.key,\n \"onUpdate:modelValue\": $event => param.key = $event,\n placeholder: _ctx.$t('sysSecurity.paramNamePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_input, {\n modelValue: param.value,\n \"onUpdate:modelValue\": $event => param.value = $event,\n placeholder: _ctx.$t('sysSecurity.paramValuePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryParam(index),\n disabled: $data.uploadSettings.ipQuery.customApi.params.length <= 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryParam\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addQueryParam')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.responseFields')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.responseFieldsTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.responseFields, (field, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"response-field-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.responseFields[index],\n \"onUpdate:modelValue\": $event => $data.uploadSettings.ipQuery.customApi.responseFields[index] = $event,\n placeholder: _ctx.$t('sysSecurity.responseFieldPathPlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, -1),\n disabled: index === 0\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, 1),\n disabled: index === $data.uploadSettings.ipQuery.customApi.responseFields.length - 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryResponseField(index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryResponseField\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addResponseField')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"h3\", _hoisted_26, _toDisplayString(_ctx.$t('sysSecurity.accessManagement')), 1), _createElementVNode(\"h4\", _hoisted_27, _toDisplayString(_ctx.$t('sysSecurity.domainFilter')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.allowedDomains')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.allowedDomainsTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_28, _toDisplayString(_ctx.$t('sysSecurity.whiteListMode')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n rules: $options.accessRules,\n ref: \"accessForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.enableWhiteList')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.enableWhiteListTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_29, _toDisplayString(_ctx.$t('sysSecurity.sessionSecurityPolicy')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.secureMode')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.secureModeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.sessionSecure,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.accessSettings.sessionSecure = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.userSessionMaxAge'),\n prop: \"userSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.userSessionMaxAge,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.accessSettings.userSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_30, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminSessionMaxAge'),\n prop: \"adminSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.adminSessionMaxAge,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.accessSettings.adminSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.showCreateTokenDialog = $event),\n title: _ctx.$t('sysSecurity.createTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_33, [_createVNode(_component_el_button, {\n onClick: _cache[26] || (_cache[26] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.createBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $options.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newToken.name = $event),\n placeholder: _ctx.$t('sysSecurity.tokenNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.neverExpire,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newToken.neverExpire = $event),\n onChange: $options.onCreateNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n modelValue: $data.newToken.expirationValue,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.newToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.autoDelete,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showEditTokenDialog = $event),\n title: _ctx.$t('sysSecurity.editTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_35, [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.updateBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $options.editTokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.neverExpire,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.editingToken.neverExpire = $event),\n onChange: $options.onEditNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_34, [_createVNode(_component_el_input_number, {\n modelValue: $data.editingToken.expirationValue,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.editingToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.editingToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.editingToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.autoDelete,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.editingToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.showTokenResultDialog = $event),\n title: _ctx.$t('sysSecurity.tokenCreatedTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_38, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[37] || (_cache[37] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.savedBtn')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"p\", _hoisted_37, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysSecurity.tokenCreatedWarning')), 1)]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.fullToken')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[36] || (_cache[36] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.copyBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","/**\r\n * Token 过期时间工具模块\r\n * 提供 Token 有效期计算、状态判定和向后兼容默认值填充功能\r\n */\r\n\r\n/**\r\n * 时间单位到毫秒的映射(月和年需要特殊处理)\r\n */\r\nconst SIMPLE_UNIT_MS = {\r\n s: 1000,\r\n m: 60 * 1000,\r\n h: 60 * 60 * 1000,\r\n d: 24 * 60 * 60 * 1000,\r\n};\r\n\r\n/**\r\n * 根据基准时间、数值和时间单位计算过期时间\r\n * @param {Date|string} baseTime - 基准时间(Date 对象或 ISO 8601 字符串)\r\n * @param {number} value - 正整数有效期数值\r\n * @param {string} unit - 时间单位:'s','m','h','d','M','Y'\r\n * @returns {string} 过期时间 ISO 8601 字符串\r\n * @throws {Error} 当 value <= 0 或 unit 无效时抛出错误\r\n */\r\nexport function computeExpiresAt(baseTime, value, unit) {\r\n if (!Number.isFinite(value) || value <= 0) {\r\n throw new Error('有效期数值必须大于 0');\r\n }\r\n\r\n const base = typeof baseTime === 'string' ? new Date(baseTime) : new Date(baseTime.getTime());\r\n\r\n if (SIMPLE_UNIT_MS[unit]) {\r\n return new Date(base.getTime() + value * SIMPLE_UNIT_MS[unit]).toISOString();\r\n }\r\n\r\n if (unit === 'M') {\r\n base.setUTCMonth(base.getUTCMonth() + value);\r\n return base.toISOString();\r\n }\r\n\r\n if (unit === 'Y') {\r\n base.setUTCFullYear(base.getUTCFullYear() + value);\r\n return base.toISOString();\r\n }\r\n\r\n throw new Error(`无效的时间单位: ${unit}`);\r\n}\r\n\r\n\r\n/**\r\n * 格式化过期时间为可读字符串\r\n * @param {string} isoString - ISO 8601 时间字符串\r\n * @returns {string} 格式化后的时间字符串\r\n */\r\nfunction formatExpiresTime(isoString) {\r\n const date = new Date(isoString);\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours = String(date.getHours()).padStart(2, '0');\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n}\r\n\r\n/**\r\n * 获取 Token 的状态信息\r\n * @param {string|null} expiresAt - 过期时间 ISO 8601 字符串,null 表示永不过期\r\n * @param {Date} [now=new Date()] - 当前时间\r\n * @returns {{ status: 'active'|'expired', label: '有效'|'已过期', expiresText: string }}\r\n */\r\nexport function getTokenStatus(expiresAt, now = new Date()) {\r\n if (expiresAt === null || expiresAt === undefined) {\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: '永不过期',\r\n };\r\n }\r\n\r\n const expiresDate = new Date(expiresAt);\r\n const currentTime = now instanceof Date ? now : new Date(now);\r\n const formattedTime = formatExpiresTime(expiresAt);\r\n\r\n if (currentTime.getTime() > expiresDate.getTime()) {\r\n return {\r\n status: 'expired',\r\n label: '已过期',\r\n expiresText: formattedTime,\r\n };\r\n }\r\n\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: formattedTime,\r\n };\r\n}\r\n\r\n\r\n/**\r\n * 为缺少过期相关字段的旧 Token 数据填充默认值\r\n * @param {Object} tokenData - Token 数据对象\r\n * @returns {Object} 填充默认值后的新 Token 数据对象\r\n */\r\nexport function applyTokenDefaults(tokenData) {\r\n return {\r\n ...tokenData,\r\n expiresAt: tokenData.expiresAt ?? null,\r\n autoDelete: tokenData.autoDelete ?? false,\r\n };\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nimport { computeExpiresAt, getTokenStatus } from '@/utils/tokenExpiration';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n authSettings: {\n user: {},\n admin: {}\n },\n uploadSettings: {\n moderate: {},\n ipQuery: {\n enabled: false,\n channel: 'customApi',\n customApi: {\n url: '',\n params: [{\n key: 'ip',\n value: '{ip}'\n }],\n responseFields: []\n }\n }\n },\n accessSettings: {},\n apiTokens: [],\n // API Token列表\n // 加载状态\n loading: true,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n clearUserPassword: false,\n // 清除用户密码开关\n clearAdminPassword: false,\n // 清除管理密码开关\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n timeUnitOptions: [{\n labelKey: 'sysSecurity.timeUnitSeconds',\n value: 's'\n }, {\n labelKey: 'sysSecurity.timeUnitMinutes',\n value: 'm'\n }, {\n labelKey: 'sysSecurity.timeUnitHours',\n value: 'h'\n }, {\n labelKey: 'sysSecurity.timeUnitDays',\n value: 'd'\n }, {\n labelKey: 'sysSecurity.timeUnitMonths',\n value: 'M'\n }, {\n labelKey: 'sysSecurity.timeUnitYears',\n value: 'Y'\n }],\n newToken: {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n createdToken: {\n name: '',\n token: ''\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n userPassRules() {\n return {\n authCode: [{\n validator: (rule, value, callback) => {\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error(this.$t('sysSecurity.passwordUrlReserved')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmUploadPassword')));\n } else if (value !== this.authSettings.user.authCode) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n adminPassRules() {\n return {\n confirmNewAdminPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmAdminPassword')));\n } else if (value !== this.authSettings.admin.adminPassword) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n accessRules() {\n const validateSessionMaxAge = (rule, value, callback) => {\n if (!Number.isInteger(value) || value < 1 || value > 3650) {\n callback(new Error(this.$t('sysSecurity.sessionMaxAgeInvalid')));\n } else {\n callback();\n }\n };\n return {\n userSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }],\n adminSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }]\n };\n },\n tokenRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysSecurity.tokenNameRequired'),\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.newToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n editTokenRules() {\n return {\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.editingToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n normalizeIpQuerySettings(settings = {}) {\n const ipQuery = settings.ipQuery || {};\n const customApi = ipQuery.customApi || {};\n const params = Array.isArray(customApi.params) && customApi.params.length > 0 ? customApi.params.map(param => ({\n key: param?.key || '',\n value: param?.value || ''\n })) : [{\n key: 'ip',\n value: '{ip}'\n }];\n const responseFields = Array.isArray(customApi.responseFields) ? customApi.responseFields.map(field => {\n if (typeof field === 'string') return field;\n return field?.path || '';\n }) : [];\n return {\n ...settings,\n moderate: settings.moderate || {},\n ipQuery: {\n enabled: ipQuery.enabled ?? false,\n channel: ipQuery.channel || 'customApi',\n customApi: {\n url: customApi.url || '',\n params,\n responseFields\n }\n }\n };\n },\n addIpQueryParam() {\n this.uploadSettings.ipQuery.customApi.params.push({\n key: '',\n value: ''\n });\n },\n removeIpQueryParam(index) {\n if (this.uploadSettings.ipQuery.customApi.params.length <= 1) return;\n this.uploadSettings.ipQuery.customApi.params.splice(index, 1);\n },\n addIpQueryResponseField() {\n this.uploadSettings.ipQuery.customApi.responseFields.push('');\n },\n removeIpQueryResponseField(index) {\n this.uploadSettings.ipQuery.customApi.responseFields.splice(index, 1);\n },\n moveIpQueryResponseField(index, direction) {\n const fields = this.uploadSettings.ipQuery.customApi.responseFields;\n const targetIndex = index + direction;\n if (targetIndex < 0 || targetIndex >= fields.length) return;\n const [field] = fields.splice(index, 1);\n fields.splice(targetIndex, 0, field);\n },\n handleUserPassInput() {\n if (this.authSettings.user.authCode !== this.oriUserPassword) {\n this.showUserPassConfirm = true;\n } else {\n this.showUserPassConfirm = false;\n }\n },\n handleAdminPassInput() {\n if (this.authSettings.admin.adminPassword !== this.oriAdminPassword) {\n this.showAdminPassConfirm = true;\n } else {\n this.showAdminPassConfirm = false;\n }\n },\n handleClearUserPassword(checked) {\n if (checked) {\n this.authSettings.user.authCode = '';\n this.showUserPassConfirm = false;\n }\n },\n handleClearAdminPassword(checked) {\n if (checked) {\n this.authSettings.admin.adminPassword = '';\n this.authSettings.admin.adminUsername = '';\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': this.$t('sysSecurity.permUpload'),\n 'delete': this.$t('sysSecurity.permDelete'),\n 'list': this.$t('sysSecurity.permList'),\n 'manage': this.$t('sysSecurity.permManage')\n };\n return permissionMap[permission] || permission;\n },\n formatDate(dateString) {\n return new Date(dateString).toLocaleString('zh-CN');\n },\n async loadApiTokens() {\n this.tokenLoading = true;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens');\n const data = await response.json();\n this.apiTokens = data.tokens || [];\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenListFailed'));\n } finally {\n this.tokenLoading = false;\n }\n },\n createToken() {\n this.$refs.tokenForm.validate(async valid => {\n if (!valid) return;\n try {\n this.newToken.owner = 'admin'; // 默认所有Token归属管理员\n\n let expiresAt = null;\n let autoDelete = false;\n if (!this.newToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.newToken.expirationValue, this.newToken.expirationUnit);\n autoDelete = this.newToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n name: this.newToken.name,\n owner: this.newToken.owner,\n permissions: this.newToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.createdToken = {\n name: data.name,\n token: data.token\n };\n this.showCreateTokenDialog = false;\n this.showTokenResultDialog = true;\n this.newToken = {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n };\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenCreateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenCreateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenCreateFailed'));\n }\n });\n },\n editToken(token) {\n const hasExpiration = token.expiresAt !== null && token.expiresAt !== undefined;\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions],\n neverExpire: !hasExpiration,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: token.autoDelete || false\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n let expiresAt = null;\n let autoDelete = false;\n if (!this.editingToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.editingToken.expirationValue, this.editingToken.expirationUnit);\n autoDelete = this.editingToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n tokenId: this.editingToken.id,\n permissions: this.editingToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenUpdateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenUpdateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenUpdateFailed'));\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm(this.$t('sysSecurity.tokenDeleteConfirm'), this.$t('sysSecurity.tokenDeleteConfirmTitle'), {\n confirmButtonText: this.$t('sysSecurity.tokenDeleteConfirmOk'),\n cancelButtonText: this.$t('sysSecurity.tokenDeleteConfirmCancel'),\n type: 'warning'\n });\n const response = await fetchWithAuth(`/api/manage/apiTokens?id=${tokenId}`, {\n method: 'DELETE'\n });\n const data = await response.json();\n if (response.ok) {\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenDeleteSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenDeleteFailed'));\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error(this.$t('sysSecurity.tokenDeleteFailed'));\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success(this.$t('sysSecurity.tokenCopied'));\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.copyFailed'));\n }\n },\n onCreateNeverExpireChange(val) {\n if (val) {\n this.newToken.autoDelete = false;\n }\n },\n onEditNeverExpireChange(val) {\n if (val) {\n this.editingToken.autoDelete = false;\n }\n },\n getTokenStatus(expiresAt) {\n return getTokenStatus(expiresAt);\n },\n saveSettings() {\n // 所有表单的Promise数组\n let validationPromises = [];\n\n // 验证用户密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.userPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证管理密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.adminPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证会话安全策略表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.accessForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n\n // 验证会话有效期为 1-3650 的正整数\n if (this.accessSettings.userSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.userSessionMaxAge) || this.accessSettings.userSessionMaxAge > 3650 || this.accessSettings.adminSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.adminSessionMaxAge) || this.accessSettings.adminSessionMaxAge > 3650) {\n this.$message.error(this.$t('sysSecurity.sessionMaxAgeInvalid'));\n return;\n }\n const settings = {\n auth: this.authSettings,\n upload: this.uploadSettings,\n access: this.accessSettings\n };\n // 不保存确认密码相关字段\n delete settings.auth.user.confirmNewUserPassword;\n delete settings.auth.admin.confirmNewAdminPassword;\n\n // 标记清除密码\n if (this.clearUserPassword) {\n settings.auth.user._clear = true;\n settings.auth.user.authCode = '';\n }\n if (this.clearAdminPassword) {\n settings.auth.admin._clear = true;\n settings.auth.admin.adminPassword = '';\n }\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(res => res.json()).then(data => {\n // 管理端密码变更后,当前会话已被清除,需要重新登录\n if (data.adminPasswordChanged) {\n const msg = this.$t('sysSecurity.adminPasswordChangedRelogin');\n this.$message.warning(msg);\n setTimeout(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n }, 1500);\n return;\n }\n this.$message.success(this.$t('sysSecurity.settingsSaved'));\n // 保存成功后重置密码字段为空(后端已处理)\n this.authSettings.user.authCode = '';\n this.authSettings.admin.adminPassword = '';\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n // 标记已有密码(如果用户刚设置了密码,且不是清除操作)\n if (settings.auth.user.authCode && !settings.auth.user._clear) {\n this.authSettings.user._hasPassword = true;\n } else if (settings.auth.user._clear) {\n this.authSettings.user._hasPassword = false;\n }\n if (settings.auth.admin.adminPassword && !settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = true;\n } else if (settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = false;\n }\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n this.clearUserPassword = false;\n this.clearAdminPassword = false;\n }).catch(() => {\n // 如果请求过程中 session 已失效导致 fetchWithAuth 跳转,忽略后续错误\n });\n });\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/security').then(response => response.json()).then(data => {\n this.authSettings = data.auth;\n this.uploadSettings = this.normalizeIpQuerySettings(data.upload);\n this.accessSettings = data.access;\n\n // 密码从后端返回为空(安全考虑),记录原始空值\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n this.authSettings.user.confirmNewUserPassword = '';\n this.authSettings.admin.confirmNewAdminPassword = '';\n\n // 加载API Token列表\n this.loadApiTokens();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogSecurity.vue?vue&type=template&id=906380e0&scoped=true\"\nimport script from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogSecurity.vue?vue&type=style&index=0&id=906380e0&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-906380e0\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"page-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-title\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedSettings, (categoryGroup, categoryName) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: categoryName,\n class: \"first-settings\"\n }, [_createElementVNode(\"h3\", _hoisted_2, _toDisplayString(categoryName), 1), _createVNode(_component_el_form, {\n model: $data.settings,\n \"label-width\": \"150px\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categoryGroup, (setting, index) => {\n return _openBlock(), _createBlock(_component_el_form_item, {\n key: setting.id\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString($options.localized(setting, 'label')) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: $options.localized(setting, 'tooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [setting.type === 'select' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 0,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder'),\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(setting.options, option => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: option.value,\n label: $options.localizedOption(option),\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'channelName' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: !$options.currentUploadChannel || $options.currentChannelList.length === 0,\n placeholder: _ctx.$t('sysPage.channelSelectPlaceholder'),\n clearable: \"\",\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : setting.type === 'textarea' ? (_openBlock(), _createBlock(_component_el_input, {\n key: 3,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n resize: \"vertical\",\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 4,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"]))]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport axios from '@/utils/axios';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: true,\n // 可用渠道列表\n availableChannels: {}\n };\n },\n computed: {\n isEn() {\n return this.$i18n.locale === 'en';\n },\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = this.isEn ? setting.category_en || setting.category || this.$t('sysPage.otherSettings') : setting.category || this.$t('sysPage.otherSettings');\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n },\n // 当前选择的上传渠道\n currentUploadChannel() {\n const channelSetting = this.settings.config?.find(s => s.id === 'defaultUploadChannel');\n return channelSetting?.value || '';\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.currentUploadChannel] || [];\n }\n },\n watch: {\n // 监听上传渠道变化,清空渠道名称(如果不在新列表中)\n currentUploadChannel(newVal, oldVal) {\n if (newVal !== oldVal) {\n const channelNameSetting = this.settings.config?.find(s => s.id === 'defaultChannelName');\n if (channelNameSetting) {\n const newChannelList = this.availableChannels[newVal] || [];\n if (!newChannelList.some(ch => ch.name === channelNameSetting.value)) {\n channelNameSetting.value = '';\n }\n }\n }\n }\n },\n methods: {\n localized(item, field) {\n if (this.isEn && item[field + '_en']) return item[field + '_en'];\n return item[field] || '';\n },\n localizedOption(option) {\n if (this.isEn && option.label_en) return option.label_en;\n return option.label;\n },\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/page', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success(this.$t('sysPage.settingsSaved')));\n },\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels');\n if (response.data) {\n this.availableChannels = response.data;\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/page').then(response => response.json()).then(data => {\n this.settings = data;\n // 处理布尔类型的值初始化\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n if (setting.type === 'boolean') {\n // 将字符串转换为布尔值\n if (typeof setting.value === 'string') {\n setting.value = setting.value === 'true';\n } else if (setting.value === undefined || setting.value === null) {\n // 如果没有值,使用默认值\n setting.value = setting.default || false;\n }\n }\n });\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogPage.vue?vue&type=template&id=e4c3a742&scoped=true\"\nimport script from \"./SysCogPage.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogPage.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogPage.vue?vue&type=style&index=0&id=e4c3a742&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e4c3a742\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"others-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"first-title\"\n};\nconst _hoisted_5 = {\n class: \"first-title\"\n};\nconst _hoisted_6 = {\n class: \"first-title\"\n};\nconst _hoisted_7 = [\"innerHTML\"];\nconst _hoisted_8 = {\n class: \"first-title\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.remoteTelemetry')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.remoteTelemetryTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.telemetry.enabled,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.settings.telemetry.enabled = $event),\n disabled: $data.settings.telemetry.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.cloudflareApiToken')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.cloudflareApiTokenTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.zoneId')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.accountEmail')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_API_KEY,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.cloudflareApiToken.CF_API_KEY = $event),\n disabled: $data.settings.cloudflareApiToken.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_5, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.randomImageApi')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.randomImageApiTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.directory')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.directoryTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.settings.randomImageAPI.allowedDir = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.publicBrowse')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.publicBrowseTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.publicBrowse,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.openDirectory')), 1), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n },\n innerHTML: _ctx.$t('sysOthers.openDirectoryTooltip')\n }, null, 8, _hoisted_7)]),\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.publicBrowse.allowedDir,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.settings.publicBrowse.allowedDir = $event),\n disabled: $data.settings.publicBrowse.fixed,\n placeholder: \"wallpaper,photos,album\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.webdav')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.webdavTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.webDAV.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.settings.webDAV.enabled = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.username,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.settings.webDAV.username = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.password,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.settings.webDAV.password = $event),\n disabled: $data.settings.webDAV.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUploadChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.uploadChannel,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.settings.webDAV.uploadChannel = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('sysOthers.webdavDefaultChannel'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"Telegram\",\n value: \"telegram\"\n }), _createVNode(_component_el_option, {\n label: \"Cloudflare R2\",\n value: \"cfr2\"\n }), _createVNode(_component_el_option, {\n label: \"S3\",\n value: \"s3\"\n }), _createVNode(_component_el_option, {\n label: \"Discord\",\n value: \"discord\"\n }), _createVNode(_component_el_option, {\n label: \"HuggingFace\",\n value: \"huggingface\"\n }), _createVNode(_component_el_option, {\n label: \"WebDAV\",\n value: \"webdav\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.settings.webDAV.uploadChannel && $options.webdavChannelList.length > 1 ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysOthers.webdavChannelName')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.channelName,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.settings.webDAV.channelName = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.webdavChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n availableChannels: {},\n // 可用渠道列表\n // 加载状态\n loading: true\n };\n },\n computed: {\n // WebDAV 当前渠道类型对应的渠道列表\n webdavChannelList() {\n const channelType = this.settings.webDAV?.uploadChannel;\n return channelType ? this.availableChannels[channelType] || [] : [];\n }\n },\n watch: {\n 'settings.webDAV.uploadChannel'() {\n // 切换渠道类型时清空指定的渠道名称\n if (this.settings.webDAV) {\n this.settings.webDAV.channelName = '';\n }\n }\n },\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/others', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success(this.$t('sysOthers.settingsSaved')));\n },\n async fetchAvailableChannels() {\n try {\n const response = await fetchWithAuth('/api/channels');\n if (response.ok) {\n this.availableChannels = await response.json();\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/others').then(response => response.json()).then(data => {\n this.settings = data;\n }).finally(() => {\n this.loading = false;\n });\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=67b1b002&scoped=true\"\nimport script from \"./SysCogOthers.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogOthers.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogOthers.vue?vue&type=style&index=0&id=67b1b002&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-67b1b002\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/config/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/config/SysCogStatus.vue';\nimport SysCogUpload from '@/components/config/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/config/SysCogSecurity.vue';\nimport SysCogPage from '@/components/config/SysCogPage.vue';\nimport SysCogOthers from '@/components/config/SysCogOthers.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'SystemConfig',\n mixins: [backgroundManager],\n data() {\n return {\n activeIndex: 'status',\n isSidebarCollapse: false\n };\n },\n watch: {\n // 监听锚点变化\n '$route.hash': {\n immediate: true,\n handler(newHash) {\n this.activeIndex = newHash.replace('#', '');\n window.scrollTo(0, 0); // 滚动到页面顶部\n }\n },\n activeIndex(newIndex) {\n // 更新锚点\n const hash = `#${newIndex}`;\n this.$router.push({\n hash\n });\n }\n },\n components: {\n DashboardTabs,\n SysConfigTabs,\n SysCogStatus,\n SysCogUpload,\n SysCogSecurity,\n SysCogPage,\n SysCogOthers\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n // 根据锚点动态返回对应的组件\n currentComponent() {\n const hash = this.$route.hash.replace('#', '');\n switch (hash) {\n case 'status':\n return SysCogStatus;\n case 'upload':\n return SysCogUpload;\n case 'security':\n return SysCogSecurity;\n case 'page':\n return SysCogPage;\n case 'others':\n return SysCogOthers;\n default:\n return SysCogStatus;\n }\n }\n },\n methods: {\n handleLogout() {\n const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n\n // 如果 URL 中没有锚点,则设置默认锚点\n if (!window.location.hash) {\n this.setDefaultHash();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SystemConfig.vue?vue&type=template&id=7607b77d&scoped=true\"\nimport script from \"./SystemConfig.vue?vue&type=script&lang=js\"\nexport * from \"./SystemConfig.vue?vue&type=script&lang=js\"\n\nimport \"./SystemConfig.vue?vue&type=style&index=0&id=7607b77d&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7607b77d\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, mergeProps as _mergeProps, createStaticVNode as _createStaticVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = {\n key: 1,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_3 = {\n key: 2,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", _mergeProps(_ctx.$attrs, {\n class: \"channel-icon-wrapper\"\n }), [$props.type === 'telegram' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, [...(_cache[0] || (_cache[0] = [_createElementVNode(\"path\", {\n d: \"M417.28 795.733333 429.226667 615.253333 756.906667 320C771.413333 306.773333 753.92 300.373333 734.72 311.893333L330.24 567.466667 155.306667 512C117.76 501.333333 117.333333 475.306667 163.84 456.533333L845.226667 193.706667C876.373333 179.626667 906.24 201.386667 894.293333 249.173333L778.24 795.733333C770.133333 834.56 746.666667 843.946667 714.24 826.026667L537.6 695.466667 452.693333 777.813333C442.88 787.626667 434.773333 795.733333 417.28 795.733333Z\"\n }, null, -1)]))])) : $props.type === 'huggingface' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_2, [...(_cache[1] || (_cache[1] = [_createStaticVNode(\"\", 9)]))])) : $props.type === 'webdav' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_3, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"path\", {\n d: \"M446.293333 810.666667C384 898.986667 262.4 921.173333 174.506667 859.733333c-87.466667-61.44-107.946667-183.893333-46.506667-273.066666a195.626667 195.626667 0 0 1 152.746667-84.48l2.133333 61.013333c-38.826667 2.986667-76.373333 23.04-100.693333 58.026667-42.666667 61.44-29.44 144.213333 29.013333 185.6 58.88 40.96 141.226667 25.173333 183.893333-35.84 13.226667-19.2 20.906667-40.106667 23.893334-61.44v-43.093334l238.08-1.706666 2.986666-4.693334c22.613333-39.253333 71.68-52.906667 110.08-30.72a81.066667 81.066667 0 0 1 29.013334 110.933334c-22.613333 38.826667-72.106667 52.48-110.506667 30.293333-17.493333-9.813333-29.866667-25.6-35.413333-43.52l-173.653334 0.853333a211.626667 211.626667 0 0 1-33.28 82.773334m310.613334-304.64c107.946667 13.226667 184.746667 110.08 171.52 216.32-13.226667 106.666667-111.36 182.186667-219.306667 168.96a197.504 197.504 0 0 1-146.346667-94.293334l52.906667-30.72a137.386667 137.386667 0 0 0 98.986667 61.866667c74.666667 8.96 140.8-41.813333 149.76-113.066667 8.96-71.253333-43.946667-136.533333-117.76-145.493333-23.04-2.56-45.226667 0.426667-65.28 7.68l-36.266667 18.773333-110.08-203.52h-9.386667a81.322667 81.322667 0 0 1-78.933333-83.2c1.28-44.373333 39.68-78.933333 84.48-77.226666 44.8 2.56 80.213333 38.826667 78.933333 83.2-0.853333 18.773333-8.106667 35.84-19.626666 49.066666l81.066666 149.76c26.453333-8.533333 55.466667-11.52 85.333334-8.106666M352 389.973333c-42.666667-100.266667 2.56-215.04 101.12-256.853333 98.986667-41.813333 213.333333 5.546667 256 105.813333 25.173333 58.453333 20.053333 122.453333-8.533333 173.653334l-52.906667-30.72c17.92-34.56 20.906667-76.8 3.84-116.48-29.013333-68.266667-106.24-101.12-172.373333-73.386667-66.56 28.16-96.426667 106.666667-67.413334 174.933333 11.946667 28.16 32 49.92 56.32 64.426667l16.64 8.96-130.986666 212.906667c1.28 2.133333 2.986667 4.693333 4.266666 8.106666 20.906667 38.826667 6.4 87.893333-32.853333 108.8-38.826667 20.906667-87.893333 5.546667-109.226667-34.56-20.906667-39.68-6.4-88.746667 32.853334-109.653333 16.64-8.96 34.986667-11.093333 52.48-7.253333l98.56-160.853334c-20.053333-18.346667-37.12-41.386667-47.786667-67.84z\"\n }, null, -1)]))])) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 3,\n icon: $options.fontAwesomeIcon\n }, null, 8, [\"icon\"]))], 16);\n}","export default {\n name: 'ChannelIcon',\n inheritAttrs: false,\n props: {\n type: {\n type: String,\n required: true\n }\n },\n computed: {\n fontAwesomeIcon() {\n const icons = {\n cfr2: ['fab', 'cloudflare'],\n s3: ['fab', 'aws'],\n discord: ['fab', 'discord']\n };\n return icons[this.type] || 'server';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ChannelIcon.vue?vue&type=template&id=33933ada&scoped=true\"\nimport script from \"./ChannelIcon.vue?vue&type=script&lang=js\"\nexport * from \"./ChannelIcon.vue?vue&type=script&lang=js\"\n\nimport \"./ChannelIcon.vue?vue&type=style&index=0&id=33933ada&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-33933ada\"]])\n\nexport default __exports__","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","isCollapse","ref","style","sidebarStyle","menuItems","item","key","index","activeIndex","onClick","$event","handleSelect","icon","$t","titleKey","args","toggleCollapse","name","props","type","String","default","Boolean","data","expandedWidth","computed","collapsedWidth","window","innerWidth","this","width","watch","$nextTick","measureWidth","methods","$emit","checkMobile","isMobile","el","$refs","sidebar","prevWidth","prevTransition","transition","wasCollapsed","classList","contains","remove","offsetWidth","natural","scrollWidth","add","mounted","addEventListener","beforeDestroy","removeEventListener","__exports__","_component_DashboardTabs","_component_el_tooltip","_component_el_header","_component_SysConfigTabs","activeTab","disabled","disableTooltip","content","placement","handleLogout","_","isSidebarCollapse","currentComponent","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","inputStart","inputmode","startDateLabel","onChange","handleManualInput","trim","rangeSeparator","inputEnd","endDateLabel","previousMonthLabel","goToPreviousMonth","monthTitle","nextMonthLabel","goToNextMonth","weekdayLabels","weekday","calendarDays","day","isCurrentMonth","isToday","draftStart","draftEnd","isInRange","selectDay","dayOfMonth","DAY_MS","padDatePart","value","padStart","formatDateKey","date","getFullYear","getMonth","getDate","parseDateKey","match","year","Number","month","Date","setHours","shiftMonth","amount","modelValue","Array","emits","today","displayYear","displayMonth","awaitingEnd","monthStart","start","getDay","todayKey","from","length","getTime","immediate","handler","syncFromModel","startDate","endDate","displayDate","range","commitRange","startKey","endKey","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_component_el_button","_component_el_radio_button","_component_el_radio_group","_component_DateRangeCalendar","_component_el_dialog","_component_Line","_component_Doughnut","_component_el_progress","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","circle","openTrendDateDialog","trendGroupBy","size","label","trendDatePickerVisible","title","trendDateDialogWidth","trendDateRange","handleTrendDateRangeChange","hasTrendData","uploadTrendChartData","options","lineChartOptions","Object","keys","channelStats","channelChartData","chartOptions","count","channel","background","getChartColor","getPercentage","typeStats","typeChartData","aggregatedTypeStats","status","getTypeChartColor","isProcessing","phaseDescription","Math","round","processingProgress","percentage","current","total","estimatedTimeRemaining","message","plain","cancelOperation","processingError","suggestion","recoverable","retryOperation","dismissError","loading","rebuilding","rebuildIndex","backing","backupData","accept","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","openFileInNewTab","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","v","lim","l","h","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","d","e","f","hex","h1","h2","eq","isShort","r","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","i","hueValue","rgb2hsl","calln","isArray","map","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","exec","p1","p2","rotate","deg","hslString","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","names","nameParse","transparent","toLowerCase","RGB_RE","rgbParse","rgbString","to","pow","interpolate","rgb1","rgb2","t","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","constructor","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","prototype","toString","call","slice","isObject","isNumberFinite","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","callback","fn","thisArg","apply","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","target","create","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","o","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","has","_isClickEvent","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","roundedRange","niceRange","floor","fraction","niceFraction","_factorize","result","sqrt","sort","pop","isNonPrimitive","Symbol","toPrimitive","isNumber","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","end","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","defineProperty","configurable","enumerable","forEach","method","base","res","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","check","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","findIndex","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","duration","easing","describe","_fallback","_indexable","_scriptable","properties","active","animation","resize","show","animations","visible","hide","applyLayoutsDefaults","autoPadding","padding","top","bottom","intlCache","Map","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","get","Intl","NumberFormat","formatNumber","num","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","applyScaleDefaults","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","border","dash","dashOffset","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","override","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","writable","local","appliers","toFontString","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","setRenderOpts","opts","translation","fillStyle","textAlign","textBaseline","decorateText","line","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","lines","strokeWidth","strokeColor","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","numberOrZero","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","change","keepZero","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","getValue","Error","join","delete","createSubResolver","arr","filter","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","prev","tension","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","shadowRoot","getCanvasPosition","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition","event","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","maintainHeight","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","segment","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","getSizeForArea","chartArea","field","getDatasetArea","getDatasetClipArea","_clip","Animator","_request","_charts","_running","_lastDate","_notify","anims","callbacks","numSteps","initial","currentStep","_refresh","_update","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","reduce","acc","_duration","cancel","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","update","elapsed","wait","promises","Promise","rej","resolved","Animations","config","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","itemStacks","_top","_bottom","visualValues","_visualValues","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","hidden","_stacked","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","getAllScaleValues","$bar","visibleMetas","concat","computeMinSampleSize","curr","_length","updateMinAndPrev","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v2","setInflateAmount","inflateAmount","_defineProperty","BarController","super","bars","getBasePixel","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","currentParsed","iScaleValue","skipNull","find","_getStackCount","_getAxisCount","_getAxis","getFirstScaleIdForIndexAxis","indexScaleId","firstScaleAxisId","_getStackIndex","_startPixel","_endPixel","baseValue","minBarLength","floating","getDataVisibility","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","axisCount","axisID","axisNumber","stackIndex","rects","_index_","_value_","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","useBorderRadius","borderRadius","fontColor","lineDash","lineDashOffset","lineJoin","legendItem","toggleDataVisibility","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PolarAreaController","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","init","formats","diff","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","getSortedVisibleDatasetMetas","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","isPointInArea","evaluationFunc","inRange","getNearestRadialItems","getProps","getNearestCartesianItems","distanceMetric","minDistance","getCenterPoint","pointInArea","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","native","nodeListContains","nodeList","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","tz","gz","bz","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","defaultRoutes","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","localIds","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","ensureScalesHaveIDs","scalesOptions","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","_getActiveElements","clipSelf","outerAngleClip","innerAngleClip","clipWidth","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","inner","selfJoin","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","refRect","BarElement","addRectPath","tpoints","_findSegmentEnd","_getBounds","targetSegments","tgt","subBounds","fillSources","fillSource","_getEdge","_pointsFromSegments","boundary","linePoints","_createBoundaryLine","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","parseFillOption","decodeTargetIndex","firstCh","_getTargetPixel","_getTargetValue","fillOption","_buildStackLine","sourcePoints","linesBelow","getLinesBelow","addPointsBelow","below","unshift","sourcePoint","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","computeBoundary","computeCircularBoundary","computeLinearBoundary","_drawfill","lineOpts","above","doFill","fillColor","clipVertical","clipHorizontal","clipY","lineLoop","clipX","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","_args","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","drawLegendBox","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","_element","afterEvent","ci","WeakMap","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","beforeTitle","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","addIfString","addedLabels","findOrAddLabel","lastIndexOf","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","hLimits","vLimits","updateLimits","setCenterPoint","_pointLabelItems","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","apexesInArea","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","animate","INTERVALS","millisecond","common","second","minute","hour","week","quarter","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","offsetAfterAutoskip","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","CommonProps","required","datasetIdKey","updateMode","A11yProps","ariaLabel","ariaDescribedby","Props","destroyDelay","compatProps","internals","attrs","toRawIfProxy","isProxy","toRaw","cloneProxy","setOptions","nextOptions","setLabels","currentData","nextLabels","setDatasets","nextDatasets","addedDatasets","nextDataset","currentDataset","cloneData","nextData","defineComponent","setup","param","expose","slots","canvasRef","chartRef","shallowRef","renderChart","clonedData","proxiedData","Chart$1","destroyChart","onMounted","onUnmounted","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","Line","BatchOperationError","code","ERROR_HANDLERS","details","NETWORK","ABORT","createError","Response","TypeError","BatchProcessor","batchSize","abortController","fetchAllRecords","includeValue","AbortController","allRecords","totalFetched","batchCount","signal","aborted","response","fetchBatch","records","nextCursor","phase","batchError","URLSearchParams","fetchWithAuth","errorDetails","errorData","json","success","totalProcessed","abort","isAborted","IndexRebuilder","chunkSize","maxRetries","retryDelay","sessionId","generateSessionId","fetchConfig","databaseType","rebuild","processor","sortByTimestampDescending","chunks","splitIntoChunks","uploadChunkWithRetry","finalize","timestampA","timestampB","chunkId","lastError","attempt","uploadChunk","sleep","checksum","calculateChecksum","headers","createHttpError","totalChunks","random","encoder","TextEncoder","dataBuffer","encode","crypto","subtle","hashBuffer","digest","hashArray","Uint8Array","imul","ms","BackupGenerator","generateBackup","packageInfo","fileCount","files","settings","record","fetchSettings","downloadBackup","settingsCount","blob","Blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","RestoreProcessor","fileEntries","settingEntries","totalSettings","totalItems","restoredFiles","restoredSettings","failedFiles","failedSettings","fileChunks","chunkData","fromEntries","restoredCount","failedCount","settingChunks","backupTimestamp","formatDateInput","getDefaultTrendDateRange","components","DateRangeCalendar","newest","oldest","channelColors","typeColors","trendColors","processingPhase","processingStartTime","currentRebuilder","currentBackupGenerator","currentRestoreProcessor","stats","aggregatedStats","mappedStatus","currentTrendGroup","trend","uploadTrend","groupBy","series","trendRawLabels","trendRangeCrossesYear","years","extractTrendLabelDates","trendDisplayLabels","formatTrendAxisLabel","totalColor","hexToRgba","pointBackgroundColor","pointBorderColor","pointRadius","pointHoverRadius","getTrendColor","formatTrendSeriesName","toFixed","totalEstimated","seconds","minutes","hours","remainingMinutes","phaseMap","isOther","dates","formatSingleDate","includeYear","monthDay","endLabel","getTrendDateRangeParams","action","timezoneOffset","getTimezoneOffset","trendMaxPoints","trendSeriesLimit","trendStartDate","trendEndDate","$message","warning","handleProgress","handleError","errorMessage","settingsMsg","fileInput","file","$confirm","confirmButtonText","cancelButtonText","restoreData","fileContent","parseError","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","_component_ChannelIcon","isOpen","toggleDropdown","displayLabel","selectOption","$slots","channelType","iconClass","ChannelIcon","placeholder","resolvedPlaceholder","selected","opt","handleClickOutside","beforeUnmount","$el","_component_CustomSelect","_component_el_tag","_component_el_switch","_component_el_option","_component_el_select","_component_el_form_item","_component_el_input","_component_el_input_number","_component_el_form","_component_el_descriptions_item","_component_el_descriptions","channelFilter","filterOptions","showAddDialog","filteredChannels","getChannelIconClass","getChannelList","hasLoadBalance","getSettings","loadBalance","saveSettings","fixed","onMousemove","handleCardMouseMove","onMouseleave","handleCardMouseLeave","ref_for","maskText","botToken","chatId","publicUrl","bucketName","endpoint","channelId","isNitro","repo","isPrivate","baseUrl","quota","getQuotaPercentage","getQuotaStatus","getQuotaText","openDetailDialog","openEditDialog","deleteChannel","onClosed","resetAddForm","newChannel","confirmAddChannel","model","rules","addRules","onChannelTypeChange","addableChannels","ch","innerHTML","proxyUrl","cdnDomain","region","accessKeyId","secretAccessKey","pathStyle","limitGB","threshold","token","username","password","headersText","autosize","minRows","createDirectory","showDetailDialog","currentChannel","resetDetailData","openEditFromDetail","column","getChannelTypeLabel","currentChannelType","readonly","formatHeaders","link","refreshQuota","quotaLoading","isQuotaExceeded","getQuotaStatusText","showEditDialog","editChannel","resetEditData","confirmEditChannel","editRules","onQuotaEnabledChange","CustomSelect","channels","telegramSettings","cfr2Settings","s3Settings","discordSettings","huggingfaceSettings","webdavSettings","currentChannelIndex","quotaStats","pattern","card","currentTarget","refKey","glowEl","telegram","cfr2","s3","discord","huggingface","webdav","showLength","headersToText","parseHeadersText","addForm","validate","reservedNames","isDuplicate","newChannelData","savePath","editForm","currentIndex","originalName","editedChannel","catch","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","finally","handleClick","spin","_component_el_checkbox","_component_el_table_column","_component_el_table","_component_FloatingSaveButton","_component_el_checkbox_group","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","autocomplete","_hasPassword","clearUserPassword","handleClearUserPassword","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","clearAdminPassword","adminPassword","handleAdminPassInput","handleClearAdminPassword","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","getTokenStatus","expiresAt","expiresText","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","ipQuery","customApi","removeIpQueryParam","addIpQueryParam","responseFields","moveIpQueryResponseField","removeIpQueryResponseField","addIpQueryResponseField","accessSettings","allowedDomains","accessRules","whiteListMode","sessionSecure","userSessionMaxAge","adminSessionMaxAge","dialogWidth","createToken","newToken","tokenRules","neverExpire","onCreateNeverExpireChange","expirationValue","expirationUnit","timeUnitOptions","labelKey","autoDelete","showEditTokenDialog","updateToken","editingToken","editTokenRules","onEditNeverExpireChange","showTokenResultDialog","createdToken","append","copyToken","SIMPLE_UNIT_MS","computeExpiresAt","baseTime","setUTCMonth","getUTCMonth","setUTCFullYear","getUTCFullYear","formatExpiresTime","isoString","getHours","getMinutes","getSeconds","expiresDate","currentTime","formattedTime","FloatingSaveButton","oriUserPassword","oriAdminPassword","owner","validator","rule","urlReservedChars","hasReservedChar","char","validateSessionMaxAge","isInteger","normalizeIpQuerySettings","fields","targetIndex","checked","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","hasExpiration","editTokenForm","tokenId","navigator","clipboard","writeText","validationPromises","userPassForm","adminPassForm","accessForm","results","isValid","every","auth","upload","access","_clear","adminPasswordChanged","msg","$store","commit","$router","groupedSettings","categoryGroup","categoryName","setting","localized","localizedOption","currentUploadChannel","currentChannelList","clearable","availableChannels","isEn","$i18n","category","category_en","channelSetting","newVal","oldVal","channelNameSetting","newChannelList","label_en","fetchAvailableChannels","axios","telemetry","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","randomImageAPI","allowedDir","publicBrowse","webDAV","uploadChannel","webdavChannelList","channelName","mixins","backgroundManager","newHash","scrollTo","newIndex","hash","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","fetch","credentials","authType","setDefaultHash","defaultHash","location","initializeBackground","viewBox","xmlns","$attrs","fontAwesomeIcon","inheritAttrs","icons","_typeof","iterator","toPropertyKey"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/529.287c329f.js","mappings":"gYACA,MAAMA,EAAa,CACjBC,MAAO,aAEHC,EAAa,CAAC,WACdC,EAAa,CACjBF,MAAO,aAEF,SAASG,EAAOC,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACvD,OAAO,WAAc,QAAoB,MAAO,CAC9CV,OAAO,QAAgB,CAAC,oBAAqB,CAC3C,eAAgBM,EAAOK,cAEzBC,IAAK,UACLC,OAAO,QAAgBJ,EAASK,eAC/B,EAAC,QAAoB,MAAOf,EAAY,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYS,EAAMO,UAAWC,KACxH,WAAc,QAAoB,MAAO,CAC9CC,IAAKD,EAAKE,MACVlB,OAAO,QAAgB,CAAC,YAAa,CACnC,YAAaM,EAAOa,cAAgBH,EAAKE,SAE3CE,QAASC,GAAUZ,EAASa,aAAaN,EAAKE,QAC7C,EAAC,QAAaR,EAA8B,CAC7Ca,KAAMP,EAAKO,KACXvB,MAAO,aACN,KAAM,EAAG,CAAC,UAAU,QAAoB,OAAQE,GAAY,QAAiBE,EAAKoB,GAAGR,EAAKS,WAAY,IAAK,GAAIxB,KAChH,SAAS,QAAoB,MAAO,CACtCD,MAAO,gBACPoB,QAASf,EAAO,KAAOA,EAAO,GAAK,IAAIqB,IAASjB,EAASkB,gBAAkBlB,EAASkB,kBAAkBD,KACrG,EAAC,QAAahB,EAA8B,CAC7Ca,KAAMjB,EAAOK,WAAa,qBAAuB,qBAChD,KAAM,EAAG,CAAC,YAAa,EAC5B,CCjCA,OACEiB,KAAM,gBACNC,MAAO,CACLV,YAAa,CACXW,KAAMC,OACNC,QAAS,UAEXrB,WAAY,CACVmB,KAAMG,QACND,SAAS,IAGb,IAAAE,GACE,MAAO,CACLC,cAAe,KACfpB,UAAW,CAAC,CACVG,MAAO,SACPK,KAAM,YACNE,SAAU,8BACT,CACDP,MAAO,SACPK,KAAM,eACNE,SAAU,gCACT,CACDP,MAAO,WACPK,KAAM,SACNE,SAAU,kCACT,CACDP,MAAO,OACPK,KAAM,QACNE,SAAU,8BACT,CACDP,MAAO,SACPK,KAAM,MACNE,SAAU,gCAGhB,EACAW,SAAU,CACR,cAAAC,GACE,OAAOC,OAAOC,YAAc,IAAM,GAAK,EACzC,EACA,YAAAzB,GACE,OAAI0B,KAAK7B,WACA,CACL8B,MAAOD,KAAKH,eAAiB,MAG1BG,KAAKL,cAAgB,CAC1BM,MAAOD,KAAKL,cAAgB,MAC1B,CAAC,CACP,GAEFO,MAAO,CACL,iBACEF,KAAKG,UAAU,IAAMH,KAAKI,eAC5B,GAEFC,QAAS,CACP,cAAAlB,GACEa,KAAKM,MAAM,qBAAsBN,KAAK7B,WACxC,EACA,WAAAoC,GACE,MAAMC,EAAWV,OAAOC,YAAc,IACtCC,KAAKM,MAAM,oBAAqBE,EAClC,EACA,YAAA1B,CAAaJ,GACXsB,KAAKM,MAAM,qBAAsB5B,EACnC,EACA,YAAA0B,GACE,MAAMK,EAAKT,KAAKU,MAAMC,QACtB,IAAKF,EAAI,OAET,MAAMG,EAAYH,EAAGpC,MAAM4B,MACrBY,EAAiBJ,EAAGpC,MAAMyC,WAC1BC,EAAeN,EAAGO,UAAUC,SAAS,gBAC3CR,EAAGpC,MAAMyC,WAAa,OAClBC,GACFN,EAAGO,UAAUE,OAAO,gBAEtBT,EAAGpC,MAAM4B,MAAQ,OAEZQ,EAAGU,YACR,MAAMC,EAAUX,EAAGY,YAEnBZ,EAAGpC,MAAM4B,MAAQW,EACbG,GACFN,EAAGO,UAAUM,IAAI,gBAEdb,EAAGU,YACRV,EAAGpC,MAAMyC,WAAaD,EACtBb,KAAKL,cAAgByB,CACvB,GAEF,OAAAG,GACEvB,KAAKO,cACLP,KAAKG,UAAU,IAAMH,KAAKI,gBAC1BN,OAAO0B,iBAAiB,SAAUxB,KAAKO,YACzC,EACA,aAAAkB,GACE3B,OAAO4B,oBAAoB,SAAU1B,KAAKO,YAC5C,G,WC9FF,MAAMoB,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAShE,GAAQ,CAAC,YAAY,qBAEzF,Q,8DCRA,MAAM,EAAa,CACjBH,MAAO,aAEH,EAAa,CACjBA,MAAO,kBAEH,EAAa,CACjBA,MAAO,iBAEF,SAAS,EAAOI,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAM2D,EAA2B,IAC3B1D,GAA+B,QAAkB,qBACjD2D,EAAwB,KACxBC,EAAuB,KACvBC,EAA2B,EACjC,OAAO,WAAc,QAAoB,MAAO,EAAY,EAAC,QAAaD,EAAsB,KAAM,CACpGtC,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAO,EAAY,EAAC,QAAaoC,EAA0B,CACtGI,UAAW,kBACT,QAAoB,MAAO,EAAY,EAAC,QAAaH,EAAuB,CAC9EI,SAAUhE,EAASiE,eACnBC,QAASvE,EAAKoB,GAAG,oBACjBoD,UAAW,UACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,eACNvB,MAAO,cACPoB,QAASX,EAASoE,cACjB,KAAM,EAAG,CAAC,cACbC,EAAG,GACF,EAAG,CAAC,WAAY,kBACnBA,EAAG,KACD,QAAaP,EAA0B,CACzCpD,YAAaX,EAAMW,YACnB,uBAAwBd,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMW,YAAcE,GAChFV,WAAYH,EAAMuE,kBAClB,sBAAuB1E,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMuE,kBAAoB1D,IACpF,KAAM,EAAG,CAAC,cAAe,iBAAiB,WAAc,SAAa,QAAyBZ,EAASuE,kBAAmB,CAC3HhF,OAAO,QAAgB,CAAC,iBAAkB,CACxC,UAAaQ,EAAMuE,sBAEpB,KAAM,EAAG,CAAC,YACf,C,uHCzCA,MAAM,EAAa,CACjB/E,MAAO,uBAEH,EAAa,CACjBA,MAAO,kBAEH,EAAa,CACjBA,MAAO,yBAEHiF,EAAa,CAAC,cACdC,EAAa,CACjBlF,MAAO,wBAEHmF,EAAa,CAAC,cACdC,EAAa,CACjBpF,MAAO,mBAEHqF,EAAa,CAAC,cACdC,EAAa,CACjBtF,MAAO,kBAEHuF,EAAc,CAAC,cACfC,EAAc,CAClBxF,MAAO,qBAEHyF,EAAc,CAClBzF,MAAO,iBAEH0F,EAAc,CAAC,WACd,SAAS,EAAOtF,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACvD,OAAO,WAAc,QAAoB,MAAO,EAAY,EAAC,QAAoB,MAAO,EAAY,EAAC,QAAoB,MAAO,EAAY,EAAC,SAAgB,QAAoB,QAAS,CACxL,sBAAuBL,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMmF,WAAatE,GAC9ErB,MAAO,aACP8B,KAAM,OACN8D,UAAW,UACX,aAAcnF,EAASoF,eACvBC,SAAUzF,EAAO,KAAOA,EAAO,GAAK,IAAIqB,IAASjB,EAASsF,mBAAqBtF,EAASsF,qBAAqBrE,KAC5G,KAAM,GAAIuD,GAAa,CAAC,CAAC,KAAazE,EAAMmF,gBAAY,EAAQ,CACjEK,MAAM,OACF,QAAoB,OAAQd,GAAY,QAAiBzE,EAASwF,gBAAiB,IAAI,SAAgB,QAAoB,QAAS,CACxI,sBAAuB5F,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAM0F,SAAW7E,GAC5ErB,MAAO,aACP8B,KAAM,OACN8D,UAAW,UACX,aAAcnF,EAAS0F,aACvBL,SAAUzF,EAAO,KAAOA,EAAO,GAAK,IAAIqB,IAASjB,EAASsF,mBAAqBtF,EAASsF,qBAAqBrE,KAC5G,KAAM,GAAIyD,GAAa,CAAC,CAAC,KAAa3E,EAAM0F,cAAU,EAAQ,CAC/DF,MAAM,WACE,QAAoB,MAAOZ,EAAY,EAAC,QAAoB,SAAU,CAC9EtD,KAAM,SACN9B,MAAO,eACP,aAAcS,EAAS2F,mBACvBhF,QAASf,EAAO,KAAOA,EAAO,GAAK,IAAIqB,IAASjB,EAAS4F,mBAAqB5F,EAAS4F,qBAAqB3E,KAC3G,EAAC,QAAahB,EAA8B,CAC7Ca,KAAM,kBACH,EAAG8D,IAAa,QAAoB,MAAOC,GAAY,QAAiB7E,EAAS6F,YAAa,IAAI,QAAoB,SAAU,CACnIxE,KAAM,SACN9B,MAAO,eACP,aAAcS,EAAS8F,eACvBnF,QAASf,EAAO,KAAOA,EAAO,GAAK,IAAIqB,IAASjB,EAAS+F,eAAiB/F,EAAS+F,iBAAiB9E,KACnG,EAAC,QAAahB,EAA8B,CAC7Ca,KAAM,mBACH,EAAGgE,MAAgB,QAAoB,MAAOC,EAAa,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAY/E,EAASgG,cAAeC,KACpJ,WAAc,QAAoB,OAAQ,CAC/CzF,IAAKyF,IACJ,QAAiBA,GAAU,KAC5B,SAAS,QAAoB,MAAOjB,EAAa,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYhF,EAASkG,aAAcC,KACxI,WAAc,QAAoB,SAAU,CACjD3F,IAAK2F,EAAI3F,IACTa,KAAM,SACN9B,OAAO,QAAgB,CAAC,eAAgB,CACtC,YAAa4G,EAAIC,eACjB,WAAYD,EAAIE,QAChB,iBAAkBF,EAAI3F,MAAQT,EAAMuG,WACpC,eAAgBH,EAAI3F,MAAQT,EAAMwG,SAClC,cAAevG,EAASwG,UAAUL,EAAI3F,QAExCG,QAASC,GAAUZ,EAASyG,UAAUN,EAAI3F,OACzC,QAAiB2F,EAAIO,YAAa,GAAIzB,KACvC,SACN,CClFA,MAAM0B,EAAS,MACf,SAASC,EAAYC,GACnB,OAAOvF,OAAOuF,GAAOC,SAAS,EAAG,IACnC,CACA,SAASC,EAAcC,GACrB,MAAO,GAAGA,EAAKC,iBAAiBL,EAAYI,EAAKE,WAAa,MAAMN,EAAYI,EAAKG,YACvF,CACA,SAASC,EAAaP,GACpB,GAAqB,kBAAVA,EAAoB,OAAO,KACtC,MAAMQ,EAAQR,EAAMtB,OAAO8B,MAAM,uCACjC,IAAKA,EAAO,OAAO,KACnB,MAAMC,EAAOC,OAAOF,EAAM,IACpBG,EAAQD,OAAOF,EAAM,IAAM,EAC3BlB,EAAMoB,OAAOF,EAAM,IACnBL,EAAO,IAAIS,KAAKH,EAAME,EAAOrB,GACnC,OAAIa,EAAKC,gBAAkBK,GAAQN,EAAKE,aAAeM,GAASR,EAAKG,YAAchB,EAC1E,MAETa,EAAKU,SAAS,EAAG,EAAG,EAAG,GAChBV,EACT,CACA,SAASW,EAAWX,EAAMY,GACxB,OAAO,IAAIH,KAAKT,EAAKC,cAAeD,EAAKE,WAAaU,EAAQ,EAChE,CACA,OACEzG,KAAM,oBACNC,MAAO,CACLyG,WAAY,CACVxG,KAAMyG,MACNvG,QAAS,IAAM,KAGnBwG,MAAO,CAAC,oBAAqB,UAC7B,IAAAtG,GACE,MAAMuG,EAAQ,IAAIP,KAElB,OADAO,EAAMN,SAAS,EAAG,EAAG,EAAG,GACjB,CACLO,YAAaD,EAAMf,cACnBiB,aAAcF,EAAMd,WACpBZ,WAAY,GACZC,SAAU,GACVrB,WAAY,GACZO,SAAU,GACV0C,aAAa,EAEjB,EACAxG,SAAU,CACR,kBAAAgE,GACE,OAAO5D,KAAKhB,GAAG,kCACjB,EACA,cAAA+E,GACE,OAAO/D,KAAKhB,GAAG,8BACjB,EACA,cAAAqE,GACE,OAAOrD,KAAKhB,GAAG,8BACjB,EACA,YAAA2E,GACE,OAAO3D,KAAKhB,GAAG,4BACjB,EACA,cAAAyE,GACE,OAAOzD,KAAKhB,GAAG,mCACjB,EACA,UAAA8E,GACE,OAAO9D,KAAKhB,GAAG,+BAAgC,CAC7CuG,KAAMvF,KAAKkG,YACXT,MAAOZ,EAAY7E,KAAKmG,aAAe,IAE3C,EACA,aAAAlC,GACE,MAAO,CAACjE,KAAKhB,GAAG,gCAAiCgB,KAAKhB,GAAG,gCAAiCgB,KAAKhB,GAAG,gCAAiCgB,KAAKhB,GAAG,gCAAiCgB,KAAKhB,GAAG,gCAAiCgB,KAAKhB,GAAG,gCAAiCgB,KAAKhB,GAAG,gCACxQ,EACA,YAAAmF,GACE,MAAMkC,EAAa,IAAIX,KAAK1F,KAAKkG,YAAalG,KAAKmG,aAAc,GAC3DG,EAAQ,IAAIZ,KAAK1F,KAAKkG,YAAalG,KAAKmG,aAAc,EAAIE,EAAWE,UACrEC,EAAWxB,EAAc,IAAIU,MACnC,OAAOK,MAAMU,KAAK,CAChBC,OAAQ,IACP,CAACpE,EAAG5D,KACL,MAAMuG,EAAO,IAAIS,KAAKY,EAAMK,UAAYjI,EAAQkG,GAC1CnG,EAAMuG,EAAcC,GAC1B,MAAO,CACLxG,MACAkG,WAAYM,EAAKG,UACjBf,eAAgBY,EAAKE,aAAenF,KAAKmG,aACzC7B,QAAS7F,IAAQ+H,IAGvB,GAEFtG,MAAO,CACL4F,WAAY,CACVc,WAAW,EACX,OAAAC,CAAQ/B,GACN9E,KAAK8G,cAAchC,EACrB,IAGJzE,QAAS,CACP,aAAAyG,CAAchC,GACZ,MAAMiC,EAAY1B,EAAaP,IAAQ,IACjCkC,EAAU3B,EAAaP,IAAQ,IACrC9E,KAAKuE,WAAawC,EAAY/B,EAAc+B,GAAa,GACzD/G,KAAKwE,SAAWwC,EAAUhC,EAAcgC,GAAW,GACnDhH,KAAKmD,WAAanD,KAAKuE,WACvBvE,KAAK0D,SAAW1D,KAAKwE,SACrBxE,KAAKoG,aAAc,EACnB,MAAMa,EAAcF,GAAaC,EAC7BC,IACFjH,KAAKkG,YAAce,EAAY/B,cAC/BlF,KAAKmG,aAAec,EAAY9B,WAEpC,EACA,iBAAAtB,GACE,MAAMoB,EAAOW,EAAW,IAAIF,KAAK1F,KAAKkG,YAAalG,KAAKmG,aAAc,IAAK,GAC3EnG,KAAKkG,YAAcjB,EAAKC,cACxBlF,KAAKmG,aAAelB,EAAKE,UAC3B,EACA,aAAAnB,GACE,MAAMiB,EAAOW,EAAW,IAAIF,KAAK1F,KAAKkG,YAAalG,KAAKmG,aAAc,GAAI,GAC1EnG,KAAKkG,YAAcjB,EAAKC,cACxBlF,KAAKmG,aAAelB,EAAKE,UAC3B,EACA,SAAAT,CAAUjG,GACR,IAAKuB,KAAKuE,YAAcvE,KAAKwE,WAAaxE,KAAKoG,YAM7C,OALApG,KAAKuE,WAAa9F,EAClBuB,KAAKwE,SAAW,GAChBxE,KAAKmD,WAAa1E,EAClBuB,KAAK0D,SAAW,QAChB1D,KAAKoG,aAAc,GAGrB,MAAMc,EAAQzI,EAAMuB,KAAKuE,WAAa,CAAC9F,EAAKuB,KAAKuE,YAAc,CAACvE,KAAKuE,WAAY9F,GACjFuB,KAAKuE,WAAa2C,EAAM,GACxBlH,KAAKwE,SAAW0C,EAAM,GACtBlH,KAAKmD,WAAa+D,EAAM,GACxBlH,KAAK0D,SAAWwD,EAAM,GACtBlH,KAAKoG,aAAc,EACnBpG,KAAKmH,YAAYD,EACnB,EACA,iBAAA3D,GACE,MAAMwD,EAAY1B,EAAarF,KAAKmD,YAC9B6D,EAAU3B,EAAarF,KAAK0D,UAClC,IAAKqD,IAAcC,EAAS,OAC5B,MAAMI,EAAWpC,EAAc+B,GACzBM,EAASrC,EAAcgC,GACvBE,EAAQE,GAAYC,EAAS,CAACD,EAAUC,GAAU,CAACA,EAAQD,GACjEpH,KAAKuE,WAAa2C,EAAM,GACxBlH,KAAKwE,SAAW0C,EAAM,GACtBlH,KAAKmD,WAAa+D,EAAM,GACxBlH,KAAK0D,SAAWwD,EAAM,GACtBlH,KAAKoG,aAAc,EACnBpG,KAAKkG,YAAca,EAAU7B,cAC7BlF,KAAKmG,aAAeY,EAAU5B,WAC9BnF,KAAKmH,YAAYD,EACnB,EACA,WAAAC,CAAYD,GACVlH,KAAKM,MAAM,oBAAqB4G,GAChClH,KAAKM,MAAM,SAAU4G,EACvB,EACA,SAAAzC,CAAUhG,GACR,OAAOgB,QAAQO,KAAKuE,YAAcvE,KAAKwE,UAAY/F,EAAMuB,KAAKuE,YAAc9F,EAAMuB,KAAKwE,SACzF,IC1JJ,MAAM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,Q,kDCRA,MAAM,EAAa,CACjBhH,MAAO,gBAEH,EAAa,CACjBA,MAAO,kBAEH,EAAa,CACjBA,MAAO,aAEH,EAAa,CACjBA,MAAO,gBAEH,EAAa,CACjBA,MAAO,cAEH,GAAa,CACjBA,MAAO,cAEH,GAAa,CACjBA,MAAO,iBAEH,GAAa,CACjBA,MAAO,8BAEH,GAAa,CACjBA,MAAO,aAEH,GAAc,CAClBA,MAAO,gBAEH,GAAc,CAClBA,MAAO,cAEH,GAAc,CAClBA,MAAO,cAEH,GAAc,CAClBA,MAAO,iBAEH8J,GAAc,CAClB9J,MAAO,aAEH+J,GAAc,CAClB/J,MAAO,gBAEHgK,GAAc,CAClBhK,MAAO,cAEHiK,GAAc,CAClBjK,MAAO,cAEHkK,GAAc,CAClBlK,MAAO,iBAEHmK,GAAc,CAClBnK,MAAO,kBAEHoK,GAAc,CAClBpK,MAAO,+BAEHqK,GAAc,CAClBrK,MAAO,mCAEHsK,GAAc,CAClBtK,MAAO,eAEHuK,GAAc,CAClBvK,MAAO,kBAEHwK,GAAc,CAClBxK,MAAO,oBAEHyK,GAAc,CAClBzK,MAAO,qCAEH0K,GAAc,CAClBzJ,IAAK,EACLjB,MAAO,iCAEH2K,GAAc,CAClB1J,IAAK,EACLjB,MAAO,sBAEH4K,GAAc,CAClB5K,MAAO,cAEH6K,GAAc,CAClB7K,MAAO,gBAEH8K,GAAc,CAClB9K,MAAO,iBAEH+K,GAAc,CAClB9J,IAAK,EACLjB,MAAO,eAEHgL,GAAc,CAClB/J,IAAK,EACLjB,MAAO,uBAEHiL,GAAc,CAClBjL,MAAO,qBAEHkL,GAAc,CAClBlL,MAAO,qBAEHmL,GAAc,CAClBnL,MAAO,gBAEHoL,GAAc,CAClBpL,MAAO,gBAEHqL,GAAc,CAClBrL,MAAO,gBAEHsL,GAAc,CAClBtL,MAAO,gBAEHuL,GAAc,CAClBvL,MAAO,gBAEHwL,GAAc,CAClBxL,MAAO,kBAEHyL,GAAc,CAClBzL,MAAO,cAEH0L,GAAc,CAClB1L,MAAO,gBAEH2L,GAAc,CAClB3L,MAAO,iBAEH4L,GAAc,CAClB3K,IAAK,EACLjB,MAAO,eAEH6L,GAAc,CAClB5K,IAAK,EACLjB,MAAO,uBAEH8L,GAAc,CAClB9L,MAAO,qBAEH+L,GAAc,CAClB/L,MAAO,qBAEHgM,GAAc,CAClBhM,MAAO,gBAEHiM,GAAc,CAClBjM,MAAO,gBAEHkM,GAAc,CAClBlM,MAAO,gBAEHmM,GAAc,CAClBnM,MAAO,gBAEHoM,GAAc,CAClBpM,MAAO,gBAEHqM,GAAc,CAClBrM,MAAO,kBAEHsM,GAAc,CAClBtM,MAAO,mBAEHuM,GAAc,CAClBvM,MAAO,eAEHwM,GAAc,CAClBxM,MAAO,iBAEHyM,GAAc,CAClBzM,MAAO,kBAEH0M,GAAc,CAClBzL,IAAK,EACLjB,MAAO,sBAEH2M,GAAc,CAClB3M,MAAO,mBAEH4M,GAAc,CAClB5M,MAAO,kBAEH6M,GAAc,CAClB7M,MAAO,uBAEH8M,GAAc,CAClB9M,MAAO,oBAEH+M,GAAc,CAClB9L,IAAK,EACLjB,MAAO,kBAEHgN,GAAc,CAClB/L,IAAK,EACLjB,MAAO,iBAEHiN,GAAc,CAClBhM,IAAK,EACLjB,MAAO,oBAEHkN,GAAc,CAClBjM,IAAK,EACLjB,MAAO,mBAEHmN,GAAc,CAClBnN,MAAO,cAEHoN,GAAc,CAClBpN,MAAO,iBAEHqN,GAAc,CAClBrN,MAAO,iBAEHsN,GAAc,CAClBrM,IAAK,EACLjB,MAAO,oBAEHuN,GAAc,CAClBvN,MAAO,iBAEHwN,GAAc,CAClBvM,IAAK,EACLjB,MAAO,kBAEHyN,GAAc,CAClBzN,MAAO,mBAEH0N,GAAc,CAClBzM,IAAK,EACLjB,MAAO,qBAEH2N,GAAc,CAAC,OACfC,GAAc,CAClB3M,IAAK,EACLjB,MAAO,oBAEH6N,GAAc,CAClB7N,MAAO,oBAEH8N,GAAc,CAClB9N,MAAO,oBAEH+N,GAAc,CAClB/N,MAAO,aAEHgO,GAAc,CAClBhO,MAAO,aAEHiO,GAAc,CAAC,OACfC,GAAc,CAClBjN,IAAK,EACLjB,MAAO,oBAEHmO,GAAc,CAClBnO,MAAO,4BAEHoO,GAAc,CAClBpO,MAAO,oBAEHqO,GAAc,CAClBrO,MAAO,aAEHsO,GAAc,CAClBtO,MAAO,aAEF,SAAS,GAAOI,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACjD6N,EAAuB,KACvBC,EAA6B,KAC7BC,EAA4B,KAC5BC,EAA+B,EAC/BC,EAAuB,KACvBC,GAAkB,QAAkB,QACpCC,GAAsB,QAAkB,YACxCC,EAAyB,KACzBzK,EAAwB,KACxB0K,EAAsB,KACtBC,EAAqB,IAC3B,OAAO,UAAiB,WAAc,QAAoB,MAAO,EAAY,EAAC,QAAoB,MAAO,EAAY,EAAC,QAAoB,MAAO,CAC/IhP,MAAO,4BACPoB,QAASf,EAAO,KAAOA,EAAO,GAAK,IAAIqB,IAASjB,EAASwO,gBAAkBxO,EAASwO,kBAAkBvN,KACrG,EAAC,QAAoB,MAAO,EAAY,EAAC,QAAahB,EAA8B,CACrFa,KAAM,gBACF,QAAoB,MAAO,EAAY,EAAC,QAAoB,MAAO,GAAY,QAAiBnB,EAAKoB,GAAG,yBAA0B,IAAI,QAAoB,MAAO,IAAY,QAAiBhB,EAAM0O,UAAUC,YAAYC,kBAAoB,KAAM,IAAI,QAAoB,MAAO,IAAY,QAAiBhP,EAAKoB,GAAG,6BAA8B,QAAQ,QAAoB,MAAO,GAAY,EAAC,QAAoB,MAAO,GAAY,EAAC,QAAad,EAA8B,CAC7da,KAAM,aACF,QAAoB,MAAO,GAAa,EAAC,QAAoB,MAAO,IAAa,QAAiBnB,EAAKoB,GAAG,8BAA+B,IAAI,QAAoB,MAAO,IAAa,QAAiBf,EAAS4O,WAAW7O,EAAM0O,UAAUI,cAAe,IAAI,QAAoB,MAAO,IAAa,QAAiB7O,EAAS8O,WAAW/O,EAAM0O,UAAUI,cAAe,QAAQ,QAAoB,MAAO,CAChZtP,MAAO,+BACPoB,QAASf,EAAO,KAAOA,EAAO,GAAK,IAAIqB,IAASjB,EAAS+O,cAAgB/O,EAAS+O,gBAAgB9N,KACjG,EAAC,QAAoB,MAAOoI,GAAa,EAAC,QAAapJ,EAA8B,CACtFa,KAAM,mBACF,QAAoB,MAAOwI,GAAa,EAAC,QAAoB,MAAOC,IAAa,QAAiB5J,EAAKoB,GAAG,4BAA6B,IAAI,QAAoB,MAAOyI,GAAa,KAAM,QAAiBzJ,EAAMiP,SAAU,IAAI,QAAoB,MAAOvF,IAAa,QAAiB9J,EAAKoB,GAAG,mCAAoC,UAAU,QAAoB,MAAO2I,GAAa,EAAC,QAAoB,MAAOC,GAAa,EAAC,QAAoB,MAAOC,GAAa,EAAC,QAAoB,MAAOC,GAAa,EAAC,QAAa5J,EAA8B,CAChiBa,KAAM,gBACJ,QAAoB,OAAQ,MAAM,QAAiBnB,EAAKoB,GAAG,0BAA2B,IAAI,QAAa+M,EAAsB,CAC/HvO,MAAO,qBACP0P,OAAQ,GACR,aAActP,EAAKoB,GAAG,6BACtBJ,QAASX,EAASkP,qBACjB,CACD3N,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,eAERuD,EAAG,GACF,EAAG,CAAC,aAAc,eAAe,QAAoB,MAAOyF,GAAa,EAAC,QAAakE,EAA2B,CACnHnG,WAAY9H,EAAMoP,aAClB,sBAAuBvP,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMoP,aAAevO,GAChFwO,KAAM,QACN7P,MAAO,qBACP,aAAcI,EAAKoB,GAAG,iCACrB,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAawM,EAA4B,CAChEsB,MAAO,WACN,CACD9N,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,4BAA6B,KAChGsD,EAAG,KACD,QAAa0J,EAA4B,CAC3CsB,MAAO,eACN,CACD9N,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,4BAA6B,KAChGsD,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,aAAc,oBAAoB,QAAa6J,EAAsB,CAC1ErG,WAAY9H,EAAMuP,uBAClB,sBAAuB1P,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMuP,uBAAyB1O,GAC1F2O,MAAO5P,EAAKoB,GAAG,6BACfiB,MAAOhC,EAASwP,qBAChBjQ,MAAO,oBACP,eAAgB,GAChB,iBAAkB,IACjB,CACDgC,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAOwI,GAAa,EAAC,QAAakE,EAA8B,CAC3GpG,WAAY9H,EAAM0P,eAClB,sBAAuB7P,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAM0P,eAAiB7O,GAClFyE,SAAUrF,EAAS0P,4BAClB,KAAM,EAAG,CAAC,aAAc,iBAC3BrL,EAAG,GACF,EAAG,CAAC,aAAc,QAAS,WAAW,QAAoB,MAAO2F,GAAa,CAAEhK,EAAS2P,eAEE,WAAc,QAAoB,MAAOzF,GAAa,EAAC,QAAaiE,EAAiB,CACjL1M,KAAMzB,EAAS4P,qBACfC,QAAS7P,EAAS8P,kBACjB,KAAM,EAAG,CAAC,OAAQ,iBALuF,WAAc,QAAoB,MAAO7F,GAAa,EAAC,QAAahK,EAA8B,CAC5Ma,KAAM,WACJ,QAAoB,OAAQ,MAAM,QAAiBnB,EAAKoB,GAAG,qBAAsB,WAG5C,QAAoB,MAAOoJ,GAAa,EAAC,QAAoB,MAAOC,GAAa,EAAC,QAAanK,EAA8B,CACpKa,KAAM,eACJ,QAAoB,OAAQ,MAAM,QAAiBnB,EAAKoB,GAAG,kCAAmC,MAAM,QAAoB,MAAOsJ,GAAa,CAA4D,IAA3D0F,OAAOC,KAAKjQ,EAAM0O,UAAUwB,cAAgB,CAAC,GAAGxH,SAAgB,WAAc,QAAoB,MAAO6B,GAAa,EAAC,QAAarK,EAA8B,CACjTa,KAAM,WACJ,QAAoB,OAAQ,MAAM,QAAiBnB,EAAKoB,GAAG,qBAAsB,QAAS,WAAc,QAAoB,MAAOwJ,GAAa,EAAC,QAAoB,MAAOC,GAAa,EAAC,QAAa4D,EAAqB,CAC9N3M,KAAMzB,EAASkQ,iBACfL,QAAS7P,EAASmQ,cACjB,KAAM,EAAG,CAAC,OAAQ,aAAa,QAAoB,MAAO1F,GAAa,EAAC,QAAoB,MAAOC,IAAa,QAAiB3K,EAAM0O,UAAUC,YAAYC,kBAAoB,KAAM,IAAI,QAAoB,MAAOhE,IAAa,QAAiBhL,EAAKoB,GAAG,8BAA+B,QAAQ,QAAoB,MAAO6J,GAAa,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAY7K,EAAM0O,UAAUwB,aAAc,CAACG,EAAOC,EAAS5P,MACzb,WAAc,QAAoB,MAAO,CAC9CD,IAAK6P,EACL9Q,MAAO,eACN,EAAC,QAAoB,OAAQ,CAC9BA,MAAO,eACPa,OAAO,QAAgB,CACrBkQ,WAAYtQ,EAASuQ,cAAc9P,MAEpC,KAAM,IAAI,QAAoB,OAAQoK,IAAa,QAAiBwF,GAAU,IAAI,QAAoB,OAAQvF,IAAa,QAAiBsF,EAAMzB,kBAAmB,IAAI,QAAoB,OAAQ5D,IAAa,QAAiB/K,EAASwQ,cAAcJ,EAAOrQ,EAAM0O,UAAUC,aAAe,IAAK,OACtS,gBAAgB,QAAoB,MAAO1D,GAAa,EAAC,QAAoB,MAAOC,GAAa,EAAC,QAAahL,EAA8B,CAC/Ia,KAAM,cACJ,QAAoB,OAAQ,MAAM,QAAiBnB,EAAKoB,GAAG,qCAAsC,MAAM,QAAoB,MAAOmK,GAAa,CAAyD,IAAxD6E,OAAOC,KAAKjQ,EAAM0O,UAAUgC,WAAa,CAAC,GAAGhI,SAAgB,WAAc,QAAoB,MAAO0C,GAAa,EAAC,QAAalL,EAA8B,CACjTa,KAAM,WACJ,QAAoB,OAAQ,MAAM,QAAiBnB,EAAKoB,GAAG,qBAAsB,QAAS,WAAc,QAAoB,MAAOqK,GAAa,EAAC,QAAoB,MAAOC,GAAa,EAAC,QAAa+C,EAAqB,CAC9N3M,KAAMzB,EAAS0Q,cACfb,QAAS7P,EAASmQ,cACjB,KAAM,EAAG,CAAC,OAAQ,aAAa,QAAoB,MAAO7E,GAAa,EAAC,QAAoB,MAAOC,IAAa,QAAiBwE,OAAOC,KAAKjQ,EAAM0O,UAAUgC,WAAWhI,QAAS,IAAI,QAAoB,MAAO+C,IAAa,QAAiB7L,EAAKoB,GAAG,0BAA2B,QAAQ,QAAoB,MAAO0K,GAAa,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYzL,EAAS2Q,oBAAqB,CAACP,EAAOQ,EAAQnQ,MAC9a,WAAc,QAAoB,MAAO,CAC9CD,IAAKoQ,EACLrR,MAAO,eACN,EAAC,QAAoB,OAAQ,CAC9BA,MAAO,eACPa,OAAO,QAAgB,CACrBkQ,WAAYtQ,EAAS6Q,kBAAkBpQ,MAExC,KAAM,IAAI,QAAoB,OAAQiL,IAAa,QAAiBkF,GAAS,IAAI,QAAoB,OAAQjF,IAAa,QAAiByE,EAAMzB,kBAAmB,IAAI,QAAoB,OAAQ/C,IAAa,QAAiB5L,EAASwQ,cAAcJ,EAAOrQ,EAAM0O,UAAUC,aAAe,IAAK,OACrS,kBAAkB,QAAoB,MAAO7C,GAAa,EAAC,QAAoB,MAAOC,GAAa,EAAC,QAAoB,MAAOC,GAAa,EAAC,QAAa9L,EAA8B,CAC1La,KAAM,WACJ,QAAoB,OAAQ,MAAM,QAAiBnB,EAAKoB,GAAG,gCAAiC,MAAM,QAAoB,MAAOiL,GAAa,CAACjM,EAAM+Q,eAAgB,WAAc,QAAoB,MAAO7E,GAAa,EAAC,QAAoB,MAAOC,GAAa,EAAC,QAAoB,OAAQC,IAAa,QAAiBnM,EAAS+Q,kBAAmB,IAAI,QAAoB,OAAQ3E,IAAa,QAAiB4E,KAAKC,MAAMlR,EAAMmR,mBAAmBC,aAAe,IAAK,MAAM,QAAa9C,EAAwB,CAC1f8C,WAAYpR,EAAMmR,mBAAmBC,WACrC,eAAgB,GAChB,aAAa,EACb5R,MAAO,gBACN,KAAM,EAAG,CAAC,gBAAgB,QAAoB,MAAO8M,GAAa,CAACtM,EAAMmR,mBAAmBE,QAAU,IAAK,WAAc,QAAoB,OAAQ9E,GAAa,EAAC,QAAarM,EAA8B,CAC/Ma,KAAM,cACJ,QAAiB,KAAM,QAAiBf,EAAMmR,mBAAmBE,QAAQzC,kBAAoB,IAAK,GAAI5O,EAAMmR,mBAAmBG,MAAQ,IAAK,WAAc,QAAoB,KAAW,CAC3L7Q,IAAK,GACJ,EAAC,QAAiB,OAAQ,QAAiBT,EAAMmR,mBAAmBG,MAAM1C,kBAAmB,IAAK,MAAO,QAAoB,IAAI,IAAO,QAAiB,KAAM,QAAiBhP,EAAKoB,GAAG,sBAAuB,OAAQ,QAAoB,IAAI,GAAOf,EAASsR,yBAA0B,WAAc,QAAoB,OAAQ/E,GAAa,EAAC,QAAatM,EAA8B,CAC7Xa,KAAM,WACJ,QAAiB,KAAM,QAAiBd,EAASsR,wBAAyB,OAAQ,QAAoB,IAAI,KAASvR,EAAMmR,mBAAmBK,UAAW,WAAc,QAAoB,MAAO/E,IAAa,QAAiBzM,EAAMmR,mBAAmBK,SAAU,KAAM,QAAoB,IAAI,IAAO,QAAazD,EAAsB,CAC3UzM,KAAM,SACNmQ,MAAO,GACPpC,KAAM,QACNzO,QAASX,EAASyR,gBAClBlS,MAAO,cACN,CACDgC,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,WACJ,QAAiB,KAAM,QAAiBnB,EAAKoB,GAAG,8BAA+B,KACnFsD,EAAG,GACF,EAAG,CAAC,eAAiBtE,EAAM2R,kBAAmB,WAAc,QAAoB,MAAOjF,GAAa,EAAC,QAAoB,MAAOC,GAAa,EAAC,QAAazM,EAA8B,CAC1La,KAAM,4BACF,QAAoB,MAAO6L,GAAa,EAAC,QAAoB,MAAOC,IAAa,QAAiB7M,EAAM2R,gBAAgBH,SAAU,GAAIxR,EAAM2R,gBAAgBC,aAAc,WAAc,QAAoB,MAAO9E,IAAa,QAAiB9M,EAAM2R,gBAAgBC,YAAa,KAAM,QAAoB,IAAI,MAAS,QAAoB,MAAO7E,GAAa,CAAC/M,EAAM2R,gBAAgBE,cAAe,WAAc,QAAa9D,EAAsB,CAC9btN,IAAK,EACLa,KAAM,UACN+N,KAAM,QACNzO,QAASX,EAAS6R,gBACjB,CACDtQ,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,UACJ,QAAiB,KAAM,QAAiBnB,EAAKoB,GAAG,oBAAqB,KACzEsD,EAAG,GACF,EAAG,CAAC,cAAe,QAAoB,IAAI,IAAO,QAAayJ,EAAsB,CACtFzM,KAAM,UACN+N,KAAM,QACNzO,QAASX,EAAS8R,cACjB,CACDvQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,oBAAqB,KACxFsD,EAAG,GACF,EAAG,CAAC,mBAAoB,WAAc,QAAoB,MAAO0I,GAAa,EAAC,QAAanJ,EAAuB,CACpHM,QAASvE,EAAKoB,GAAG,4BACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAauM,EAAsB,CAC1DzM,KAAM,UACN0Q,QAAShS,EAAMiS,WACfhO,SAAUjE,EAAM+Q,aAChBnQ,QAASX,EAASiS,aAClB1S,MAAO,0BACN,CACDgC,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,cACJ,QAAiB,KAAM,QAAiBf,EAAMiS,WAAarS,EAAKoB,GAAG,wBAA0BpB,EAAKoB,GAAG,2BAA4B,KACrIsD,EAAG,GACF,EAAG,CAAC,UAAW,WAAY,cAC9BA,EAAG,GACF,EAAG,CAAC,aAAa,QAAaT,EAAuB,CACtDM,QAASvE,EAAKoB,GAAG,2BACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAauM,EAAsB,CAC1DzM,KAAM,UACN0Q,QAAShS,EAAMmS,QACflO,SAAUjE,EAAM+Q,aAChBnQ,QAASX,EAASmS,WAClB5S,MAAO,yBACN,CACDgC,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,cACJ,QAAiB,KAAM,QAAiBf,EAAMmS,QAAUvS,EAAKoB,GAAG,uBAAyBpB,EAAKoB,GAAG,yBAA0B,KAC/HsD,EAAG,GACF,EAAG,CAAC,UAAW,WAAY,cAC9BA,EAAG,GACF,EAAG,CAAC,aAAa,QAAaT,EAAuB,CACtDM,QAASvE,EAAKoB,GAAG,4BACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAOyL,GAAa,EAAC,QAAoB,QAAS,CAC7F3L,KAAM,OACNlB,IAAK,YACLiS,OAAQ,QACR/M,SAAUzF,EAAO,KAAOA,EAAO,GAAK,IAAIqB,IAASjB,EAASqS,kBAAoBrS,EAASqS,oBAAoBpR,IAC3Gb,MAAO,CACL,QAAW,SAEZ,KAAM,MAAM,QAAa0N,EAAsB,CAChDzM,KAAM,UACN0Q,QAAShS,EAAMuS,UACftO,SAAUjE,EAAM+Q,aAChBnQ,QAASX,EAASuS,kBAClBhT,MAAO,0BACN,CACDgC,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,YACJ,QAAiB,KAAM,QAAiBf,EAAMuS,UAAY3S,EAAKoB,GAAG,uBAAyBpB,EAAKoB,GAAG,0BAA2B,KAClIsD,EAAG,GACF,EAAG,CAAC,UAAW,WAAY,gBAC9BA,EAAG,GACF,EAAG,CAAC,qBAAsBtE,EAAM0O,UAAU+D,YAAczS,EAAM0O,UAAUgE,aAAc,WAAc,QAAoB,MAAOxF,GAAa,CAAClN,EAAM0O,UAAU+D,aAAc,WAAc,QAAoB,MAAO,CACrNhS,IAAK,EACLjB,MAAO,kCACPoB,QAASf,EAAO,KAAOA,EAAO,GAAKgB,GAAUZ,EAAS0S,iBAAiB3S,EAAM0O,UAAU+D,cACtF,CAACxS,EAAS2S,YAAY5S,EAAM0O,UAAU+D,cAAgBzS,EAAM6S,WAAW,YAAa,WAAc,QAAatE,EAAqB,CACrI9N,IAAK,EACLqS,IAAK,SAAW9S,EAAM0O,UAAU+D,WAAWM,GAAK,cAChDC,IAAK,QACLxT,MAAO,gBACPyT,QAASpT,EAAO,KAAOA,EAAO,GAAKgB,GAAUZ,EAASiT,iBAAiB,YACtE,KAAM,EAAG,CAAC,SAAWjT,EAASkT,YAAYnT,EAAM0O,UAAU+D,cAAgBzS,EAAM6S,WAAW,YAAa,WAAc,QAAoB,QAAS,CACpJpS,IAAK,EACLqS,IAAK,SAAW9S,EAAM0O,UAAU+D,WAAWM,GAAK,cAChDvT,MAAO,gBACP4T,MAAO,GACPC,KAAM,GACNC,SAAU,GACVL,QAASpT,EAAO,KAAOA,EAAO,GAAKgB,GAAUZ,EAASiT,iBAAiB,YACtE,KAAM,GAAI/F,OAAiB,WAAc,QAAoB,MAAOC,GAAa,EAAC,QAAalN,EAA8B,CAC9Ha,KAAM,WACNvB,MAAO,sBACF,QAAoB,MAAO6N,GAAa,EAAC,QAAanN,EAA8B,CACzFa,KAAM,cACJ,QAAoB,OAAQ,MAAM,QAAiBnB,EAAKoB,GAAG,2BAA4B,MAAM,QAAoB,MAAOsM,GAAa,EAAC,QAAoB,MAAOC,IAAa,QAAiBvN,EAAM0O,UAAU+D,WAAWc,UAAUC,UAAYxT,EAAM0O,UAAU+D,WAAWM,IAAK,IAAI,QAAoB,MAAOvF,IAAa,QAAiBvN,EAAS4O,WAAW7O,EAAM0O,UAAU+D,WAAWc,UAAUE,YAAa,SAAU,QAAoB,IAAI,GAAOzT,EAAM0O,UAAUgE,aAAc,WAAc,QAAoB,MAAO,CACrgBjS,IAAK,EACLjB,MAAO,kCACPoB,QAASf,EAAO,MAAQA,EAAO,IAAMgB,GAAUZ,EAAS0S,iBAAiB3S,EAAM0O,UAAUgE,cACxF,CAACzS,EAAS2S,YAAY5S,EAAM0O,UAAUgE,cAAgB1S,EAAM6S,WAAW,YAAa,WAAc,QAAatE,EAAqB,CACrI9N,IAAK,EACLqS,IAAK,SAAW9S,EAAM0O,UAAUgE,WAAWK,GAAK,cAChDC,IAAK,QACLxT,MAAO,gBACPyT,QAASpT,EAAO,KAAOA,EAAO,GAAKgB,GAAUZ,EAASiT,iBAAiB,YACtE,KAAM,EAAG,CAAC,SAAWjT,EAASkT,YAAYnT,EAAM0O,UAAUgE,cAAgB1S,EAAM6S,WAAW,YAAa,WAAc,QAAoB,QAAS,CACpJpS,IAAK,EACLqS,IAAK,SAAW9S,EAAM0O,UAAUgE,WAAWK,GAAK,cAChDvT,MAAO,gBACP4T,MAAO,GACPC,KAAM,GACNC,SAAU,GACVL,QAASpT,EAAO,MAAQA,EAAO,IAAMgB,GAAUZ,EAASiT,iBAAiB,YACxE,KAAM,GAAIzF,OAAiB,WAAc,QAAoB,MAAOC,GAAa,EAAC,QAAaxN,EAA8B,CAC9Ha,KAAM,WACNvB,MAAO,sBACF,QAAoB,MAAOmO,GAAa,EAAC,QAAazN,EAA8B,CACzFa,KAAM,gBACJ,QAAoB,OAAQ,MAAM,QAAiBnB,EAAKoB,GAAG,6BAA8B,MAAM,QAAoB,MAAO4M,GAAa,EAAC,QAAoB,MAAOC,IAAa,QAAiB7N,EAAM0O,UAAUgE,WAAWa,UAAUC,UAAYxT,EAAM0O,UAAUgE,WAAWK,IAAK,IAAI,QAAoB,MAAOjF,IAAa,QAAiB7N,EAAS4O,WAAW7O,EAAM0O,UAAUgE,WAAWa,UAAUE,YAAa,SAAU,QAAoB,IAAI,OAAW,QAAoB,IAAI,MAAU,CAAC,CAACjF,EAAoBxO,EAAMgS,UACtgB,C;;;;;;;AC5gBA,SAASd,GAAMwC,GACb,OAAOA,EAAI,GAAM,CACnB,CACA,MAAMC,GAAMA,CAACD,EAAGE,EAAGC,IAAM5C,KAAK6C,IAAI7C,KAAK8C,IAAIL,EAAGG,GAAID,GAClD,SAASI,GAAIN,GACX,OAAOC,GAAIzC,GAAU,KAAJwC,GAAW,EAAG,IACjC,CAIA,SAASO,GAAIP,GACX,OAAOC,GAAIzC,GAAU,IAAJwC,GAAU,EAAG,IAChC,CACA,SAASQ,GAAIR,GACX,OAAOC,GAAIzC,GAAMwC,EAAI,MAAQ,IAAK,EAAG,EACvC,CACA,SAASS,GAAIT,GACX,OAAOC,GAAIzC,GAAU,IAAJwC,GAAU,EAAG,IAChC,CAEA,MAAMU,GAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAGC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,IACrJC,GAAM,IAAI,oBACVC,GAAKN,GAAKK,GAAQ,GAAJL,GACdO,GAAKP,GAAKK,IAAS,IAAJL,IAAa,GAAKK,GAAQ,GAAJL,GACrCQ,GAAKR,IAAW,IAAJA,IAAa,KAAY,GAAJA,GACjCS,GAAU3B,GAAK0B,GAAG1B,EAAE4B,IAAMF,GAAG1B,EAAE6B,IAAMH,GAAG1B,EAAEkB,IAAMQ,GAAG1B,EAAEiB,GAC3D,SAASa,GAASC,GAChB,IACIC,EADAC,EAAMF,EAAI/M,OAmBd,MAjBe,MAAX+M,EAAI,KACM,IAARE,GAAqB,IAARA,EACfD,EAAM,CACJJ,EAAG,IAAsB,GAAhBlB,GAAMqB,EAAI,IACnBF,EAAG,IAAsB,GAAhBnB,GAAMqB,EAAI,IACnBb,EAAG,IAAsB,GAAhBR,GAAMqB,EAAI,IACnBd,EAAW,IAARgB,EAA4B,GAAhBvB,GAAMqB,EAAI,IAAW,KAErB,IAARE,GAAqB,IAARA,IACtBD,EAAM,CACJJ,EAAGlB,GAAMqB,EAAI,KAAO,EAAIrB,GAAMqB,EAAI,IAClCF,EAAGnB,GAAMqB,EAAI,KAAO,EAAIrB,GAAMqB,EAAI,IAClCb,EAAGR,GAAMqB,EAAI,KAAO,EAAIrB,GAAMqB,EAAI,IAClCd,EAAW,IAARgB,EAAavB,GAAMqB,EAAI,KAAO,EAAIrB,GAAMqB,EAAI,IAAO,OAIrDC,CACT,CACA,MAAME,GAAQA,CAACjB,EAAGK,IAAML,EAAI,IAAMK,EAAEL,GAAK,GACzC,SAASkB,GAAUnC,GACjB,IAAIsB,EAAIK,GAAQ3B,GAAKwB,GAAKC,GAC1B,OAAOzB,EACH,IAAMsB,EAAEtB,EAAE4B,GAAKN,EAAEtB,EAAE6B,GAAKP,EAAEtB,EAAEkB,GAAKgB,GAAMlC,EAAEiB,EAAGK,QAC5Cc,CACN,CAEA,MAAMC,GAAS,+GACf,SAASC,GAASnC,EAAGoC,EAAGrC,GACtB,MAAMe,EAAIsB,EAAIhF,KAAK8C,IAAIH,EAAG,EAAIA,GACxBoB,EAAIA,CAACkB,EAAGC,GAAKD,EAAIrC,EAAI,IAAM,KAAOD,EAAIe,EAAI1D,KAAK6C,IAAI7C,KAAK8C,IAAIoC,EAAI,EAAG,EAAIA,EAAG,IAAK,GACrF,MAAO,CAACnB,EAAE,GAAIA,EAAE,GAAIA,EAAE,GACxB,CACA,SAASoB,GAASvC,EAAGoC,EAAGvC,GACtB,MAAMsB,EAAIA,CAACkB,EAAGC,GAAKD,EAAIrC,EAAI,IAAM,IAAMH,EAAIA,EAAIuC,EAAIhF,KAAK6C,IAAI7C,KAAK8C,IAAIoC,EAAG,EAAIA,EAAG,GAAI,GACnF,MAAO,CAACnB,EAAE,GAAIA,EAAE,GAAIA,EAAE,GACxB,CACA,SAASqB,GAASxC,EAAGyC,EAAG1B,GACtB,MAAM2B,EAAMP,GAASnC,EAAG,EAAG,IAC3B,IAAI2C,EAMJ,IALIF,EAAI1B,EAAI,IACV4B,EAAI,GAAKF,EAAI1B,GACb0B,GAAKE,EACL5B,GAAK4B,GAEFA,EAAI,EAAGA,EAAI,EAAGA,IACjBD,EAAIC,IAAM,EAAIF,EAAI1B,EAClB2B,EAAIC,IAAMF,EAEZ,OAAOC,CACT,CACA,SAASE,GAASnB,EAAGC,EAAGX,EAAGE,EAAGhB,GAC5B,OAAIwB,IAAMxB,GACCyB,EAAIX,GAAKE,GAAMS,EAAIX,EAAI,EAAI,GAElCW,IAAMzB,GACAc,EAAIU,GAAKR,EAAI,GAEfQ,EAAIC,GAAKT,EAAI,CACvB,CACA,SAAS4B,GAAQhD,GACf,MAAMxK,EAAQ,IACRoM,EAAI5B,EAAE4B,EAAIpM,EACVqM,EAAI7B,EAAE6B,EAAIrM,EACV0L,EAAIlB,EAAEkB,EAAI1L,EACV4K,EAAM7C,KAAK6C,IAAIwB,EAAGC,EAAGX,GACrBb,EAAM9C,KAAK8C,IAAIuB,EAAGC,EAAGX,GACrBhB,GAAKE,EAAMC,GAAO,EACxB,IAAIF,EAAGoC,EAAGnB,EAOV,OANIhB,IAAQC,IACVe,EAAIhB,EAAMC,EACVkC,EAAIrC,EAAI,GAAMkB,GAAK,EAAIhB,EAAMC,GAAOe,GAAKhB,EAAMC,GAC/CF,EAAI4C,GAASnB,EAAGC,EAAGX,EAAGE,EAAGhB,GACzBD,EAAQ,GAAJA,EAAS,IAER,CAAK,EAAJA,EAAOoC,GAAK,EAAGrC,EACzB,CACA,SAAS+C,GAAM3B,EAAGL,EAAGC,EAAGC,GACtB,OACE9M,MAAM6O,QAAQjC,GACVK,EAAEL,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAChBK,EAAEL,EAAGC,EAAGC,IACZgC,IAAI5C,GACR,CACA,SAAS6C,GAAQjD,EAAGoC,EAAGrC,GACrB,OAAO+C,GAAMX,GAAUnC,EAAGoC,EAAGrC,EAC/B,CACA,SAASmD,GAAQlD,EAAGyC,EAAG1B,GACrB,OAAO+B,GAAMN,GAAUxC,EAAGyC,EAAG1B,EAC/B,CACA,SAASoC,GAAQnD,EAAGoC,EAAGvC,GACrB,OAAOiD,GAAMP,GAAUvC,EAAGoC,EAAGvC,EAC/B,CACA,SAASuD,GAAIpD,GACX,OAAQA,EAAI,IAAM,KAAO,GAC3B,CACA,SAASqD,GAASzB,GAChB,MAAM0B,EAAIpB,GAAOqB,KAAK3B,GACtB,IACI/B,EADAiB,EAAI,IAER,IAAKwC,EACH,OAEEA,EAAE,KAAOzD,IACXiB,EAAIwC,EAAE,GAAKnD,IAAKmD,EAAE,IAAMlD,IAAKkD,EAAE,KAEjC,MAAMtD,EAAIoD,IAAKE,EAAE,IACXE,GAAMF,EAAE,GAAK,IACbG,GAAMH,EAAE,GAAK,IAQnB,OANEzD,EADW,QAATyD,EAAE,GACAJ,GAAQlD,EAAGwD,EAAIC,GACD,QAATH,EAAE,GACPH,GAAQnD,EAAGwD,EAAIC,GAEfR,GAAQjD,EAAGwD,EAAIC,GAEd,CACLhC,EAAG5B,EAAE,GACL6B,EAAG7B,EAAE,GACLkB,EAAGlB,EAAE,GACLiB,EAAGA,EAEP,CACA,SAAS4C,GAAO7D,EAAG8D,GACjB,IAAI3D,EAAI6C,GAAQhD,GAChBG,EAAE,GAAKoD,GAAIpD,EAAE,GAAK2D,GAClB3D,EAAIiD,GAAQjD,GACZH,EAAE4B,EAAIzB,EAAE,GACRH,EAAE6B,EAAI1B,EAAE,GACRH,EAAEkB,EAAIf,EAAE,EACV,CACA,SAAS4D,GAAU/D,GACjB,IAAKA,EACH,OAEF,MAAMiB,EAAI+B,GAAQhD,GACZG,EAAIc,EAAE,GACNsB,EAAI9B,GAAIQ,EAAE,IACVf,EAAIO,GAAIQ,EAAE,IAChB,OAAOjB,EAAEiB,EAAI,IACT,QAAQd,MAAMoC,OAAOrC,OAAOM,GAAIR,EAAEiB,MAClC,OAAOd,MAAMoC,OAAOrC,KAC1B,CAEA,MAAMiD,GAAM,CACXa,EAAG,OACHC,EAAG,QACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,SACHC,EAAG,QACH3D,EAAG,KACH4D,EAAG,KACHC,EAAG,KACH5D,EAAG,KACHC,EAAG,QACHC,EAAG,QACH2D,EAAG,KACHC,EAAG,WACH3D,EAAG,KACH4D,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,QACH/D,EAAG,KACHgE,EAAG,KACHC,EAAG,OACHC,EAAG,KACHC,EAAG,QACHC,EAAG,MAEEC,GAAU,CACfC,OAAQ,SACRC,YAAa,SACbC,KAAM,OACNC,UAAW,SACXC,KAAM,SACNC,MAAO,SACPC,OAAQ,SACRC,MAAO,IACPC,aAAc,SACdC,GAAI,KACJC,QAAS,SACTC,KAAM,SACNC,UAAW,SACXC,OAAQ,SACRC,SAAU,SACVC,QAAS,SACTC,IAAK,SACLC,YAAa,SACbC,QAAS,SACTC,QAAS,SACTC,KAAM,OACNC,IAAK,KACLC,MAAO,OACPC,QAAS,SACTC,KAAM,SACNC,KAAM,OACNC,KAAM,SACNC,OAAQ,SACRC,QAAS,SACTC,SAAU,SACVC,OAAQ,SACRC,MAAO,SACPC,IAAK,SACLC,OAAQ,SACRC,OAAQ,SACRC,KAAM,SACNC,MAAO,SACPC,MAAO,SACPC,IAAK,OACLC,OAAQ,SACRC,OAAQ,SACRC,SAAU,OACVC,OAAQ,SACRC,OAAQ,SACRC,SAAU,SACVC,SAAU,SACVC,SAAU,SACVC,SAAU,SACVC,OAAQ,SACRC,QAAS,SACTC,UAAW,SACXC,IAAK,SACLC,OAAQ,SACRC,IAAK,SACLC,IAAK,OACLC,MAAO,SACPC,IAAK,SACLC,QAAS,SACTC,OAAQ,SACRC,QAAS,SACTC,MAAO,SACPC,KAAM,SACNC,MAAO,SACPC,OAAQ,SACRC,UAAW,SACXC,QAAS,SACTC,WAAY,SACZC,IAAK,SACLC,KAAM,SACNC,MAAO,SACPC,UAAW,SACXC,KAAM,SACNC,KAAM,SACNC,KAAM,SACNC,KAAM,SACNC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,MAAO,SACPC,MAAO,SACPC,QAAS,SACTC,IAAK,SACLC,KAAM,OACNC,QAAS,SACTC,IAAK,SACLC,OAAQ,SACRC,MAAO,SACPC,WAAY,SACZC,IAAK,KACLC,MAAO,SACPC,OAAQ,SACRC,OAAQ,SACRC,KAAM,SACNC,UAAW,OACXC,IAAK,SACLC,SAAU,SACVC,WAAY,SACZC,QAAS,SACTC,SAAU,SACVC,QAAS,SACTC,WAAY,SACZC,KAAM,KACNC,OAAQ,SACRC,KAAM,SACNC,QAAS,SACTC,MAAO,SACPC,QAAS,SACTC,KAAM,SACNC,UAAW,SACXC,OAAQ,SACRC,MAAO,SACPC,WAAY,SACZC,UAAW,SACXC,QAAS,SACTC,KAAM,SACNC,IAAK,SACLC,KAAM,SACNC,QAAS,SACTC,MAAO,SACPC,YAAa,SACbC,GAAI,SACJC,SAAU,SACVC,MAAO,SACPC,UAAW,SACXC,MAAO,SACPC,UAAW,SACXC,MAAO,SACPC,QAAS,SACTC,MAAO,SACPC,OAAQ,SACRC,MAAO,SACPC,IAAK,SACLC,KAAM,SACNC,KAAM,SACNC,KAAM,SACNC,SAAU,OACVC,OAAQ,SACRC,IAAK,SACLC,IAAK,OACLC,MAAO,SACPC,OAAQ,SACRC,GAAI,SACJC,MAAO,SACPC,IAAK,SACLC,KAAM,SACNC,UAAW,SACXC,GAAI,SACJC,MAAO,UAER,SAASC,KACP,MAAMC,EAAW,CAAC,EACZpS,EAAOD,OAAOC,KAAK8I,IACnBuJ,EAAQtS,OAAOC,KAAK4G,IAC1B,IAAIL,EAAG+L,EAAGpM,EAAGqM,EAAIC,EACjB,IAAKjM,EAAI,EAAGA,EAAIvG,EAAKvH,OAAQ8N,IAAK,CAEhC,IADAgM,EAAKC,EAAKxS,EAAKuG,GACV+L,EAAI,EAAGA,EAAID,EAAM5Z,OAAQ6Z,IAC5BpM,EAAImM,EAAMC,GACVE,EAAKA,EAAGC,QAAQvM,EAAGU,GAAIV,IAEzBA,EAAIwM,SAAS5J,GAAQyJ,GAAK,IAC1BH,EAASI,GAAM,CAACtM,GAAK,GAAK,IAAMA,GAAK,EAAI,IAAU,IAAJA,EACjD,CACA,OAAOkM,CACT,CAEA,IAAIO,GACJ,SAASC,GAAUpN,GACZmN,KACHA,GAAQR,KACRQ,GAAME,YAAc,CAAC,EAAG,EAAG,EAAG,IAEhC,MAAMnO,EAAIiO,GAAMnN,EAAIsN,eACpB,OAAOpO,GAAK,CACVW,EAAGX,EAAE,GACLY,EAAGZ,EAAE,GACLC,EAAGD,EAAE,GACLA,EAAgB,IAAbA,EAAEjM,OAAeiM,EAAE,GAAK,IAE/B,CAEA,MAAMqO,GAAS,uGACf,SAASC,GAASxN,GAChB,MAAM0B,EAAI6L,GAAO5L,KAAK3B,GACtB,IACIH,EAAGC,EAAGX,EADND,EAAI,IAER,GAAKwC,EAAL,CAGA,GAAIA,EAAE,KAAO7B,EAAG,CACd,MAAM5B,GAAKyD,EAAE,GACbxC,EAAIwC,EAAE,GAAKnD,GAAIN,GAAKC,GAAQ,IAAJD,EAAS,EAAG,IACtC,CAOA,OANA4B,GAAK6B,EAAE,GACP5B,GAAK4B,EAAE,GACPvC,GAAKuC,EAAE,GACP7B,EAAI,KAAO6B,EAAE,GAAKnD,GAAIsB,GAAK3B,GAAI2B,EAAG,EAAG,MACrCC,EAAI,KAAO4B,EAAE,GAAKnD,GAAIuB,GAAK5B,GAAI4B,EAAG,EAAG,MACrCX,EAAI,KAAOuC,EAAE,GAAKnD,GAAIY,GAAKjB,GAAIiB,EAAG,EAAG,MAC9B,CACLU,EAAGA,EACHC,EAAGA,EACHX,EAAGA,EACHD,EAAGA,EAfL,CAiBF,CACA,SAASuO,GAAUxP,GACjB,OAAOA,IACLA,EAAEiB,EAAI,IACF,QAAQjB,EAAE4B,MAAM5B,EAAE6B,MAAM7B,EAAEkB,MAAMV,GAAIR,EAAEiB,MACtC,OAAOjB,EAAE4B,MAAM5B,EAAE6B,MAAM7B,EAAEkB,KAEjC,CAEA,MAAMuO,GAAKzP,GAAKA,GAAK,SAAgB,MAAJA,EAAqC,MAAzBzC,KAAKmS,IAAI1P,EAAG,EAAM,KAAe,KACxEjL,GAAOiL,GAAKA,GAAK,OAAUA,EAAI,MAAQzC,KAAKmS,KAAK1P,EAAI,MAAS,MAAO,KAC3E,SAAS2P,GAAYC,EAAMC,EAAMC,GAC/B,MAAMlO,EAAI7M,GAAKyL,GAAIoP,EAAKhO,IAClBC,EAAI9M,GAAKyL,GAAIoP,EAAK/N,IAClBX,EAAInM,GAAKyL,GAAIoP,EAAK1O,IACxB,MAAO,CACLU,EAAGrB,GAAIkP,GAAG7N,EAAIkO,GAAK/a,GAAKyL,GAAIqP,EAAKjO,IAAMA,KACvCC,EAAGtB,GAAIkP,GAAG5N,EAAIiO,GAAK/a,GAAKyL,GAAIqP,EAAKhO,IAAMA,KACvCX,EAAGX,GAAIkP,GAAGvO,EAAI4O,GAAK/a,GAAKyL,GAAIqP,EAAK3O,IAAMA,KACvCD,EAAG2O,EAAK3O,EAAI6O,GAAKD,EAAK5O,EAAI2O,EAAK3O,GAEnC,CAEA,SAAS8O,GAAO/P,EAAG8C,EAAGkN,GACpB,GAAIhQ,EAAG,CACL,IAAIiQ,EAAMjN,GAAQhD,GAClBiQ,EAAInN,GAAKvF,KAAK6C,IAAI,EAAG7C,KAAK8C,IAAI4P,EAAInN,GAAKmN,EAAInN,GAAKkN,EAAa,IAANlN,EAAU,IAAM,IACvEmN,EAAM7M,GAAQ6M,GACdjQ,EAAE4B,EAAIqO,EAAI,GACVjQ,EAAE6B,EAAIoO,EAAI,GACVjQ,EAAEkB,EAAI+O,EAAI,EACZ,CACF,CACA,SAASC,GAAMlQ,EAAGmQ,GAChB,OAAOnQ,EAAI1D,OAAO8T,OAAOD,GAAS,CAAC,EAAGnQ,GAAKA,CAC7C,CACA,SAASqQ,GAAWC,GAClB,IAAItQ,EAAI,CAAC4B,EAAG,EAAGC,EAAG,EAAGX,EAAG,EAAGD,EAAG,KAY9B,OAXI5M,MAAM6O,QAAQoN,GACZA,EAAMtb,QAAU,IAClBgL,EAAI,CAAC4B,EAAG0O,EAAM,GAAIzO,EAAGyO,EAAM,GAAIpP,EAAGoP,EAAM,GAAIrP,EAAG,KAC3CqP,EAAMtb,OAAS,IACjBgL,EAAEiB,EAAIV,GAAI+P,EAAM,OAIpBtQ,EAAIkQ,GAAMI,EAAO,CAAC1O,EAAG,EAAGC,EAAG,EAAGX,EAAG,EAAGD,EAAG,IACvCjB,EAAEiB,EAAIV,GAAIP,EAAEiB,IAEPjB,CACT,CACA,SAASuQ,GAAcxO,GACrB,MAAsB,MAAlBA,EAAIyO,OAAO,GACNjB,GAASxN,GAEXyB,GAASzB,EAClB,CACA,MAAM0O,GACJC,WAAAA,CAAYJ,GACV,GAAIA,aAAiBG,GACnB,OAAOH,EAET,MAAM1iB,SAAc0iB,EACpB,IAAItQ,EACS,WAATpS,EACFoS,EAAIqQ,GAAWC,GACG,WAAT1iB,IACToS,EAAI8B,GAASwO,IAAUnB,GAAUmB,IAAUC,GAAcD,IAE3DhiB,KAAKqiB,KAAO3Q,EACZ1R,KAAKsiB,SAAW5Q,CAClB,CACA,SAAI6Q,GACF,OAAOviB,KAAKsiB,MACd,CACA,OAAI/N,GACF,IAAI7C,EAAIkQ,GAAM5hB,KAAKqiB,MAInB,OAHI3Q,IACFA,EAAEiB,EAAIT,GAAIR,EAAEiB,IAEPjB,CACT,CACA,OAAI6C,CAAIiO,GACNxiB,KAAKqiB,KAAON,GAAWS,EACzB,CACAtB,SAAAA,GACE,OAAOlhB,KAAKsiB,OAASpB,GAAUlhB,KAAKqiB,WAAQvO,CAC9C,CACAD,SAAAA,GACE,OAAO7T,KAAKsiB,OAASzO,GAAU7T,KAAKqiB,WAAQvO,CAC9C,CACA2B,SAAAA,GACE,OAAOzV,KAAKsiB,OAAS7M,GAAUzV,KAAKqiB,WAAQvO,CAC9C,CACA2O,GAAAA,CAAIC,EAAOC,GACT,GAAID,EAAO,CACT,MAAME,EAAK5iB,KAAKuU,IACVsO,EAAKH,EAAMnO,IACjB,IAAIuO,EACJ,MAAMC,EAAIJ,IAAWG,EAAK,GAAMH,EAC1BrO,EAAI,EAAIyO,EAAI,EACZpQ,EAAIiQ,EAAGjQ,EAAIkQ,EAAGlQ,EACdqQ,IAAO1O,EAAI3B,KAAO,EAAI2B,GAAKA,EAAI3B,IAAM,EAAI2B,EAAI3B,IAAM,GAAK,EAC9DmQ,EAAK,EAAIE,EACTJ,EAAGtP,EAAI,IAAO0P,EAAKJ,EAAGtP,EAAIwP,EAAKD,EAAGvP,EAAI,GACtCsP,EAAGrP,EAAI,IAAOyP,EAAKJ,EAAGrP,EAAIuP,EAAKD,EAAGtP,EAAI,GACtCqP,EAAGhQ,EAAI,IAAOoQ,EAAKJ,EAAGhQ,EAAIkQ,EAAKD,EAAGjQ,EAAI,GACtCgQ,EAAGjQ,EAAIoQ,EAAIH,EAAGjQ,GAAK,EAAIoQ,GAAKF,EAAGlQ,EAC/B3S,KAAKuU,IAAMqO,CACb,CACA,OAAO5iB,IACT,CACAqhB,WAAAA,CAAYqB,EAAOlB,GAIjB,OAHIkB,IACF1iB,KAAKqiB,KAAOhB,GAAYrhB,KAAKqiB,KAAMK,EAAML,KAAMb,IAE1CxhB,IACT,CACA4hB,KAAAA,GACE,OAAO,IAAIO,GAAMniB,KAAKuU,IACxB,CACAX,KAAAA,CAAMjB,GAEJ,OADA3S,KAAKqiB,KAAK1P,EAAIV,GAAIU,GACX3S,IACT,CACAijB,OAAAA,CAAQvB,GACN,MAAMnN,EAAMvU,KAAKqiB,KAEjB,OADA9N,EAAI5B,GAAK,EAAI+O,EACN1hB,IACT,CACAkjB,SAAAA,GACE,MAAM3O,EAAMvU,KAAKqiB,KACXc,EAAMjU,GAAc,GAARqF,EAAIjB,EAAkB,IAARiB,EAAIhB,EAAmB,IAARgB,EAAI3B,GAEnD,OADA2B,EAAIjB,EAAIiB,EAAIhB,EAAIgB,EAAI3B,EAAIuQ,EACjBnjB,IACT,CACAojB,OAAAA,CAAQ1B,GACN,MAAMnN,EAAMvU,KAAKqiB,KAEjB,OADA9N,EAAI5B,GAAK,EAAI+O,EACN1hB,IACT,CACAqjB,MAAAA,GACE,MAAM3R,EAAI1R,KAAKqiB,KAIf,OAHA3Q,EAAE4B,EAAI,IAAM5B,EAAE4B,EACd5B,EAAE6B,EAAI,IAAM7B,EAAE6B,EACd7B,EAAEkB,EAAI,IAAMlB,EAAEkB,EACP5S,IACT,CACAsjB,OAAAA,CAAQ5B,GAEN,OADAD,GAAOzhB,KAAKqiB,KAAM,EAAGX,GACd1hB,IACT,CACAujB,MAAAA,CAAO7B,GAEL,OADAD,GAAOzhB,KAAKqiB,KAAM,GAAIX,GACf1hB,IACT,CACAwjB,QAAAA,CAAS9B,GAEP,OADAD,GAAOzhB,KAAKqiB,KAAM,EAAGX,GACd1hB,IACT,CACAyjB,UAAAA,CAAW/B,GAET,OADAD,GAAOzhB,KAAKqiB,KAAM,GAAIX,GACf1hB,IACT,CACAuV,MAAAA,CAAOC,GAEL,OADAD,GAAOvV,KAAKqiB,KAAM7M,GACXxV,IACT;;;;;;;AC3jBK,SAAS0jB,KACJ,CAML,MAAMC,GAAO,MAClB,IAAI5S,EAAK,EACT,MAAO,IAAMA,GACd,EAHmB,GAUb,SAAS6S,GAAc9e,GAC5B,OAAiB,OAAVA,QAA4BgP,IAAVhP,CAC3B,CAOO,SAAS8P,GAAqB9P,GACnC,GAAIiB,MAAM6O,SAAW7O,MAAM6O,QAAQ9P,GACjC,OAAO,EAET,MAAMxF,EAAO0O,OAAO6V,UAAUC,SAASC,KAAKjf,GAC5C,MAAyB,YAArBxF,EAAK0kB,MAAM,EAAG,IAAuC,WAAnB1kB,EAAK0kB,OAAO,EAIpD,CAOO,SAASC,GAASnf,GACvB,OAAiB,OAAVA,GAA4D,oBAA1CkJ,OAAO6V,UAAUC,SAASC,KAAKjf,EAC1D,CAMA,SAASof,GAAepf,GACtB,OAAyB,kBAAVA,GAAsBA,aAAiBU,SAAW2e,UAAUrf,EAC7E,CAUO,SAASsf,GAAgBtf,EAAgBuf,GAC9C,OAAOH,GAAepf,GAASA,EAAQuf,CACzC,CAOO,SAASC,GAAkBxf,EAAsBuf,GACtD,MAAwB,qBAAVvf,EAAwBuf,EAAevf,CACvD,C,MAEayf,GAAeA,CAACzf,EAAwB0f,IAClC,kBAAV1f,GAAsBA,EAAM2f,SAAS,KAC1CC,WAAW5f,GAAS,KACjBA,EAAQ0f,EAEFG,GAAcA,CAAC7f,EAAwB0f,IACjC,kBAAV1f,GAAsBA,EAAM2f,SAAS,KAC1CC,WAAW5f,GAAS,IAAM0f,GACvB1f,EASA,SAAS8f,GACdC,EACA3lB,EACA4lB,GAEA,GAAID,GAAyB,oBAAZA,EAAGd,KAClB,OAAOc,EAAGE,MAAMD,EAAS5lB,EAE7B,CAuBO,SAAS8lB,GACdC,EACAJ,EACAC,EACAI,GAEA,IAAI1Q,EAAWb,EAAa1F,EAC5B,GAAI2G,GAAQqQ,GAEV,GADAtR,EAAMsR,EAASve,OACXwe,EACF,IAAK1Q,EAAIb,EAAM,EAAGa,GAAK,EAAGA,IACxBqQ,EAAGd,KAAKe,EAASG,EAASzQ,GAAIA,QAGhC,IAAKA,EAAI,EAAGA,EAAIb,EAAKa,IACnBqQ,EAAGd,KAAKe,EAASG,EAASzQ,GAAIA,QAG7B,GAAIyP,GAASgB,GAGlB,IAFAhX,EAAOD,OAAOC,KAAKgX,GACnBtR,EAAM1F,EAAKvH,OACN8N,EAAI,EAAGA,EAAIb,EAAKa,IACnBqQ,EAAGd,KAAKe,EAASG,EAAShX,EAAKuG,IAAKvG,EAAKuG,GAG/C,CAQO,SAAS2Q,GAAeC,EAAuBC,GACpD,IAAI7Q,EAAW8Q,EAAcC,EAAqBC,EAElD,IAAKJ,IAAOC,GAAMD,EAAG1e,SAAW2e,EAAG3e,OACjC,OAAO,EAGT,IAAK8N,EAAI,EAAG8Q,EAAOF,EAAG1e,OAAQ8N,EAAI8Q,IAAQ9Q,EAIxC,GAHA+Q,EAAKH,EAAG5Q,GACRgR,EAAKH,EAAG7Q,GAEJ+Q,EAAGE,eAAiBD,EAAGC,cAAgBF,EAAG7mB,QAAU8mB,EAAG9mB,MACzD,OAAO,EAIX,OAAO,CACT,CAMO,SAASkjB,GAAS8D,GACvB,GAAI9Q,GAAQ8Q,GACV,OAAOA,EAAO7Q,IAAI+M,IAGpB,GAAIqC,GAASyB,GAAS,CACpB,MAAMC,EAAS3X,OAAO4X,OAAO,MACvB3X,EAAOD,OAAOC,KAAKyX,GACnBG,EAAO5X,EAAKvH,OAClB,IAAIyN,EAAI,EAER,KAAOA,EAAI0R,IAAQ1R,EACjBwR,EAAO1X,EAAKkG,IAAMyN,GAAM8D,EAAOzX,EAAKkG,KAGtC,OAAOwR,C,CAGT,OAAOD,CACT,CAEA,SAASI,GAAWrnB,GAClB,OAAmE,IAA5D,CAAC,YAAa,YAAa,eAAesnB,QAAQtnB,EAC3D,CAOO,SAASunB,GAAQvnB,EAAaknB,EAAmBD,EAAmB5X,GACzE,IAAKgY,GAAWrnB,GACd,OAGF,MAAMwnB,EAAON,EAAOlnB,GACdynB,EAAOR,EAAOjnB,GAEhBwlB,GAASgC,IAAShC,GAASiC,GAE7BC,GAAMF,EAAMC,EAAMpY,GAElB6X,EAAOlnB,GAAOmjB,GAAMsE,EAExB,CA0BO,SAASC,GAASR,EAAWD,EAAqB5X,GACvD,MAAMsY,EAAUxR,GAAQ8Q,GAAUA,EAAS,CAACA,GACtCJ,EAAOc,EAAQ1f,OAErB,IAAKud,GAAS0B,GACZ,OAAOA,EAGT7X,EAAUA,GAAW,CAAC,EACtB,MAAMuY,EAASvY,EAAQuY,QAAUL,GACjC,IAAI3W,EAEJ,IAAK,IAAImF,EAAI,EAAGA,EAAI8Q,IAAQ9Q,EAAG,CAE7B,GADAnF,EAAU+W,EAAQ5R,IACbyP,GAAS5U,GACZ,SAGF,MAAMpB,EAAOD,OAAOC,KAAKoB,GACzB,IAAK,IAAI8E,EAAI,EAAG0R,EAAO5X,EAAKvH,OAAQyN,EAAI0R,IAAQ1R,EAC9CkS,EAAOpY,EAAKkG,GAAIwR,EAAQtW,EAASvB,EAErC,CAEA,OAAO6X,CACT,CAgBO,SAASW,GAAWX,EAAWD,GAEpC,OAAOS,GAASR,EAAQD,EAAQ,CAACW,OAAQE,IAC3C,CAMO,SAASA,GAAU9nB,EAAaknB,EAAmBD,GACxD,IAAKI,GAAWrnB,GACd,OAGF,MAAMwnB,EAAON,EAAOlnB,GACdynB,EAAOR,EAAOjnB,GAEhBwlB,GAASgC,IAAShC,GAASiC,GAC7BI,GAAQL,EAAMC,GACJlY,OAAO6V,UAAU2C,eAAezC,KAAK4B,EAAQlnB,KACvDknB,EAAOlnB,GAAOmjB,GAAMsE,GAExB,CAaA,MAAMO,GAAe,CAEnB,GAAI/U,GAAKA,EAETgE,EAAGgR,GAAKA,EAAEhR,EACViR,EAAGD,GAAKA,EAAEC,GAML,SAASC,GAAUnoB,GACxB,MAAMooB,EAAQpoB,EAAIqoB,MAAM,KAClB7Y,EAAiB,GACvB,IAAI0T,EAAM,GACV,IAAK,MAAMoF,KAAQF,EACjBlF,GAAOoF,EACHpF,EAAI8C,SAAS,MACf9C,EAAMA,EAAIqC,MAAM,GAAI,GAAK,KAEzB/V,EAAK+Y,KAAKrF,GACVA,EAAM,IAGV,OAAO1T,CACT,CAEA,SAASgZ,GAAgBxoB,GACvB,MAAMwP,EAAO2Y,GAAUnoB,GACvB,OAAO+jB,IACL,IAAK,MAAMrO,KAAKlG,EAAM,CACpB,GAAU,KAANkG,EAGF,MAEFqO,EAAMA,GAAOA,EAAIrO,EACnB,CACA,OAAOqO,EAEX,CAEO,SAAS0E,GAAiB1E,EAAgB/jB,GAC/C,MAAM0oB,EAAWV,GAAahoB,KAASgoB,GAAahoB,GAAOwoB,GAAgBxoB,IAC3E,OAAO0oB,EAAS3E,EAClB,CAKO,SAAS4E,GAAY3T,GAC1B,OAAOA,EAAIyO,OAAO,GAAGmF,cAAgB5T,EAAIuQ,MAAM,EACjD,C,MAGasD,GAAWxiB,GAAoC,qBAAVA,EAErCyiB,GAAcziB,GAAsE,oBAAVA,EAG1E0iB,GAAYA,CAAI7U,EAAWC,KACtC,GAAID,EAAEtF,OAASuF,EAAEvF,KACf,OAAO,EAGT,IAAK,MAAM7O,KAAQmU,EACjB,IAAKC,EAAE6U,IAAIjpB,GACT,OAAO,EAIX,OAAO,GAOF,SAASkpB,GAAc3U,GAC5B,MAAkB,YAAXA,EAAEzT,MAAiC,UAAXyT,EAAEzT,MAA+B,gBAAXyT,EAAEzT,IACzD,CCvZO,MAAMqoB,GAAK1Y,KAAK0Y,GACVC,GAAM,EAAID,GACVE,GAAQD,GAAMD,GACdG,GAAWtiB,OAAOuiB,kBAClBC,GAAcL,GAAK,IACnBM,GAAUN,GAAK,EACfO,GAAaP,GAAK,EAClBQ,GAAqB,EAALR,GAAS,EAEzBS,GAAQnZ,KAAKmZ,MACbC,GAAOpZ,KAAKoZ,KAElB,SAASC,GAAa5S,EAAWiR,EAAW4B,GACjD,OAAOtZ,KAAKuZ,IAAI9S,EAAIiR,GAAK4B,CAC3B,CAKO,SAASE,GAAQvhB,GACtB,MAAMwhB,EAAezZ,KAAKC,MAAMhI,GAChCA,EAAQohB,GAAaphB,EAAOwhB,EAAcxhB,EAAQ,KAAQwhB,EAAexhB,EACzE,MAAMyhB,EAAY1Z,KAAKmS,IAAI,GAAInS,KAAK2Z,MAAMR,GAAMlhB,KAC1C2hB,EAAW3hB,EAAQyhB,EACnBG,EAAeD,GAAY,EAAI,EAAIA,GAAY,EAAI,EAAIA,GAAY,EAAI,EAAI,GACjF,OAAOC,EAAeH,CACxB,CAMO,SAASI,GAAWjkB,GACzB,MAAMkkB,EAAmB,GACnBC,EAAOha,KAAKga,KAAKnkB,GACvB,IAAI0P,EAEJ,IAAKA,EAAI,EAAGA,EAAIyU,EAAMzU,IAChB1P,EAAQ0P,IAAM,IAChBwU,EAAOhC,KAAKxS,GACZwU,EAAOhC,KAAKliB,EAAQ0P,IAQxB,OALIyU,KAAiB,EAAPA,IACZD,EAAOhC,KAAKiC,GAGdD,EAAOE,KAAK,CAACvW,EAAGC,IAAMD,EAAIC,GAAGuW,MACtBH,CACT,CAKA,SAASI,GAAelV,GACtB,MAAoB,kBAANA,GAAgC,kBAANA,GAAwB,OAANA,KAAgBmV,OAAOC,eAAepV,GAAK,aAAcA,GAAK,YAAaA,EACvI,CAEO,SAASqV,GAASrV,GACvB,OAAQkV,GAAelV,KAAOsV,MAAM9E,WAAWxQ,KAAiBiQ,SAASjQ,EAC3E,CAEO,SAASuV,GAAY/T,EAAW6S,GACrC,MAAMmB,EAAUza,KAAKC,MAAMwG,GAC3B,OAAOgU,EAAYnB,GAAY7S,GAAQgU,EAAUnB,GAAY7S,CAC/D,CAKO,SAASiU,GACdC,EACAjE,EACAkE,GAEA,IAAIrV,EAAW8Q,EAAcxgB,EAE7B,IAAK0P,EAAI,EAAG8Q,EAAOsE,EAAMljB,OAAQ8N,EAAI8Q,EAAM9Q,IACzC1P,EAAQ8kB,EAAMpV,GAAGqV,GACZL,MAAM1kB,KACT6gB,EAAO5T,IAAM9C,KAAK8C,IAAI4T,EAAO5T,IAAKjN,GAClC6gB,EAAO7T,IAAM7C,KAAK6C,IAAI6T,EAAO7T,IAAKhN,GAGxC,CAEO,SAASglB,GAAUC,GACxB,OAAOA,GAAWpC,GAAK,IACzB,CAEO,SAASqC,GAAUC,GACxB,OAAOA,GAAW,IAAMtC,GAC1B,CASO,SAASuC,GAAexU,GAC7B,IAAKwO,GAAexO,GAClB,OAEF,IAAI3C,EAAI,EACJgQ,EAAI,EACR,MAAO9T,KAAKC,MAAMwG,EAAI3C,GAAKA,IAAM2C,EAC/B3C,GAAK,GACLgQ,IAEF,OAAOA,CACT,CAGO,SAASoH,GACdC,EACAC,GAEA,MAAMC,EAAsBD,EAAW3U,EAAI0U,EAAY1U,EACjD6U,EAAsBF,EAAW1D,EAAIyD,EAAYzD,EACjD6D,EAA2Bvb,KAAKga,KAAKqB,EAAsBA,EAAsBC,EAAsBA,GAE7G,IAAIE,EAAQxb,KAAKyb,MAAMH,EAAqBD,GAM5C,OAJIG,GAAU,GAAM9C,KAClB8C,GAAS7C,IAGJ,CACL6C,QACAE,SAAUH,EAEd,CAEO,SAASI,GAAsBC,EAAYC,GAChD,OAAO7b,KAAKga,KAAKha,KAAKmS,IAAI0J,EAAIpV,EAAImV,EAAInV,EAAG,GAAKzG,KAAKmS,IAAI0J,EAAInE,EAAIkE,EAAIlE,EAAG,GACxE,CAMO,SAASoE,GAAWpY,EAAWC,GACpC,OAAQD,EAAIC,EAAIiV,IAASD,GAAMD,EACjC,CAMO,SAASqD,GAAgBrY,GAC9B,OAAQA,EAAIiV,GAAMA,IAAOA,EAC3B,CAKO,SAASqD,GAAcR,EAAenkB,EAAe4kB,EAAaC,GACvE,MAAMxY,EAAIqY,GAAgBP,GACpBxW,EAAI+W,GAAgB1kB,GACpByM,EAAIiY,GAAgBE,GACpBE,EAAeJ,GAAgB/W,EAAItB,GACnC0Y,EAAaL,GAAgBjY,EAAIJ,GACjC2Y,EAAeN,GAAgBrY,EAAIsB,GACnCsX,EAAaP,GAAgBrY,EAAII,GACvC,OAAOJ,IAAMsB,GAAKtB,IAAMI,GAAMoY,GAAyBlX,IAAMlB,GACvDqY,EAAeC,GAAcC,EAAeC,CACpD,CASO,SAASC,GAAY1mB,EAAeiN,EAAaD,GACtD,OAAO7C,KAAK6C,IAAIC,EAAK9C,KAAK8C,IAAID,EAAKhN,GACrC,CAMO,SAAS2mB,GAAY3mB,GAC1B,OAAO0mB,GAAY1mB,GAAQ,MAAO,MACpC,CASO,SAAS4mB,GAAW5mB,EAAewB,EAAe4kB,EAAa3C,EAAU,MAC9E,OAAOzjB,GAASmK,KAAK8C,IAAIzL,EAAO4kB,GAAO3C,GAAWzjB,GAASmK,KAAK6C,IAAIxL,EAAO4kB,GAAO3C,CACpF,CC3LO,SAASoD,GACdC,EACA9mB,EACA+mB,GAEAA,EAAMA,GAAA,CAASntB,GAAUktB,EAAMltB,GAASoG,GACxC,IAEIgnB,EAFAC,EAAKH,EAAMllB,OAAS,EACpBslB,EAAK,EAGT,MAAOD,EAAKC,EAAK,EACfF,EAAOE,EAAKD,GAAO,EACfF,EAAIC,GACNE,EAAKF,EAELC,EAAKD,EAIT,MAAO,CAACE,KAAID,KACd,CAUO,MAAME,GAAeA,CAC1BL,EACAntB,EACAqG,EACAonB,IAEAP,GAAQC,EAAO9mB,EAAOonB,EAClBxtB,IACA,MAAMytB,EAAKP,EAAMltB,GAAOD,GACxB,OAAO0tB,EAAKrnB,GAASqnB,IAAOrnB,GAAS8mB,EAAMltB,EAAQ,GAAGD,KAASqG,GAE/DpG,GAASktB,EAAMltB,GAAOD,GAAOqG,GAStBsnB,GAAgBA,CAC3BR,EACAntB,EACAqG,IAEA6mB,GAAQC,EAAO9mB,EAAOpG,GAASktB,EAAMltB,GAAOD,IAAQqG,GAS/C,SAASunB,GAAeC,EAAkBva,EAAaD,GAC5D,IAAIxL,EAAQ,EACR4kB,EAAMoB,EAAO5lB,OAEjB,MAAOJ,EAAQ4kB,GAAOoB,EAAOhmB,GAASyL,EACpCzL,IAEF,MAAO4kB,EAAM5kB,GAASgmB,EAAOpB,EAAM,GAAKpZ,EACtCoZ,IAGF,OAAO5kB,EAAQ,GAAK4kB,EAAMoB,EAAO5lB,OAC7B4lB,EAAOtI,MAAM1d,EAAO4kB,GACpBoB,CACN,CAEA,MAAMC,GAAc,CAAC,OAAQ,MAAO,QAAS,SAAU,WAgBhD,SAASC,GAAkB5C,EAAO6C,GACnC7C,EAAM8C,SACR9C,EAAM8C,SAASC,UAAU3F,KAAKyF,IAIhCze,OAAO4e,eAAehD,EAAO,WAAY,CACvCiD,cAAc,EACdC,YAAY,EACZhoB,MAAO,CACL6nB,UAAW,CAACF,MAIhBF,GAAYQ,QAAStuB,IACnB,MAAMuuB,EAAS,UAAY5F,GAAY3oB,GACjCwuB,EAAOrD,EAAMnrB,GAEnBuP,OAAO4e,eAAehD,EAAOnrB,EAAK,CAChCouB,cAAc,EACdC,YAAY,EACZhoB,KAAAA,IAAS5F,GACP,MAAMguB,EAAMD,EAAKlI,MAAM/kB,KAAMd,GAQ7B,OANA0qB,EAAM8C,SAASC,UAAUI,QAASI,IACF,oBAAnBA,EAAOH,IAChBG,EAAOH,MAAW9tB,KAIfguB,CACT,MAGN,CAQO,SAASE,GAAoBxD,EAAO6C,GACzC,MAAMY,EAAOzD,EAAM8C,SACnB,IAAKW,EACH,OAGF,MAAMV,EAAYU,EAAKV,UACjBjuB,EAAQiuB,EAAU5G,QAAQ0G,IACjB,IAAX/tB,GACFiuB,EAAUW,OAAO5uB,EAAO,GAGtBiuB,EAAUjmB,OAAS,IAIvB6lB,GAAYQ,QAAStuB,WACZmrB,EAAMnrB,YAGRmrB,EAAM8C,SACf,CAKO,SAASa,GAAgBC,GAC9B,MAAMC,EAAM,IAAIC,IAAOF,GAEvB,OAAIC,EAAIpgB,OAASmgB,EAAM9mB,OACd8mB,EAGFznB,MAAMU,KAAKgnB,EACpB,CClLa,MAAAE,GAAoB,WAC/B,MAAsB,qBAAX7tB,OACF,SAAS8kB,GACd,OAAOA,GACT,EAEK9kB,OAAO8tB,qBAChB,CAPiC,GAa1B,SAASC,GACdhJ,EACAC,GAEA,IAAIgJ,EAAY,GACZC,GAAU,EAEd,OAAO,YAAY7uB,GAEjB4uB,EAAY5uB,EACP6uB,IACHA,GAAU,EACVJ,GAAiB5J,KAAKjkB,OAAQ,KAC5BiuB,GAAU,EACVlJ,EAAGE,MAAMD,EAASgJ,KAGxB,CACF,CAKO,SAASE,GAAmCnJ,EAA8BoJ,GAC/E,IAAIC,EACJ,OAAO,YAAYhvB,GAOjB,OANI+uB,GACFE,aAAaD,GACbA,EAAUE,WAAWvJ,EAAIoJ,EAAO/uB,IAEhC2lB,EAAGE,MAAM/kB,KAAMd,GAEV+uB,CACT,CACF,CAMO,MAAMI,GAAsBC,GAAgD,UAAVA,EAAoB,OAAmB,QAAVA,EAAkB,QAAU,SAMrHC,GAAiBA,CAACD,EAAmChoB,EAAe4kB,IAA0B,UAAVoD,EAAoBhoB,EAAkB,QAAVgoB,EAAkBpD,GAAO5kB,EAAQ4kB,GAAO,EAMxJsD,GAASA,CAACF,EAAoCG,EAAcC,EAAeC,KACtF,MAAMC,EAAQD,EAAM,OAAS,QAC7B,OAAOL,IAAUM,EAAQF,EAAkB,WAAVJ,GAAsBG,EAAOC,GAAS,EAAID,GAOtE,SAASI,GAAiCC,EAAqCC,EAAwBC,GAC5G,MAAMC,EAAaF,EAAOroB,OAE1B,IAAIJ,EAAQ,EACR+H,EAAQ4gB,EAEZ,GAAIH,EAAKI,QAAS,CAChB,MAAM,OAACC,EAAM,OAAEC,EAAA,QAAQC,GAAWP,EAC5BQ,EAAWR,EAAKS,SAAUT,EAAKS,QAAQzhB,QAAUghB,EAAKS,QAAQzhB,QAAQwhB,SAAkB,KACxFE,EAAOL,EAAOK,MACd,IAACzd,EAAG,IAAED,EAAG,WAAE2d,EAAU,WAAEC,GAAcP,EAAOQ,gBAElD,GAAIF,EAAY,CAMd,GALAnpB,EAAQ2I,KAAK8C,IAEXka,GAAaoD,EAASG,EAAMzd,GAAKia,GAEjCgD,EAAqBC,EAAahD,GAAa8C,EAAQS,EAAML,EAAOS,iBAAiB7d,IAAMia,IACzFsD,EAAU,CACZ,MAAMO,EAAuBR,EAC1BrL,MAAM,EAAG1d,EAAQ,GACjB4e,UACA4K,UACCC,IAAUnM,GAAcmM,EAAMX,EAAOI,QACzClpB,GAAS2I,KAAK6C,IAAI,EAAG+d,E,CAEvBvpB,EAAQklB,GAAYllB,EAAO,EAAG2oB,EAAa,E,CAE7C,GAAIS,EAAY,CACd,IAAIxE,EAAMjc,KAAK6C,IAEbma,GAAaoD,EAASF,EAAOK,KAAM1d,GAAK,GAAMia,GAAK,EAEnDiD,EAAqB,EAAI/C,GAAa8C,EAAQS,EAAML,EAAOS,iBAAiB9d,IAAM,GAAMia,GAAK,GAC/F,GAAIuD,EAAU,CACZ,MAAMU,EAAuBX,EAC1BrL,MAAMkH,EAAM,GACZ4E,UACCC,IAAUnM,GAAcmM,EAAMX,EAAOI,QACzCtE,GAAOjc,KAAK6C,IAAI,EAAGke,E,CAErB3hB,EAAQmd,GAAYN,EAAK5kB,EAAO2oB,GAAc3oB,C,MAE9C+H,EAAQ4gB,EAAa3oB,C,CAIzB,MAAO,CAACA,QAAO+H,QACjB,CAQO,SAAS4hB,GAAoBnB,GAClC,MAAM,OAACoB,EAAM,OAAEC,EAAA,aAAQC,GAAgBtB,EACjCuB,EAAY,CAChBC,KAAMJ,EAAOne,IACbwe,KAAML,EAAOpe,IACb0e,KAAML,EAAOpe,IACb0e,KAAMN,EAAOre,KAEf,IAAKse,EAEH,OADAtB,EAAKsB,aAAeC,GACb,EAET,MAAMK,EAAUN,EAAaE,OAASJ,EAAOne,KAC1Cqe,EAAaG,OAASL,EAAOpe,KAC7Bse,EAAaI,OAASL,EAAOpe,KAC7Bqe,EAAaK,OAASN,EAAOre,IAGhC,OADA9D,OAAO8T,OAAOsO,EAAcC,GACrBK,CACT,CChKA,MAAMC,GAAUnP,GAAoB,IAANA,GAAiB,IAANA,EACnCoP,GAAYA,CAACpP,EAAWvN,EAAW8O,KAAgB9T,KAAKmS,IAAI,EAAG,IAAMI,GAAK,IAAMvS,KAAK4hB,KAAKrP,EAAIvN,GAAK2T,GAAM7E,GACzG+N,GAAaA,CAACtP,EAAWvN,EAAW8O,IAAc9T,KAAKmS,IAAI,GAAI,GAAKI,GAAKvS,KAAK4hB,KAAKrP,EAAIvN,GAAK2T,GAAM7E,GAAK,EAOvGgO,GAAU,CACdC,OAASxP,GAAcA,EAEvByP,WAAazP,GAAcA,EAAIA,EAE/B0P,YAAc1P,IAAeA,GAAKA,EAAI,GAEtC2P,cAAgB3P,IAAgBA,GAAK,IAAO,EACxC,GAAMA,EAAIA,GACT,MAAUA,GAAMA,EAAI,GAAK,GAE9B4P,YAAc5P,GAAcA,EAAIA,EAAIA,EAEpC6P,aAAe7P,IAAeA,GAAK,GAAKA,EAAIA,EAAI,EAEhD8P,eAAiB9P,IAAgBA,GAAK,IAAO,EACzC,GAAMA,EAAIA,EAAIA,EACd,KAAQA,GAAK,GAAKA,EAAIA,EAAI,GAE9B+P,YAAc/P,GAAcA,EAAIA,EAAIA,EAAIA,EAExCgQ,aAAehQ,MAAiBA,GAAK,GAAKA,EAAIA,EAAIA,EAAI,GAEtDiQ,eAAiBjQ,IAAgBA,GAAK,IAAO,EACzC,GAAMA,EAAIA,EAAIA,EAAIA,GACjB,KAAQA,GAAK,GAAKA,EAAIA,EAAIA,EAAI,GAEnCkQ,YAAclQ,GAAcA,EAAIA,EAAIA,EAAIA,EAAIA,EAE5CmQ,aAAenQ,IAAeA,GAAK,GAAKA,EAAIA,EAAIA,EAAIA,EAAI,EAExDoQ,eAAiBpQ,IAAgBA,GAAK,IAAO,EACzC,GAAMA,EAAIA,EAAIA,EAAIA,EAAIA,EACtB,KAAQA,GAAK,GAAKA,EAAIA,EAAIA,EAAIA,EAAI,GAEtCqQ,WAAarQ,GAAuC,EAAxBvS,KAAK6iB,IAAItQ,EAAIyG,IAEzC8J,YAAcvQ,GAAcvS,KAAK4hB,IAAIrP,EAAIyG,IAEzC+J,cAAgBxQ,IAAe,IAAOvS,KAAK6iB,IAAInK,GAAKnG,GAAK,GAEzDyQ,WAAazQ,GAAqB,IAAPA,EAAY,EAAIvS,KAAKmS,IAAI,EAAG,IAAMI,EAAI,IAEjE0Q,YAAc1Q,GAAqB,IAAPA,EAAY,EAA4B,EAAvBvS,KAAKmS,IAAI,GAAI,GAAKI,GAE/D2Q,cAAgB3Q,GAAcmP,GAAOnP,GAAKA,EAAIA,EAAI,GAC9C,GAAMvS,KAAKmS,IAAI,EAAG,IAAU,EAAJI,EAAQ,IAChC,IAAyC,EAAjCvS,KAAKmS,IAAI,GAAI,IAAU,EAAJI,EAAQ,KAEvC4Q,WAAa5Q,GAAcA,GAAM,EAAKA,IAAMvS,KAAKga,KAAK,EAAIzH,EAAIA,GAAK,GAEnE6Q,YAAc7Q,GAAcvS,KAAKga,KAAK,GAAKzH,GAAK,GAAKA,GAErD8Q,cAAgB9Q,IAAgBA,GAAK,IAAO,GACvC,IAAOvS,KAAKga,KAAK,EAAIzH,EAAIA,GAAK,GAC/B,IAAOvS,KAAKga,KAAK,GAAKzH,GAAK,GAAKA,GAAK,GAEzC+Q,cAAgB/Q,GAAcmP,GAAOnP,GAAKA,EAAIoP,GAAUpP,EAAG,KAAO,IAElEgR,eAAiBhR,GAAcmP,GAAOnP,GAAKA,EAAIsP,GAAWtP,EAAG,KAAO,IAEpEiR,gBAAAA,CAAiBjR,GACf,MAAMvN,EAAI,MACJ8O,EAAI,IACV,OAAO4N,GAAOnP,GAAKA,EACjBA,EAAI,GACA,GAAMoP,GAAc,EAAJpP,EAAOvN,EAAG8O,GAC1B,GAAM,GAAM+N,GAAe,EAAJtP,EAAQ,EAAGvN,EAAG8O,EAC7C,EAEA2P,UAAAA,CAAWlR,GACT,MAAMvN,EAAI,QACV,OAAOuN,EAAIA,IAAMvN,EAAI,GAAKuN,EAAIvN,EAChC,EAEA0e,WAAAA,CAAYnR,GACV,MAAMvN,EAAI,QACV,OAAQuN,GAAK,GAAKA,IAAMvN,EAAI,GAAKuN,EAAIvN,GAAK,CAC5C,EAEA2e,aAAAA,CAAcpR,GACZ,IAAIvN,EAAI,QACR,OAAKuN,GAAK,IAAO,EACDA,EAAIA,IAAuB,GAAhBvN,GAAM,QAAeuN,EAAIvN,GAA3C,GAEF,KAAQuN,GAAK,GAAKA,IAAuB,GAAhBvN,GAAM,QAAeuN,EAAIvN,GAAK,EAChE,EAEA4e,aAAerR,GAAc,EAAIuP,GAAQ+B,cAAc,EAAItR,GAE3DsR,aAAAA,CAActR,GACZ,MAAMrM,EAAI,OACJrC,EAAI,KACV,OAAI0O,EAAK,EAAI1O,EACJqC,EAAIqM,EAAIA,EAEbA,EAAK,EAAI1O,EACJqC,GAAKqM,GAAM,IAAM1O,GAAM0O,EAAI,IAEhCA,EAAK,IAAM1O,EACNqC,GAAKqM,GAAM,KAAO1O,GAAM0O,EAAI,MAE9BrM,GAAKqM,GAAM,MAAQ1O,GAAM0O,EAAI,OACtC,EAEAuR,gBAAkBvR,GAAeA,EAAI,GACH,GAA9BuP,GAAQ8B,aAAiB,EAAJrR,GACc,GAAnCuP,GAAQ+B,cAAkB,EAAJtR,EAAQ,GAAW,ICpHxC,SAASwR,GAAoBluB,GAClC,GAAIA,GAA0B,kBAAVA,EAAoB,CACtC,MAAMxF,EAAOwF,EAAMgf,WACnB,MAAgB,2BAATxkB,GAA8C,4BAATA,C,CAG9C,OAAO,CACT,CAWO,SAASojB,GAAM5d,GACpB,OAAOkuB,GAAoBluB,GAASA,EAAQ,IAAIqd,GAAMrd,EACxD,CAKO,SAASmuB,GAAcnuB,GAC5B,OAAOkuB,GAAoBluB,GACvBA,EACA,IAAIqd,GAAMrd,GAAO0e,SAAS,IAAKD,OAAO,IAAK1P,WACjD,CC/BA,MAAMqf,GAAU,CAAC,IAAK,IAAK,cAAe,SAAU,WAC9CC,GAAS,CAAC,QAAS,cAAe,mBAEjC,SAASC,GAAwBC,GACtCA,EAAS5F,IAAI,YAAa,CACxBQ,WAAOna,EACPwf,SAAU,IACVC,OAAQ,eACR1O,QAAI/Q,EACJrN,UAAMqN,EACNzC,UAAMyC,EACNqN,QAAIrN,EACJxU,UAAMwU,IAGRuf,EAASG,SAAS,YAAa,CAC7BC,WAAW,EACXC,YAAY,EACZC,YAAcv0B,GAAkB,eAATA,GAAkC,eAATA,GAAkC,OAATA,IAG3Ei0B,EAAS5F,IAAI,aAAc,CACzB0F,OAAQ,CACN7zB,KAAM,QACNs0B,WAAYT,IAEdD,QAAS,CACP5zB,KAAM,SACNs0B,WAAYV,MAIhBG,EAASG,SAAS,aAAc,CAC9BC,UAAW,cAGbJ,EAAS5F,IAAI,cAAe,CAC1BoG,OAAQ,CACNC,UAAW,CACTR,SAAU,MAGdS,OAAQ,CACND,UAAW,CACTR,SAAU,IAGdU,KAAM,CACJC,WAAY,CACVd,OAAQ,CACN1sB,KAAM,eAERytB,QAAS,CACP50B,KAAM,UACNg0B,SAAU,KAIhBa,KAAM,CACJF,WAAY,CACVd,OAAQ,CACNhS,GAAI,eAEN+S,QAAS,CACP50B,KAAM,UACNi0B,OAAQ,SACR1O,GAAInT,GAAS,EAAJA,MAKnB,CCvEO,SAAS0iB,GAAqBf,GACnCA,EAAS5F,IAAI,SAAU,CACrB4G,aAAa,EACbC,QAAS,CACPC,IAAK,EACL7F,MAAO,EACP8F,OAAQ,EACR/F,KAAM,IAGZ,CCTA,MAAMgG,GAAY,IAAIC,IAEtB,SAASC,GAAgBC,EAAgB9mB,GACvCA,EAAUA,GAAW,CAAC,EACtB,MAAM+mB,EAAWD,EAASE,KAAKC,UAAUjnB,GACzC,IAAIknB,EAAYP,GAAUQ,IAAIJ,GAK9B,OAJKG,IACHA,EAAY,IAAIE,KAAKC,aAAaP,EAAQ9mB,GAC1C2mB,GAAUhH,IAAIoH,EAAUG,IAEnBA,CACT,CAEO,SAASI,GAAaC,EAAaT,EAAgB9mB,GACxD,OAAO6mB,GAAgBC,EAAQ9mB,GAASwnB,OAAOD,EACjD,CCRA,MAAME,GAAa,CAOjBjJ,MAAAA,CAAOxnB,GACL,OAAO8P,GAAQ9P,GAAkCA,EAAS,GAAKA,CACjE,EAUA0wB,OAAAA,CAAQC,EAAW/2B,EAAOg3B,GACxB,GAAkB,IAAdD,EACF,MAAO,IAGT,MAAMb,EAAS50B,KAAK21B,MAAM7nB,QAAQ8mB,OAClC,IAAIgB,EACAC,EAAQJ,EAEZ,GAAIC,EAAMhvB,OAAS,EAAG,CAEpB,MAAMovB,EAAU7mB,KAAK6C,IAAI7C,KAAKuZ,IAAIkN,EAAM,GAAG5wB,OAAQmK,KAAKuZ,IAAIkN,EAAMA,EAAMhvB,OAAS,GAAG5B,SAChFgxB,EAAU,MAAQA,EAAU,QAC9BF,EAAW,cAGbC,EAAQE,GAAeN,EAAWC,E,CAGpC,MAAMM,EAAW5N,GAAMnZ,KAAKuZ,IAAIqN,IAO1BI,EAAazM,MAAMwM,GAAY,EAAI/mB,KAAK6C,IAAI7C,KAAK8C,KAAK,EAAI9C,KAAK2Z,MAAMoN,GAAW,IAAK,GAErFloB,EAAU,CAAC8nB,WAAUM,sBAAuBD,EAAYE,sBAAuBF,GAGrF,OAFAjoB,OAAO8T,OAAOhU,EAAS9N,KAAK8N,QAAQ4nB,MAAMJ,QAEnCF,GAAaK,EAAWb,EAAQ9mB,EACzC,EAWAsoB,WAAAA,CAAYX,EAAW/2B,EAAOg3B,GAC5B,GAAkB,IAAdD,EACF,MAAO,IAET,MAAMY,EAASX,EAAMh3B,GAAO43B,aAAgBb,EAAaxmB,KAAKmS,IAAI,GAAInS,KAAK2Z,MAAMR,GAAMqN,KACvF,MAAI,CAAC,EAAG,EAAG,EAAG,EAAG,GAAI,IAAIc,SAASF,IAAW33B,EAAQ,GAAMg3B,EAAMhvB,OACxD6uB,GAAWC,QAAQzR,KAAK/jB,KAAMy1B,EAAW/2B,EAAOg3B,GAElD,EACT,GAKF,SAASK,GAAeN,EAAWC,GAGjC,IAAIG,EAAQH,EAAMhvB,OAAS,EAAIgvB,EAAM,GAAG5wB,MAAQ4wB,EAAM,GAAG5wB,MAAQ4wB,EAAM,GAAG5wB,MAAQ4wB,EAAM,GAAG5wB,MAO3F,OAJImK,KAAKuZ,IAAIqN,IAAU,GAAKJ,IAAcxmB,KAAK2Z,MAAM6M,KAEnDI,EAAQJ,EAAYxmB,KAAK2Z,MAAM6M,IAE1BI,CACT,CAMA,IAAAW,GAAe,CAACjB,eCnGT,SAASkB,GAAmBpD,GACjCA,EAAS5F,IAAI,QAAS,CACpBiJ,SAAS,EACTC,QAAQ,EACRzR,SAAS,EACT0R,aAAa,EASbC,OAAQ,QAERC,MAAM,EAMNC,MAAO,EAGPC,KAAM,CACJN,SAAS,EACTO,UAAW,EACXC,iBAAiB,EACjBC,WAAW,EACXC,WAAY,EACZC,UAAWA,CAACz5B,EAAMkQ,IAAYA,EAAQmpB,UACtCK,UAAWA,CAAC15B,EAAMkQ,IAAYA,EAAQ4U,MACtCiU,QAAQ,GAGVY,OAAQ,CACNb,SAAS,EACTc,KAAM,GACNC,WAAY,EACZx3B,MAAO,GAITuN,MAAO,CAELkpB,SAAS,EAGTgB,KAAM,GAGNpD,QAAS,CACPC,IAAK,EACLC,OAAQ,IAKZkB,MAAO,CACLiC,YAAa,EACbC,YAAa,GACbC,QAAQ,EACRC,gBAAiB,EACjBC,gBAAiB,GACjBzD,QAAS,EACToC,SAAS,EACTsB,UAAU,EACVC,gBAAiB,EACjBC,YAAa,EAEbtT,SAAU4R,GAAMjB,WAAWjJ,OAC3B6L,MAAO,CAAC,EACRC,MAAO,CAAC,EACR9J,MAAO,SACP+J,WAAY,OAEZC,mBAAmB,EACnBC,cAAe,4BACfC,gBAAiB,KAIrBnF,EAASoF,MAAM,cAAe,QAAS,GAAI,SAC3CpF,EAASoF,MAAM,aAAc,QAAS,GAAI,eAC1CpF,EAASoF,MAAM,eAAgB,QAAS,GAAI,eAC5CpF,EAASoF,MAAM,cAAe,QAAS,GAAI,SAE3CpF,EAASG,SAAS,QAAS,CACzBC,WAAW,EACXE,YAAcv0B,IAAUA,EAAKs5B,WAAW,YAAct5B,EAAKs5B,WAAW,UAAqB,aAATt5B,GAAgC,WAATA,EACzGs0B,WAAat0B,GAAkB,eAATA,GAAkC,mBAATA,GAAsC,SAATA,IAG9Ei0B,EAASG,SAAS,SAAU,CAC1BC,UAAW,UAGbJ,EAASG,SAAS,cAAe,CAC/BG,YAAcv0B,GAAkB,oBAATA,GAAuC,aAATA,EACrDs0B,WAAat0B,GAAkB,oBAATA,GAE1B,C,MClGau5B,GAAY3qB,OAAO4X,OAAO,MAC1BgT,GAAc5qB,OAAO4X,OAAO,MAOzC,SAASiT,GAASC,EAAMr6B,GACtB,IAAKA,EACH,OAAOq6B,EAET,MAAM7qB,EAAOxP,EAAIqoB,MAAM,KACvB,IAAK,IAAItS,EAAI,EAAGN,EAAIjG,EAAKvH,OAAQ8N,EAAIN,IAAKM,EAAG,CAC3C,MAAML,EAAIlG,EAAKuG,GACfskB,EAAOA,EAAK3kB,KAAO2kB,EAAK3kB,GAAKnG,OAAO4X,OAAO,MAC7C,CACA,OAAOkT,CACT,CAEA,SAASrL,GAAIsL,EAAMC,EAAO1M,GACxB,MAAqB,kBAAV0M,EACF7S,GAAM0S,GAASE,EAAMC,GAAQ1M,GAE/BnG,GAAM0S,GAASE,EAAM,IAAKC,EACnC,CAMO,MAAMC,GACX7W,WAAAA,CAAY8W,EAAcC,GACxBn5B,KAAK8zB,eAAYhgB,EACjB9T,KAAKo5B,gBAAkB,kBACvBp5B,KAAKq5B,YAAc,kBACnBr5B,KAAK0iB,MAAQ,OACb1iB,KAAKs5B,SAAW,CAAC,EACjBt5B,KAAKu5B,iBAAoBC,GAAYA,EAAQ7D,MAAM8D,SAASC,sBAC5D15B,KAAK25B,SAAW,CAAC,EACjB35B,KAAK45B,OAAS,CACZ,YACA,WACA,QACA,aACA,aAEF55B,KAAK65B,KAAO,CACVC,OAAQ,qDACRzsB,KAAM,GACNhP,MAAO,SACP07B,WAAY,IACZpX,OAAQ,MAEV3iB,KAAKg6B,MAAQ,CAAC,EACdh6B,KAAKi6B,qBAAuB,CAACC,EAAKpsB,IAAYmlB,GAAcnlB,EAAQsrB,iBACpEp5B,KAAKm6B,iBAAmB,CAACD,EAAKpsB,IAAYmlB,GAAcnlB,EAAQurB,aAChEr5B,KAAKo6B,WAAa,CAACF,EAAKpsB,IAAYmlB,GAAcnlB,EAAQ4U,OAC1D1iB,KAAKq6B,UAAY,IACjBr6B,KAAKs6B,YAAc,CACjBC,KAAM,UACNC,WAAW,EACXC,kBAAkB,GAEpBz6B,KAAK06B,qBAAsB,EAC3B16B,KAAK26B,QAAU,KACf36B,KAAKpB,QAAU,KACfoB,KAAK46B,SAAU,EACf56B,KAAK66B,QAAU,CAAC,EAChB76B,KAAK86B,YAAa,EAClB96B,KAAK+6B,WAAQjnB,EACb9T,KAAKg7B,OAAS,CAAC,EACfh7B,KAAKi7B,UAAW,EAChBj7B,KAAKk7B,yBAA0B,EAE/Bl7B,KAAKwzB,SAAS0F,GACdl5B,KAAK+kB,MAAMoU,EACb,CAMA1L,GAAAA,CAAIuL,EAAO1M,GACT,OAAOmB,GAAIztB,KAAMg5B,EAAO1M,EAC1B,CAKA2I,GAAAA,CAAI+D,GACF,OAAOH,GAAS74B,KAAMg5B,EACxB,CAMAxF,QAAAA,CAASwF,EAAO1M,GACd,OAAOmB,GAAImL,GAAaI,EAAO1M,EACjC,CAEA6O,QAAAA,CAASnC,EAAO1M,GACd,OAAOmB,GAAIkL,GAAWK,EAAO1M,EAC/B,CAmBAmM,KAAAA,CAAMO,EAAO55B,EAAMg8B,EAAaC,GAC9B,MAAMC,EAAczC,GAAS74B,KAAMg5B,GAC7BuC,EAAoB1C,GAAS74B,KAAMo7B,GACnCI,EAAc,IAAMp8B,EAE1B4O,OAAOytB,iBAAiBH,EAAa,CAEnC,CAACE,GAAc,CACb12B,MAAOw2B,EAAYl8B,GACnBs8B,UAAU,GAGZ,CAACt8B,GAAO,CACN0tB,YAAY,EACZmI,GAAAA,GACE,MAAM0G,EAAQ37B,KAAKw7B,GACb7V,EAAS4V,EAAkBF,GACjC,OAAIpX,GAAS0X,GACJ3tB,OAAO8T,OAAO,CAAC,EAAG6D,EAAQgW,GAE5BrX,GAAeqX,EAAOhW,EAC/B,EACA8H,GAAAA,CAAI3oB,GACF9E,KAAKw7B,GAAe12B,CACtB,IAGN,CAEAigB,KAAAA,CAAM6W,GACJA,EAAS7O,QAAShI,GAAUA,EAAM/kB,MACpC,EAIF,IAAAqzB,GAA+B,IAAI4F,GAAS,CAC1CtF,YAAcv0B,IAAUA,EAAKs5B,WAAW,MACxChF,WAAat0B,GAAkB,WAATA,EACtB46B,MAAO,CACLvG,UAAW,eAEb6G,YAAa,CACX3G,aAAa,EACbD,YAAY,IAEb,CAACN,GAAyBgB,GAAsBqC,KCtJ5C,SAASoF,GAAahC,GAC3B,OAAKA,GAAQjW,GAAciW,EAAKxsB,OAASuW,GAAciW,EAAKC,QACnD,MAGDD,EAAKx7B,MAAQw7B,EAAKx7B,MAAQ,IAAM,KACrCw7B,EAAKlX,OAASkX,EAAKlX,OAAS,IAAM,IACnCkX,EAAKxsB,KAAO,MACZwsB,EAAKC,MACT,CAKO,SAASgC,GACd5B,EACAx6B,EACAq8B,EACAC,EACAC,GAEA,IAAIC,EAAYx8B,EAAKu8B,GAQrB,OAPKC,IACHA,EAAYx8B,EAAKu8B,GAAU/B,EAAIiC,YAAYF,GAAQh8B,MACnD87B,EAAG/U,KAAKiV,IAENC,EAAYF,IACdA,EAAUE,GAELF,CACT,CASO,SAASI,GACdlC,EACAL,EACAwC,EACAC,GAEAA,EAAQA,GAAS,CAAC,EAClB,IAAI58B,EAAO48B,EAAM58B,KAAO48B,EAAM58B,MAAQ,CAAC,EACnCq8B,EAAKO,EAAMC,eAAiBD,EAAMC,gBAAkB,GAEpDD,EAAMzC,OAASA,IACjBn6B,EAAO48B,EAAM58B,KAAO,CAAC,EACrBq8B,EAAKO,EAAMC,eAAiB,GAC5BD,EAAMzC,KAAOA,GAGfK,EAAIsC,OAEJtC,EAAIL,KAAOA,EACX,IAAImC,EAAU,EACd,MAAM1W,EAAO+W,EAAc31B,OAC3B,IAAI8N,EAAW+L,EAAWkc,EAAcC,EAAwBC,EAChE,IAAKnoB,EAAI,EAAGA,EAAI8Q,EAAM9Q,IAIpB,GAHAkoB,EAAQL,EAAc7nB,QAGRV,IAAV4oB,GAAiC,OAAVA,GAAmB9nB,GAAQ8nB,IAE/C,GAAI9nB,GAAQ8nB,GAGjB,IAAKnc,EAAI,EAAGkc,EAAOC,EAAMh2B,OAAQ6Z,EAAIkc,EAAMlc,IACzCoc,EAAcD,EAAMnc,QAEAzM,IAAhB6oB,GAA6C,OAAhBA,GAAyB/nB,GAAQ+nB,KAChEX,EAAUF,GAAa5B,EAAKx6B,EAAMq8B,EAAIC,EAASW,SARnDX,EAAUF,GAAa5B,EAAKx6B,EAAMq8B,EAAIC,EAASU,GAcnDxC,EAAI0C,UAEJ,MAAMC,EAAQd,EAAGr1B,OAAS,EAC1B,GAAIm2B,EAAQR,EAAc31B,OAAQ,CAChC,IAAK8N,EAAI,EAAGA,EAAIqoB,EAAOroB,WACd9U,EAAKq8B,EAAGvnB,IAEjBunB,EAAGzO,OAAO,EAAGuP,E,CAEf,OAAOb,CACT,CAUO,SAASc,GAAYnH,EAAcoH,EAAe98B,GACvD,MAAMs5B,EAAmB5D,EAAMqH,wBACzBC,EAAsB,IAAVh9B,EAAcgP,KAAK6C,IAAI7R,EAAQ,EAAG,IAAO,EAC3D,OAAOgP,KAAKC,OAAO6tB,EAAQE,GAAa1D,GAAoBA,EAAmB0D,CACjF,CAKO,SAASC,GAAYC,EAA4BjD,IACjDA,GAAQiD,KAIbjD,EAAMA,GAAOiD,EAAOC,WAAW,MAE/BlD,EAAIsC,OAGJtC,EAAImD,iBACJnD,EAAIoD,UAAU,EAAG,EAAGH,EAAOl9B,MAAOk9B,EAAOI,QACzCrD,EAAI0C,UACN,CASO,SAASY,GACdtD,EACApsB,EACA4H,EACAiR,GAGA8W,GAAgBvD,EAAKpsB,EAAS4H,EAAGiR,EAAG,KACtC,CAGO,SAAS8W,GACdvD,EACApsB,EACA4H,EACAiR,EACArS,GAEA,IAAIhV,EAAco+B,EAAiBC,EAAiBtwB,EAAcuwB,EAAsB39B,EAAe49B,EAAkBC,EACzH,MAAMz/B,EAAQyP,EAAQiwB,WAChBC,EAAWlwB,EAAQkwB,SACnBC,EAASnwB,EAAQmwB,OACvB,IAAIC,GAAOF,GAAY,GAAKhW,GAE5B,GAAI3pB,GAA0B,kBAAVA,IAClBiB,EAAOjB,EAAMylB,WACA,8BAATxkB,GAAiD,+BAATA,GAM1C,OALA46B,EAAIsC,OACJtC,EAAIiE,UAAUzoB,EAAGiR,GACjBuT,EAAI3kB,OAAO2oB,GACXhE,EAAIkE,UAAU//B,GAAQA,EAAM4B,MAAQ,GAAI5B,EAAMk/B,OAAS,EAAGl/B,EAAM4B,MAAO5B,EAAMk/B,aAC7ErD,EAAI0C,UAKR,KAAIpT,MAAMyU,IAAWA,GAAU,GAA/B,CAMA,OAFA/D,EAAImE,YAEIhgC,GAEN,QACMiW,EACF4lB,EAAIoE,QAAQ5oB,EAAGiR,EAAGrS,EAAI,EAAG2pB,EAAQ,EAAG,EAAGrW,IAEvCsS,EAAIqE,IAAI7oB,EAAGiR,EAAGsX,EAAQ,EAAGrW,IAE3BsS,EAAIsE,YACJ,MACF,IAAK,WACHv+B,EAAQqU,EAAIA,EAAI,EAAI2pB,EACpB/D,EAAIuE,OAAO/oB,EAAIzG,KAAK4hB,IAAIqN,GAAOj+B,EAAO0mB,EAAI1X,KAAK6iB,IAAIoM,GAAOD,GAC1DC,GAAO/V,GACP+R,EAAIwE,OAAOhpB,EAAIzG,KAAK4hB,IAAIqN,GAAOj+B,EAAO0mB,EAAI1X,KAAK6iB,IAAIoM,GAAOD,GAC1DC,GAAO/V,GACP+R,EAAIwE,OAAOhpB,EAAIzG,KAAK4hB,IAAIqN,GAAOj+B,EAAO0mB,EAAI1X,KAAK6iB,IAAIoM,GAAOD,GAC1D/D,EAAIsE,YACJ,MACF,IAAK,cAQHZ,EAAwB,KAATK,EACf5wB,EAAO4wB,EAASL,EAChBF,EAAUzuB,KAAK6iB,IAAIoM,EAAMhW,IAAc7a,EACvCwwB,EAAW5uB,KAAK6iB,IAAIoM,EAAMhW,KAAe5T,EAAIA,EAAI,EAAIspB,EAAevwB,GACpEswB,EAAU1uB,KAAK4hB,IAAIqN,EAAMhW,IAAc7a,EACvCywB,EAAW7uB,KAAK4hB,IAAIqN,EAAMhW,KAAe5T,EAAIA,EAAI,EAAIspB,EAAevwB,GACpE6sB,EAAIqE,IAAI7oB,EAAImoB,EAAUlX,EAAIgX,EAASC,EAAcM,EAAMvW,GAAIuW,EAAMjW,IACjEiS,EAAIqE,IAAI7oB,EAAIooB,EAAUnX,EAAI+W,EAASE,EAAcM,EAAMjW,GAASiW,GAChEhE,EAAIqE,IAAI7oB,EAAImoB,EAAUlX,EAAIgX,EAASC,EAAcM,EAAKA,EAAMjW,IAC5DiS,EAAIqE,IAAI7oB,EAAIooB,EAAUnX,EAAI+W,EAASE,EAAcM,EAAMjW,GAASiW,EAAMvW,IACtEuS,EAAIsE,YACJ,MACF,IAAK,OACH,IAAKR,EAAU,CACb3wB,EAAO4B,KAAK0vB,QAAUV,EACtBh+B,EAAQqU,EAAIA,EAAI,EAAIjH,EACpB6sB,EAAI0E,KAAKlpB,EAAIzV,EAAO0mB,EAAItZ,EAAM,EAAIpN,EAAO,EAAIoN,GAC7C,K,CAEF6wB,GAAOhW,GAET,IAAK,UACH2V,EAAW5uB,KAAK6iB,IAAIoM,IAAQ5pB,EAAIA,EAAI,EAAI2pB,GACxCP,EAAUzuB,KAAK6iB,IAAIoM,GAAOD,EAC1BN,EAAU1uB,KAAK4hB,IAAIqN,GAAOD,EAC1BH,EAAW7uB,KAAK4hB,IAAIqN,IAAQ5pB,EAAIA,EAAI,EAAI2pB,GACxC/D,EAAIuE,OAAO/oB,EAAImoB,EAAUlX,EAAIgX,GAC7BzD,EAAIwE,OAAOhpB,EAAIooB,EAAUnX,EAAI+W,GAC7BxD,EAAIwE,OAAOhpB,EAAImoB,EAAUlX,EAAIgX,GAC7BzD,EAAIwE,OAAOhpB,EAAIooB,EAAUnX,EAAI+W,GAC7BxD,EAAIsE,YACJ,MACF,IAAK,WACHN,GAAOhW,GAET,IAAK,QACH2V,EAAW5uB,KAAK6iB,IAAIoM,IAAQ5pB,EAAIA,EAAI,EAAI2pB,GACxCP,EAAUzuB,KAAK6iB,IAAIoM,GAAOD,EAC1BN,EAAU1uB,KAAK4hB,IAAIqN,GAAOD,EAC1BH,EAAW7uB,KAAK4hB,IAAIqN,IAAQ5pB,EAAIA,EAAI,EAAI2pB,GACxC/D,EAAIuE,OAAO/oB,EAAImoB,EAAUlX,EAAIgX,GAC7BzD,EAAIwE,OAAOhpB,EAAImoB,EAAUlX,EAAIgX,GAC7BzD,EAAIuE,OAAO/oB,EAAIooB,EAAUnX,EAAI+W,GAC7BxD,EAAIwE,OAAOhpB,EAAIooB,EAAUnX,EAAI+W,GAC7B,MACF,IAAK,OACHG,EAAW5uB,KAAK6iB,IAAIoM,IAAQ5pB,EAAIA,EAAI,EAAI2pB,GACxCP,EAAUzuB,KAAK6iB,IAAIoM,GAAOD,EAC1BN,EAAU1uB,KAAK4hB,IAAIqN,GAAOD,EAC1BH,EAAW7uB,KAAK4hB,IAAIqN,IAAQ5pB,EAAIA,EAAI,EAAI2pB,GACxC/D,EAAIuE,OAAO/oB,EAAImoB,EAAUlX,EAAIgX,GAC7BzD,EAAIwE,OAAOhpB,EAAImoB,EAAUlX,EAAIgX,GAC7BzD,EAAIuE,OAAO/oB,EAAIooB,EAAUnX,EAAI+W,GAC7BxD,EAAIwE,OAAOhpB,EAAIooB,EAAUnX,EAAI+W,GAC7BQ,GAAOhW,GACP2V,EAAW5uB,KAAK6iB,IAAIoM,IAAQ5pB,EAAIA,EAAI,EAAI2pB,GACxCP,EAAUzuB,KAAK6iB,IAAIoM,GAAOD,EAC1BN,EAAU1uB,KAAK4hB,IAAIqN,GAAOD,EAC1BH,EAAW7uB,KAAK4hB,IAAIqN,IAAQ5pB,EAAIA,EAAI,EAAI2pB,GACxC/D,EAAIuE,OAAO/oB,EAAImoB,EAAUlX,EAAIgX,GAC7BzD,EAAIwE,OAAOhpB,EAAImoB,EAAUlX,EAAIgX,GAC7BzD,EAAIuE,OAAO/oB,EAAIooB,EAAUnX,EAAI+W,GAC7BxD,EAAIwE,OAAOhpB,EAAIooB,EAAUnX,EAAI+W,GAC7B,MACF,IAAK,OACHA,EAAUppB,EAAIA,EAAI,EAAIrF,KAAK6iB,IAAIoM,GAAOD,EACtCN,EAAU1uB,KAAK4hB,IAAIqN,GAAOD,EAC1B/D,EAAIuE,OAAO/oB,EAAIgoB,EAAS/W,EAAIgX,GAC5BzD,EAAIwE,OAAOhpB,EAAIgoB,EAAS/W,EAAIgX,GAC5B,MACF,IAAK,OACHzD,EAAIuE,OAAO/oB,EAAGiR,GACduT,EAAIwE,OAAOhpB,EAAIzG,KAAK6iB,IAAIoM,IAAQ5pB,EAAIA,EAAI,EAAI2pB,GAAStX,EAAI1X,KAAK4hB,IAAIqN,GAAOD,GACzE,MACF,KAAK,EACH/D,EAAIsE,YACJ,MAGJtE,EAAI2E,OACA/wB,EAAQgxB,YAAc,GACxB5E,EAAI6E,Q,CAER,CASO,SAASC,GACdjP,EACAkP,EACAC,GAIA,OAFAA,EAASA,GAAU,IAEXD,GAASlP,GAASA,EAAMra,EAAIupB,EAAKxQ,KAAOyQ,GAAUnP,EAAMra,EAAIupB,EAAKvQ,MAAQwQ,GACjFnP,EAAMpJ,EAAIsY,EAAK1K,IAAM2K,GAAUnP,EAAMpJ,EAAIsY,EAAKzK,OAAS0K,CACzD,CAEO,SAASC,GAASjF,EAA+B+E,GACtD/E,EAAIsC,OACJtC,EAAImE,YACJnE,EAAI0E,KAAKK,EAAKxQ,KAAMwQ,EAAK1K,IAAK0K,EAAKvQ,MAAQuQ,EAAKxQ,KAAMwQ,EAAKzK,OAASyK,EAAK1K,KACzE2F,EAAIpD,MACN,CAEO,SAASsI,GAAWlF,GACzBA,EAAI0C,SACN,CAKO,SAASyC,GACdnF,EACAoF,EACA3Z,EACA4Z,EACAhF,GAEA,IAAK+E,EACH,OAAOpF,EAAIwE,OAAO/Y,EAAOjQ,EAAGiQ,EAAOgB,GAErC,GAAa,WAAT4T,EAAmB,CACrB,MAAMiF,GAAYF,EAAS5pB,EAAIiQ,EAAOjQ,GAAK,EAC3CwkB,EAAIwE,OAAOc,EAAUF,EAAS3Y,GAC9BuT,EAAIwE,OAAOc,EAAU7Z,EAAOgB,EAC9B,KAAoB,UAAT4T,MAAuBgF,EAChCrF,EAAIwE,OAAOY,EAAS5pB,EAAGiQ,EAAOgB,GAE9BuT,EAAIwE,OAAO/Y,EAAOjQ,EAAG4pB,EAAS3Y,GAEhCuT,EAAIwE,OAAO/Y,EAAOjQ,EAAGiQ,EAAOgB,EAC9B,CAKO,SAAS8Y,GACdvF,EACAoF,EACA3Z,EACA4Z,GAEA,IAAKD,EACH,OAAOpF,EAAIwE,OAAO/Y,EAAOjQ,EAAGiQ,EAAOgB,GAErCuT,EAAIwF,cACFH,EAAOD,EAASK,KAAOL,EAASM,KAChCL,EAAOD,EAASO,KAAOP,EAASQ,KAChCP,EAAO5Z,EAAOia,KAAOja,EAAOga,KAC5BJ,EAAO5Z,EAAOma,KAAOna,EAAOka,KAC5Bla,EAAOjQ,EACPiQ,EAAOgB,EACX,CAEA,SAASoZ,GAAc7F,EAA+B8F,GAChDA,EAAKC,aACP/F,EAAIiE,UAAU6B,EAAKC,YAAY,GAAID,EAAKC,YAAY,IAGjDrc,GAAcoc,EAAKhC,WACtB9D,EAAI3kB,OAAOyqB,EAAKhC,UAGdgC,EAAKtd,QACPwX,EAAIgG,UAAYF,EAAKtd,OAGnBsd,EAAKG,YACPjG,EAAIiG,UAAYH,EAAKG,WAGnBH,EAAKI,eACPlG,EAAIkG,aAAeJ,EAAKI,aAE5B,CAEA,SAASC,GACPnG,EACAxkB,EACAiR,EACA2Z,EACAN,GAEA,GAAIA,EAAKO,eAAiBP,EAAKQ,UAAW,CAQxC,MAAMC,EAAUvG,EAAIiC,YAAYmE,GAC1B7R,EAAO/Y,EAAI+qB,EAAQC,sBACnBhS,EAAQhZ,EAAI+qB,EAAQE,uBACpBpM,EAAM5N,EAAI8Z,EAAQG,wBAClBpM,EAAS7N,EAAI8Z,EAAQI,yBACrBC,EAAcd,EAAKO,eAAiBhM,EAAMC,GAAU,EAAIA,EAE9D0F,EAAI6G,YAAc7G,EAAIgG,UACtBhG,EAAImE,YACJnE,EAAIjD,UAAY+I,EAAKgB,iBAAmB,EACxC9G,EAAIuE,OAAOhQ,EAAMqS,GACjB5G,EAAIwE,OAAOhQ,EAAOoS,GAClB5G,EAAI6E,Q,CAER,CAEA,SAASkC,GAAa/G,EAA+B8F,GACnD,MAAMkB,EAAWhH,EAAIgG,UAErBhG,EAAIgG,UAAYF,EAAKtd,MACrBwX,EAAIiH,SAASnB,EAAKvR,KAAMuR,EAAKzL,IAAKyL,EAAK//B,MAAO+/B,EAAKzC,QACnDrD,EAAIgG,UAAYgB,CAClB,CAKO,SAASE,GACdlH,EACAxC,EACAhiB,EACAiR,EACAkT,EACAmG,EAAuB,IAEvB,MAAMqB,EAAQzsB,GAAQ8iB,GAAQA,EAAO,CAACA,GAChCqH,EAASiB,EAAKsB,YAAc,GAA0B,KAArBtB,EAAKuB,YAC5C,IAAI/sB,EAAW8rB,EAMf,IAJApG,EAAIsC,OACJtC,EAAIL,KAAOA,EAAKoC,OAChB8D,GAAc7F,EAAK8F,GAEdxrB,EAAI,EAAGA,EAAI6sB,EAAM36B,SAAU8N,EAC9B8rB,EAAOe,EAAM7sB,GAETwrB,EAAKwB,UACPP,GAAa/G,EAAK8F,EAAKwB,UAGrBzC,IACEiB,EAAKuB,cACPrH,EAAI6G,YAAcf,EAAKuB,aAGpB3d,GAAcoc,EAAKsB,eACtBpH,EAAIjD,UAAY+I,EAAKsB,aAGvBpH,EAAIuH,WAAWnB,EAAM5qB,EAAGiR,EAAGqZ,EAAK0B,WAGlCxH,EAAIyH,SAASrB,EAAM5qB,EAAGiR,EAAGqZ,EAAK0B,UAC9BrB,GAAanG,EAAKxkB,EAAGiR,EAAG2Z,EAAMN,GAE9BrZ,GAAKnhB,OAAOq0B,EAAKE,YAGnBG,EAAI0C,SACN,CAOO,SAASgF,GACd1H,EACA0E,GAEA,MAAM,EAAClpB,EAAC,EAAEiR,EAAC,EAAErS,EAAC,EAAEzC,EAAC,OAAEosB,GAAUW,EAG7B1E,EAAIqE,IAAI7oB,EAAIuoB,EAAO4D,QAASlb,EAAIsX,EAAO4D,QAAS5D,EAAO4D,QAAS,IAAMla,GAAIA,IAAI,GAG9EuS,EAAIwE,OAAOhpB,EAAGiR,EAAI9U,EAAIosB,EAAO6D,YAG7B5H,EAAIqE,IAAI7oB,EAAIuoB,EAAO6D,WAAYnb,EAAI9U,EAAIosB,EAAO6D,WAAY7D,EAAO6D,WAAYna,GAAIM,IAAS,GAG1FiS,EAAIwE,OAAOhpB,EAAIpB,EAAI2pB,EAAO8D,YAAapb,EAAI9U,GAG3CqoB,EAAIqE,IAAI7oB,EAAIpB,EAAI2pB,EAAO8D,YAAapb,EAAI9U,EAAIosB,EAAO8D,YAAa9D,EAAO8D,YAAa9Z,GAAS,GAAG,GAGhGiS,EAAIwE,OAAOhpB,EAAIpB,EAAGqS,EAAIsX,EAAO+D,UAG7B9H,EAAIqE,IAAI7oB,EAAIpB,EAAI2pB,EAAO+D,SAAUrb,EAAIsX,EAAO+D,SAAU/D,EAAO+D,SAAU,GAAI/Z,IAAS,GAGpFiS,EAAIwE,OAAOhpB,EAAIuoB,EAAO4D,QAASlb,EACjC,CCxgBA,MAAMsb,GAAc,uCACdC,GAAa,wEAcZ,SAASC,GAAar9B,EAAwBuI,GACnD,MAAM+0B,GAAW,GAAKt9B,GAAOQ,MAAM28B,IACnC,IAAKG,GAA0B,WAAfA,EAAQ,GACtB,OAAc,IAAP/0B,EAKT,OAFAvI,GAASs9B,EAAQ,GAETA,EAAQ,IACd,IAAK,KACH,OAAOt9B,EACT,IAAK,IACHA,GAAS,IACT,MAKJ,OAAOuI,EAAOvI,CAChB,CAEA,MAAMu9B,GAAgB3wB,IAAgBA,GAAK,EAQpC,SAAS4wB,GAAkBx9B,EAAwCzF,GACxE,MAAMqU,EAAM,CAAC,EACP6uB,EAAWte,GAAS5kB,GACpB4O,EAAOs0B,EAAWv0B,OAAOC,KAAK5O,GAASA,EACvCmjC,EAAOve,GAASnf,GAClBy9B,EACEE,GAAQne,GAAexf,EAAM29B,GAAO39B,EAAMzF,EAAMojC,KAChDA,GAAQ39B,EAAM29B,GAChB,IAAM39B,EAEV,IAAK,MAAM29B,KAAQx0B,EACjByF,EAAI+uB,GAAQJ,GAAaG,EAAKC,IAEhC,OAAO/uB,CACT,CAUO,SAASgvB,GAAO59B,GACrB,OAAOw9B,GAAkBx9B,EAAO,CAACyvB,IAAK,IAAK7F,MAAO,IAAK8F,OAAQ,IAAK/F,KAAM,KAC5E,CASO,SAASkU,GAAc79B,GAC5B,OAAOw9B,GAAkBx9B,EAAO,CAAC,UAAW,WAAY,aAAc,eACxE,CAUO,SAAS89B,GAAU99B,GACxB,MAAM0d,EAAMkgB,GAAO59B,GAKnB,OAHA0d,EAAIviB,MAAQuiB,EAAIiM,KAAOjM,EAAIkM,MAC3BlM,EAAI+a,OAAS/a,EAAI+R,IAAM/R,EAAIgS,OAEpBhS,CACT,CAUO,SAASqgB,GAAO/0B,EAA4Bg1B,GACjDh1B,EAAUA,GAAW,CAAC,EACtBg1B,EAAWA,GAAYzP,GAASwG,KAEhC,IAAIxsB,EAAOiX,GAAexW,EAAQT,KAAMy1B,EAASz1B,MAE7B,kBAATA,IACTA,EAAOsT,SAAStT,EAAM,KAExB,IAAIhP,EAAQimB,GAAexW,EAAQzP,MAAOykC,EAASzkC,OAC/CA,KAAW,GAAKA,GAAOiH,MAAM48B,MAC/Ba,QAAQC,KAAK,kCAAoC3kC,EAAQ,KACzDA,OAAQyV,GAGV,MAAM+lB,EAAO,CACXC,OAAQxV,GAAexW,EAAQgsB,OAAQgJ,EAAShJ,QAChDC,WAAYoI,GAAa7d,GAAexW,EAAQisB,WAAY+I,EAAS/I,YAAa1sB,GAClFA,OACAhP,QACAskB,OAAQ2B,GAAexW,EAAQ6U,OAAQmgB,EAASngB,QAChDsZ,OAAQ,IAIV,OADApC,EAAKoC,OAASJ,GAAahC,GACpBA,CACT,CAaO,SAASoJ,GAAQC,EAAwB1J,EAAkB96B,EAAgBykC,GAChF,IACI3uB,EAAW8Q,EAAcxgB,EADzBs+B,GAAY,EAGhB,IAAK5uB,EAAI,EAAG8Q,EAAO4d,EAAOx8B,OAAQ8N,EAAI8Q,IAAQ9Q,EAE5C,GADA1P,EAAQo+B,EAAO1uB,QACDV,IAAVhP,SAGYgP,IAAZ0lB,GAA0C,oBAAV10B,IAClCA,EAAQA,EAAM00B,GACd4J,GAAY,QAEAtvB,IAAVpV,GAAuBkW,GAAQ9P,KACjCA,EAAQA,EAAMpG,EAAQoG,EAAM4B,QAC5B08B,GAAY,QAEAtvB,IAAVhP,GAIF,OAHIq+B,IAASC,IACXD,EAAKC,WAAY,GAEZt+B,CAGb,CAQO,SAASu+B,GAAUC,EAAuCvM,EAAwBH,GACvF,MAAM,IAAC7kB,EAAA,IAAKD,GAAOwxB,EACbC,EAAS5e,GAAYoS,GAAQjlB,EAAMC,GAAO,GAC1CyxB,EAAWA,CAAC1+B,EAAexD,IAAgBs1B,GAAyB,IAAV9xB,EAAc,EAAIA,EAAQxD,EAC1F,MAAO,CACLyQ,IAAKyxB,EAASzxB,GAAM9C,KAAKuZ,IAAI+a,IAC7BzxB,IAAK0xB,EAAS1xB,EAAKyxB,GAEvB,CAUO,SAASE,GAAcC,EAAuBlK,GACnD,OAAOxrB,OAAO8T,OAAO9T,OAAO4X,OAAO8d,GAAgBlK,EACrD,CCnLO,SAASmK,GAIdC,EACAC,EAAW,CAAC,IACZC,EACAhB,EACAiB,EAAYA,IAAMH,EAAO,IAEzB,MAAMI,EAAkBF,GAAcF,EACd,qBAAbd,IACTA,EAAWmB,GAAS,YAAaL,IAEnC,MAAMtH,EAA6B,CACjC,CAACjT,OAAO6a,aAAc,SACtBC,YAAY,EACZC,QAASR,EACTS,YAAaL,EACbvQ,UAAWqP,EACXwB,WAAYP,EACZ5I,SAAWnC,GAAqB2K,GAAgB,CAAC3K,KAAU4K,GAASC,EAAUG,EAAiBlB,IAEjG,OAAO,IAAIyB,MAAMjI,EAAO,CAItBkI,cAAAA,CAAe7e,EAAQ8c,GAIrB,cAHO9c,EAAO8c,UACP9c,EAAO8e,aACPb,EAAO,GAAGnB,IACV,CACT,EAKAxN,GAAAA,CAAItP,EAAQ8c,GACV,OAAOiC,GAAQ/e,EAAQ8c,EACrB,IAAMkC,GAAqBlC,EAAMoB,EAAUD,EAAQje,GACvD,EAMAif,wBAAAA,CAAyBjf,EAAQ8c,GAC/B,OAAOoC,QAAQD,yBAAyBjf,EAAOye,QAAQ,GAAI3B,EAC7D,EAKAqC,cAAAA,GACE,OAAOD,QAAQC,eAAelB,EAAO,GACvC,EAKAnc,GAAAA,CAAI9B,EAAQ8c,GACV,OAAOsC,GAAqBpf,GAAQ4Q,SAASkM,EAC/C,EAKAuC,OAAAA,CAAQrf,GACN,OAAOof,GAAqBpf,EAC9B,EAKA8H,GAAAA,CAAI9H,EAAQ8c,EAAc39B,GACxB,MAAMmgC,EAAUtf,EAAOuf,WAAavf,EAAOuf,SAAWnB,KAGtD,OAFApe,EAAO8c,GAAQwC,EAAQxC,GAAQ39B,SACxB6gB,EAAO8e,OACP,CACT,GAEJ,CAUO,SAASU,GAIdC,EACA5L,EACA6L,EACAC,GAEA,MAAMhJ,EAA4B,CAChC6H,YAAY,EACZoB,OAAQH,EACRI,SAAUhM,EACViM,UAAWJ,EACXK,OAAQ,IAAIhY,IACZwL,aAAcA,GAAakM,EAAOE,GAClCK,WAAazL,GAAmBiL,GAAeC,EAAOlL,EAAKmL,EAAUC,GACrEnK,SAAWnC,GAAqBmM,GAAeC,EAAMjK,SAASnC,GAAQQ,EAAS6L,EAAUC,IAE3F,OAAO,IAAIf,MAAMjI,EAAO,CAItBkI,cAAAA,CAAe7e,EAAQ8c,GAGrB,cAFO9c,EAAO8c,UACP2C,EAAM3C,IACN,CACT,EAKAxN,GAAAA,CAAItP,EAAQ8c,EAAcmD,GACxB,OAAOlB,GAAQ/e,EAAQ8c,EACrB,IAAMoD,GAAoBlgB,EAAQ8c,EAAMmD,GAC5C,EAMAhB,wBAAAA,CAAyBjf,EAAQ8c,GAC/B,OAAO9c,EAAOuT,aAAa4M,QACvBjB,QAAQpd,IAAI2d,EAAO3C,GAAQ,CAAC3V,YAAY,EAAMD,cAAc,QAAQ/Y,EACpE+wB,QAAQD,yBAAyBQ,EAAO3C,EAC9C,EAKAqC,cAAAA,GACE,OAAOD,QAAQC,eAAeM,EAChC,EAKA3d,GAAAA,CAAI9B,EAAQ8c,GACV,OAAOoC,QAAQpd,IAAI2d,EAAO3C,EAC5B,EAKAuC,OAAAA,GACE,OAAOH,QAAQG,QAAQI,EACzB,EAKA3X,GAAAA,CAAI9H,EAAQ8c,EAAM39B,GAGhB,OAFAsgC,EAAM3C,GAAQ39B,SACP6gB,EAAO8c,IACP,CACT,GAEJ,CAKO,SAASvJ,GACdkM,EACA/R,EAA+B,CAAC0S,YAAY,EAAMC,WAAW,IAE7D,MAAM,YAACrS,EAAcN,EAAS0S,WAAU,WAAErS,EAAaL,EAAS2S,UAAS,SAAEC,EAAW5S,EAASyS,SAAWV,EAC1G,MAAO,CACLU,QAASG,EACTF,WAAYpS,EACZqS,UAAWtS,EACXwS,aAAc3e,GAAWoM,GAAeA,EAAc,IAAMA,EAC5DwS,YAAa5e,GAAWmM,GAAcA,EAAa,IAAMA,EAE7D,CAEA,MAAM0S,GAAUA,CAACC,EAAgBjnC,IAAiBinC,EAASA,EAASjf,GAAYhoB,GAAQA,EAClFknC,GAAmBA,CAAC7D,EAAc39B,IAAmBmf,GAASnf,IAAmB,aAAT29B,IAC1C,OAAjCz0B,OAAO82B,eAAehgC,IAAmBA,EAAMsd,cAAgBpU,QAElE,SAAS02B,GACP/e,EACA8c,EACAQ,GAEA,GAAIj1B,OAAO6V,UAAU2C,eAAezC,KAAK4B,EAAQ8c,IAAkB,gBAATA,EACxD,OAAO9c,EAAO8c,GAGhB,MAAM39B,EAAQm+B,IAGd,OADAtd,EAAO8c,GAAQ39B,EACRA,CACT,CAEA,SAAS+gC,GACPlgB,EACA8c,EACAmD,GAEA,MAAM,OAACL,EAAM,SAAEC,EAAQ,UAAEC,EAAWvM,aAAcN,GAAejT,EACjE,IAAI7gB,EAAQygC,EAAO9C,GAanB,OAVIlb,GAAWziB,IAAU8zB,EAAYsN,aAAazD,KAChD39B,EAAQyhC,GAAmB9D,EAAM39B,EAAO6gB,EAAQigB,IAE9ChxB,GAAQ9P,IAAUA,EAAM4B,SAC1B5B,EAAQ0hC,GAAc/D,EAAM39B,EAAO6gB,EAAQiT,EAAYuN,cAErDG,GAAiB7D,EAAM39B,KAEzBA,EAAQqgC,GAAergC,EAAO0gC,EAAUC,GAAaA,EAAUhD,GAAO7J,IAEjE9zB,CACT,CAEA,SAASyhC,GACP9D,EACAgE,EACA9gB,EACAigB,GAEA,MAAM,OAACL,EAAA,SAAQC,EAAA,UAAUC,EAAS,OAAEC,GAAU/f,EAC9C,GAAI+f,EAAOje,IAAIgb,GACb,MAAM,IAAIiE,MAAM,uBAAyB3gC,MAAMU,KAAKi/B,GAAQiB,KAAK,MAAQ,KAAOlE,GAElFiD,EAAOpkC,IAAImhC,GACX,IAAI39B,EAAQ2hC,EAASjB,EAAUC,GAAaG,GAM5C,OALAF,EAAOkB,OAAOnE,GACV6D,GAAiB7D,EAAM39B,KAEzBA,EAAQ+hC,GAAkBtB,EAAOnB,QAASmB,EAAQ9C,EAAM39B,IAEnDA,CACT,CAEA,SAAS0hC,GACP/D,EACA39B,EACA6gB,EACAwgB,GAEA,MAAM,OAACZ,EAAM,SAAEC,EAAQ,UAAEC,EAAWvM,aAAcN,GAAejT,EAEjE,GAA8B,qBAAnB6f,EAAS9mC,OAAyBynC,EAAY1D,GACvD,OAAO39B,EAAM0gC,EAAS9mC,MAAQoG,EAAM4B,QAC/B,GAAIud,GAASnf,EAAM,IAAK,CAE7B,MAAMgiC,EAAMhiC,EACN8+B,EAAS2B,EAAOnB,QAAQ2C,OAAO9yB,GAAKA,IAAM6yB,GAChDhiC,EAAQ,GACR,IAAK,MAAMtG,KAAQsoC,EAAK,CACtB,MAAM3f,EAAW0f,GAAkBjD,EAAQ2B,EAAQ9C,EAAMjkC,GACzDsG,EAAMkiB,KAAKme,GAAehe,EAAUqe,EAAUC,GAAaA,EAAUhD,GAAO7J,GAC9E,C,CAEF,OAAO9zB,CACT,CAEA,SAASkiC,GACPlE,EACAL,EACA39B,GAEA,OAAOyiB,GAAWub,GAAYA,EAASL,EAAM39B,GAASg+B,CACxD,CAEA,MAAMmE,GAAWA,CAACxoC,EAAwByoC,KAA8B,IAARzoC,EAAeyoC,EAC5D,kBAARzoC,EAAmByoB,GAAiBggB,EAAQzoC,QAAOqV,EAE9D,SAASqzB,GACP1Z,EACA2Z,EACA3oC,EACA4oC,EACAviC,GAEA,IAAK,MAAMoiC,KAAUE,EAAc,CACjC,MAAMpO,EAAQiO,GAASxoC,EAAKyoC,GAC5B,GAAIlO,EAAO,CACTvL,EAAInsB,IAAI03B,GACR,MAAM8J,EAAWkE,GAAgBhO,EAAMvF,UAAWh1B,EAAKqG,GACvD,GAAwB,qBAAbg+B,GAA4BA,IAAarkC,GAAOqkC,IAAauE,EAGtE,OAAOvE,C,MAEJ,IAAc,IAAV9J,GAA6C,qBAAnBqO,GAAkC5oC,IAAQ4oC,EAG7E,OAAO,IAEX,CACA,OAAO,CACT,CAEA,SAASR,GACPO,EACAjgB,EACAsb,EACA39B,GAEA,MAAMg/B,EAAa3c,EAASkd,YACtBvB,EAAWkE,GAAgB7f,EAASsM,UAAWgP,EAAM39B,GACrDwiC,EAAY,IAAIF,KAAiBtD,GACjCrW,EAAM,IAAIC,IAChBD,EAAInsB,IAAIwD,GACR,IAAIrG,EAAM8oC,GAAiB9Z,EAAK6Z,EAAW7E,EAAMK,GAAYL,EAAM39B,GACnE,OAAY,OAARrG,KAGoB,qBAAbqkC,GAA4BA,IAAaL,IAClDhkC,EAAM8oC,GAAiB9Z,EAAK6Z,EAAWxE,EAAUrkC,EAAKqG,GAC1C,OAARrG,KAICklC,GAAgB59B,MAAMU,KAAKgnB,GAAM,CAAC,IAAKqW,EAAYhB,EACxD,IAAM0E,GAAargB,EAAUsb,EAAgB39B,IACjD,CAEA,SAASyiC,GACP9Z,EACA6Z,EACA7oC,EACAqkC,EACAtkC,GAEA,MAAOC,EACLA,EAAM0oC,GAAU1Z,EAAK6Z,EAAW7oC,EAAKqkC,EAAUtkC,GAEjD,OAAOC,CACT,CAEA,SAAS+oC,GACPrgB,EACAsb,EACA39B,GAEA,MAAMoiC,EAAS/f,EAASmd,aAClB7B,KAAQyE,IACZA,EAAOzE,GAAQ,CAAC,GAElB,MAAM9c,EAASuhB,EAAOzE,GACtB,OAAI7tB,GAAQ+Q,IAAW1B,GAASnf,GAEvBA,EAEF6gB,GAAU,CAAC,CACpB,CAEA,SAASgf,GACPlC,EACAoB,EACAD,EACAwB,GAEA,IAAItgC,EACJ,IAAK,MAAMuhC,KAAUxC,EAEnB,GADA/+B,EAAQm/B,GAASmC,GAAQC,EAAQ5D,GAAOmB,GACnB,qBAAV9+B,EACT,OAAOwhC,GAAiB7D,EAAM39B,GAC1B+hC,GAAkBjD,EAAQwB,EAAO3C,EAAM39B,GACvCA,CAGV,CAEA,SAASm/B,GAASxlC,EAAamlC,GAC7B,IAAK,MAAM5K,KAAS4K,EAAQ,CAC1B,IAAK5K,EACH,SAEF,MAAMl0B,EAAQk0B,EAAMv6B,GACpB,GAAqB,qBAAVqG,EACT,OAAOA,CAEX,CACF,CAEA,SAASigC,GAAqBpf,GAC5B,IAAI1X,EAAO0X,EAAO8e,MAIlB,OAHKx2B,IACHA,EAAO0X,EAAO8e,MAAQgD,GAAyB9hB,EAAOye,UAEjDn2B,CACT,CAEA,SAASw5B,GAAyB7D,GAChC,MAAMnW,EAAM,IAAIC,IAChB,IAAK,MAAMsL,KAAS4K,EAClB,IAAK,MAAMnlC,KAAOuP,OAAOC,KAAK+qB,GAAO+N,OAAO5yB,IAAMA,EAAEukB,WAAW,MAC7DjL,EAAInsB,IAAI7C,GAGZ,OAAOsH,MAAMU,KAAKgnB,EACpB,CAEO,SAASia,GACd5Y,EACApvB,EACA4G,EACA+H,GAEA,MAAM,OAAC8gB,GAAUL,GACX,IAACrwB,EAAM,KAAOuB,KAAK2nC,SACnBC,EAAS,IAAI7hC,MAAoBsI,GACvC,IAAImG,EAAW8Q,EAAc5mB,EAAeF,EAE5C,IAAKgW,EAAI,EAAG8Q,EAAOjX,EAAOmG,EAAI8Q,IAAQ9Q,EACpC9V,EAAQ8V,EAAIlO,EACZ9H,EAAOkB,EAAKhB,GACZkpC,EAAOpzB,GAAK,CACVlB,EAAG6b,EAAO0Y,MAAM3gB,GAAiB1oB,EAAMC,GAAMC,IAGjD,OAAOkpC,CACT,CClcA,MAAME,GAAUtiC,OAAOsiC,SAAW,MAG5BC,GAAWA,CAAChZ,EAAuBva,IAAmCA,EAAIua,EAAOroB,SAAWqoB,EAAOva,GAAGwzB,MAAQjZ,EAAOva,GACrHyzB,GAAgB5N,GAAuC,MAAdA,EAAoB,IAAM,IAElE,SAAS6N,GACdC,EACAC,EACAC,EACA7mB,GAUA,MAAM8d,EAAW6I,EAAWH,KAAOI,EAAcD,EAC3C94B,EAAU+4B,EACVE,EAAOD,EAAWL,KAAOI,EAAcC,EACvCE,EAAM3d,GAAsBvb,EAASiwB,GACrCkJ,EAAM5d,GAAsB0d,EAAMj5B,GAExC,IAAIo5B,EAAMF,GAAOA,EAAMC,GACnBE,EAAMF,GAAOD,EAAMC,GAGvBC,EAAMjf,MAAMif,GAAO,EAAIA,EACvBC,EAAMlf,MAAMkf,GAAO,EAAIA,EAEvB,MAAMC,EAAKnnB,EAAIinB,EACTG,EAAKpnB,EAAIknB,EAEf,MAAO,CACLpJ,SAAU,CACR5pB,EAAGrG,EAAQqG,EAAIizB,GAAML,EAAK5yB,EAAI4pB,EAAS5pB,GACvCiR,EAAGtX,EAAQsX,EAAIgiB,GAAML,EAAK3hB,EAAI2Y,EAAS3Y,IAEzC2hB,KAAM,CACJ5yB,EAAGrG,EAAQqG,EAAIkzB,GAAMN,EAAK5yB,EAAI4pB,EAAS5pB,GACvCiR,EAAGtX,EAAQsX,EAAIiiB,GAAMN,EAAK3hB,EAAI2Y,EAAS3Y,IAG7C,CAKA,SAASkiB,GAAe9Z,EAAuB+Z,EAAkBC,GAC/D,MAAMC,EAAYja,EAAOroB,OAEzB,IAAIuiC,EAAgBC,EAAeC,EAAcC,EAA0BC,EACvEC,EAAavB,GAAShZ,EAAQ,GAClC,IAAK,IAAIva,EAAI,EAAGA,EAAIw0B,EAAY,IAAKx0B,EACnC60B,EAAeC,EACfA,EAAavB,GAAShZ,EAAQva,EAAI,GAC7B60B,GAAiBC,IAIlBhhB,GAAawgB,EAAOt0B,GAAI,EAAGszB,IAC7BiB,EAAGv0B,GAAKu0B,EAAGv0B,EAAI,GAAK,GAItBy0B,EAASF,EAAGv0B,GAAKs0B,EAAOt0B,GACxB00B,EAAQH,EAAGv0B,EAAI,GAAKs0B,EAAOt0B,GAC3B40B,EAAmBn6B,KAAKmS,IAAI6nB,EAAQ,GAAKh6B,KAAKmS,IAAI8nB,EAAO,GACrDE,GAAoB,IAIxBD,EAAO,EAAIl6B,KAAKga,KAAKmgB,GACrBL,EAAGv0B,GAAKy0B,EAASE,EAAOL,EAAOt0B,GAC/Bu0B,EAAGv0B,EAAI,GAAK00B,EAAQC,EAAOL,EAAOt0B,KAEtC,CAEA,SAAS+0B,GAAgBxa,EAAuBga,EAAc1O,EAAuB,KACnF,MAAMmP,EAAYvB,GAAa5N,GACzB2O,EAAYja,EAAOroB,OACzB,IAAImvB,EAAe4T,EAAkCJ,EACjDC,EAAavB,GAAShZ,EAAQ,GAElC,IAAK,IAAIva,EAAI,EAAGA,EAAIw0B,IAAax0B,EAAG,CAIlC,GAHAi1B,EAAcJ,EACdA,EAAeC,EACfA,EAAavB,GAAShZ,EAAQva,EAAI,IAC7B60B,EACH,SAGF,MAAMK,EAASL,EAAahP,GACtBsP,EAASN,EAAaG,GACxBC,IACF5T,GAAS6T,EAASD,EAAYpP,IAAc,EAC5CgP,EAAa,MAAMhP,KAAeqP,EAAS7T,EAC3CwT,EAAa,MAAMG,KAAeG,EAAS9T,EAAQkT,EAAGv0B,IAEpD80B,IACFzT,GAASyT,EAAWjP,GAAaqP,GAAU,EAC3CL,EAAa,MAAMhP,KAAeqP,EAAS7T,EAC3CwT,EAAa,MAAMG,KAAeG,EAAS9T,EAAQkT,EAAGv0B,GAE1D,CACF,CAQO,SAASo1B,GAAoB7a,EAAuBsL,EAAuB,KAChF,MAAMmP,EAAYvB,GAAa5N,GACzB2O,EAAYja,EAAOroB,OACnBoiC,EAAmB/iC,MAAMijC,GAAWnK,KAAK,GACzCkK,EAAehjC,MAAMijC,GAG3B,IAAIx0B,EAAGi1B,EAAkCJ,EACrCC,EAAavB,GAAShZ,EAAQ,GAElC,IAAKva,EAAI,EAAGA,EAAIw0B,IAAax0B,EAI3B,GAHAi1B,EAAcJ,EACdA,EAAeC,EACfA,EAAavB,GAAShZ,EAAQva,EAAI,GAC7B60B,EAAL,CAIA,GAAIC,EAAY,CACd,MAAMO,EAAaP,EAAWjP,GAAagP,EAAahP,GAGxDyO,EAAOt0B,GAAoB,IAAfq1B,GAAoBP,EAAWE,GAAaH,EAAaG,IAAcK,EAAa,C,CAElGd,EAAGv0B,GAAMi1B,EACJH,EACEjhB,GAAKygB,EAAOt0B,EAAI,MAAQ6T,GAAKygB,EAAOt0B,IAAO,GACzCs0B,EAAOt0B,EAAI,GAAKs0B,EAAOt0B,IAAM,EAFpBs0B,EAAOt0B,EAAI,GADNs0B,EAAOt0B,E,CAMhCq0B,GAAe9Z,EAAQ+Z,EAAQC,GAE/BQ,GAAgBxa,EAAQga,EAAI1O,EAC9B,CAEA,SAASyP,GAAgBC,EAAYh4B,EAAaD,GAChD,OAAO7C,KAAK6C,IAAI7C,KAAK8C,IAAIg4B,EAAIj4B,GAAMC,EACrC,CAEA,SAASi4B,GAAgBjb,EAAuBkQ,GAC9C,IAAIzqB,EAAG8Q,EAAMyK,EAAOka,EAAQC,EACxBC,EAAanL,GAAejQ,EAAO,GAAIkQ,GAC3C,IAAKzqB,EAAI,EAAG8Q,EAAOyJ,EAAOroB,OAAQ8N,EAAI8Q,IAAQ9Q,EAC5C01B,EAAaD,EACbA,EAASE,EACTA,EAAa31B,EAAI8Q,EAAO,GAAK0Z,GAAejQ,EAAOva,EAAI,GAAIyqB,GACtDgL,IAGLla,EAAQhB,EAAOva,GACX01B,IACFna,EAAM4P,KAAOmK,GAAgB/Z,EAAM4P,KAAMV,EAAKxQ,KAAMwQ,EAAKvQ,OACzDqB,EAAM8P,KAAOiK,GAAgB/Z,EAAM8P,KAAMZ,EAAK1K,IAAK0K,EAAKzK,SAEtD2V,IACFpa,EAAM6P,KAAOkK,GAAgB/Z,EAAM6P,KAAMX,EAAKxQ,KAAMwQ,EAAKvQ,OACzDqB,EAAM+P,KAAOgK,GAAgB/Z,EAAM+P,KAAMb,EAAK1K,IAAK0K,EAAKzK,SAG9D,CAKO,SAAS4V,GACdrb,EACAjhB,EACAmxB,EACA5tB,EACAgpB,GAEA,IAAI7lB,EAAW8Q,EAAcyK,EAAoBsa,EAOjD,GAJIv8B,EAAQwhB,WACVP,EAASA,EAAOgY,OAAQgD,IAAQA,EAAG/B,OAGE,aAAnCl6B,EAAQw8B,uBACVV,GAAoB7a,EAAQsL,OACvB,CACL,IAAIkQ,EAAOl5B,EAAO0d,EAAOA,EAAOroB,OAAS,GAAKqoB,EAAO,GACrD,IAAKva,EAAI,EAAG8Q,EAAOyJ,EAAOroB,OAAQ8N,EAAI8Q,IAAQ9Q,EAC5Cub,EAAQhB,EAAOva,GACf61B,EAAgBnC,GACdqC,EACAxa,EACAhB,EAAO9f,KAAK8C,IAAIyC,EAAI,EAAG8Q,GAAQjU,EAAO,EAAI,IAAMiU,GAChDxX,EAAQ08B,SAEVza,EAAM4P,KAAO0K,EAAc/K,SAAS5pB,EACpCqa,EAAM8P,KAAOwK,EAAc/K,SAAS3Y,EACpCoJ,EAAM6P,KAAOyK,EAAc/B,KAAK5yB,EAChCqa,EAAM+P,KAAOuK,EAAc/B,KAAK3hB,EAChC4jB,EAAOxa,C,CAIPjiB,EAAQk8B,iBACVA,GAAgBjb,EAAQkQ,EAE5B,CCtNO,SAASwL,KACd,MAAyB,qBAAX3qC,QAA8C,qBAAb4qC,QACjD,CAKO,SAASC,GAAeC,GAC7B,IAAI1D,EAAS0D,EAAQC,WAIrB,OAHI3D,GAAgC,wBAAtBA,EAAOpjB,aACnBojB,EAAUA,EAAsB4D,MAE3B5D,CACT,CAOA,SAAS6D,GAAcC,EAA6BlS,EAAmBmS,GACrE,IAAIC,EAYJ,MAX0B,kBAAfF,GACTE,EAAgBvqB,SAASqqB,EAAY,KAEJ,IAA7BA,EAAWjlB,QAAQ,OAErBmlB,EAAgBA,EAAiB,IAAOpS,EAAK+R,WAAWI,KAG1DC,EAAgBF,EAGXE,CACT,CAEA,MAAMC,GAAoBC,GACxBA,EAAQC,cAAcC,YAAYH,iBAAiBC,EAAS,MAEvD,SAASG,GAAS9qC,EAAiBopB,GACxC,OAAOshB,GAAiB1qC,GAAI+qC,iBAAiB3hB,EAC/C,CAEA,MAAM4hB,GAAY,CAAC,MAAO,QAAS,SAAU,QAC7C,SAASC,GAAmBC,EAA6BttC,EAAeutC,GACtE,MAAM5iB,EAAS,CAAC,EAChB4iB,EAASA,EAAS,IAAMA,EAAS,GACjC,IAAK,IAAIp3B,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMq3B,EAAMJ,GAAUj3B,GACtBwU,EAAO6iB,GAAOnnB,WAAWinB,EAAOttC,EAAQ,IAAMwtC,EAAMD,KAAY,CAClE,CAGA,OAFA5iB,EAAO/oB,MAAQ+oB,EAAOyF,KAAOzF,EAAO0F,MACpC1F,EAAOuU,OAASvU,EAAOuL,IAAMvL,EAAOwL,OAC7BxL,CACT,CAEA,MAAM8iB,GAAeA,CAACp2B,EAAWiR,EAAWhB,KACzCjQ,EAAI,GAAKiR,EAAI,MAAQhB,IAAWA,EAAwBomB,YAO3D,SAASC,GACPj5B,EACAoqB,GAMA,MAAM8O,EAAUl5B,EAAkBk5B,QAC5BvmB,EAAUumB,GAAWA,EAAQvlC,OAASulC,EAAQ,GAAKl5B,GACnD,QAACm5B,EAAA,QAASC,GAAWzmB,EAC3B,IACIhQ,EAAGiR,EADHylB,GAAM,EAEV,GAAIN,GAAaI,EAASC,EAASp5B,EAAE4S,QACnCjQ,EAAIw2B,EACJvlB,EAAIwlB,MACC,CACL,MAAMvN,EAAOzB,EAAOkP,wBACpB32B,EAAIgQ,EAAO4mB,QAAU1N,EAAKnQ,KAC1B9H,EAAIjB,EAAO6mB,QAAU3N,EAAKrK,IAC1B6X,GAAM,C,CAER,MAAO,CAAC12B,IAAGiR,IAAGylB,MAChB,CASO,SAASI,GACdC,EACA9W,GAEA,GAAI,WAAY8W,EACd,OAAOA,EAGT,MAAM,OAACtP,EAAA,wBAAQH,GAA2BrH,EACpCt3B,EAAQ8sC,GAAiBhO,GACzBuP,EAAgC,eAApBruC,EAAMsuC,UAClBC,EAAWlB,GAAmBrtC,EAAO,WACrCwuC,EAAUnB,GAAmBrtC,EAAO,SAAU,UAC9C,EAACqX,EAAA,EAAGiR,EAAA,IAAGylB,GAAOJ,GAAkBS,EAAOtP,GACvCO,EAAUkP,EAASne,MAAQ2d,GAAOS,EAAQpe,MAC1CkP,EAAUiP,EAASrY,KAAO6X,GAAOS,EAAQtY,KAE/C,IAAI,MAACt0B,EAAA,OAAOs9B,GAAU5H,EAKtB,OAJI+W,IACFzsC,GAAS2sC,EAAS3sC,MAAQ4sC,EAAQ5sC,MAClCs9B,GAAUqP,EAASrP,OAASsP,EAAQtP,QAE/B,CACL7nB,EAAGzG,KAAKC,OAAOwG,EAAIgoB,GAAWz9B,EAAQk9B,EAAOl9B,MAAQ+8B,GACrDrW,EAAG1X,KAAKC,OAAOyX,EAAIgX,GAAWJ,EAASJ,EAAOI,OAASP,GAE3D,CAEA,SAAS8P,GAAiB3P,EAA2Bl9B,EAAes9B,GAClE,IAAImE,EAAkBqL,EAEtB,QAAcj5B,IAAV7T,QAAkC6T,IAAXypB,EAAsB,CAC/C,MAAMyP,EAAY7P,GAAUwN,GAAexN,GAC3C,GAAK6P,EAGE,CACL,MAAMpO,EAAOoO,EAAUX,wBACjBY,EAAiB9B,GAAiB6B,GAClCE,EAAkBxB,GAAmBuB,EAAgB,SAAU,SAC/DE,EAAmBzB,GAAmBuB,EAAgB,WAC5DhtC,EAAQ2+B,EAAK3+B,MAAQktC,EAAiBltC,MAAQitC,EAAgBjtC,MAC9Ds9B,EAASqB,EAAKrB,OAAS4P,EAAiB5P,OAAS2P,EAAgB3P,OACjEmE,EAAWqJ,GAAckC,EAAevL,SAAUsL,EAAW,eAC7DD,EAAYhC,GAAckC,EAAeF,UAAWC,EAAW,e,MAV/D/sC,EAAQk9B,EAAOiQ,YACf7P,EAASJ,EAAOkQ,Y,CAYpB,MAAO,CACLptC,QACAs9B,SACAmE,SAAUA,GAAY5Z,GACtBilB,UAAWA,GAAajlB,GAE5B,CAEA,MAAMwlB,GAAU57B,GAAczC,KAAKC,MAAU,GAAJwC,GAAU,GAG5C,SAAS67B,GACdpQ,EACAqQ,EACAC,EACAC,GAEA,MAAMrvC,EAAQ8sC,GAAiBhO,GACzBwQ,EAAUjC,GAAmBrtC,EAAO,UACpCqjC,EAAWqJ,GAAc1sC,EAAMqjC,SAAUvE,EAAQ,gBAAkBrV,GACnEilB,EAAYhC,GAAc1sC,EAAM0uC,UAAW5P,EAAQ,iBAAmBrV,GACtE8lB,EAAgBd,GAAiB3P,EAAQqQ,EAASC,GACxD,IAAI,MAACxtC,EAAA,OAAOs9B,GAAUqQ,EAEtB,GAAwB,gBAApBvvC,EAAMsuC,UAA6B,CACrC,MAAME,EAAUnB,GAAmBrtC,EAAO,SAAU,SAC9CuuC,EAAWlB,GAAmBrtC,EAAO,WAC3C4B,GAAS2sC,EAAS3sC,MAAQ4sC,EAAQ5sC,MAClCs9B,GAAUqP,EAASrP,OAASsP,EAAQtP,M,CAEtCt9B,EAAQgP,KAAK6C,IAAI,EAAG7R,EAAQ0tC,EAAQ1tC,OACpCs9B,EAAStuB,KAAK6C,IAAI,EAAG47B,EAAcztC,EAAQytC,EAAcnQ,EAASoQ,EAAQpQ,QAC1Et9B,EAAQqtC,GAAOr+B,KAAK8C,IAAI9R,EAAOyhC,EAAUkM,EAAclM,WACvDnE,EAAS+P,GAAOr+B,KAAK8C,IAAIwrB,EAAQwP,EAAWa,EAAcb,YACtD9sC,IAAUs9B,IAGZA,EAAS+P,GAAOrtC,EAAQ,IAG1B,MAAM4tC,OAA6B/5B,IAAZ05B,QAAsC15B,IAAb25B,EAOhD,OALII,GAAkBH,GAAeE,EAAcrQ,QAAUA,EAASqQ,EAAcrQ,SAClFA,EAASqQ,EAAcrQ,OACvBt9B,EAAQqtC,GAAOr+B,KAAK2Z,MAAM2U,EAASmQ,KAG9B,CAACztC,QAAOs9B,SACjB,CAQO,SAASuQ,GACdnY,EACAoY,EACAC,GAEA,MAAMC,EAAaF,GAAc,EAC3BG,EAAeZ,GAAO3X,EAAM4H,OAAS0Q,GACrCE,EAAcb,GAAO3X,EAAM11B,MAAQguC,GAExCtY,EAAuB4H,OAAS+P,GAAO3X,EAAM4H,QAC7C5H,EAAuB11B,MAAQqtC,GAAO3X,EAAM11B,OAE7C,MAAMk9B,EAASxH,EAAMwH,OAUrB,OALIA,EAAO9+B,QAAU2vC,IAAgB7Q,EAAO9+B,MAAMk/B,SAAWJ,EAAO9+B,MAAM4B,SACxEk9B,EAAO9+B,MAAMk/B,OAAS,GAAG5H,EAAM4H,WAC/BJ,EAAO9+B,MAAM4B,MAAQ,GAAG01B,EAAM11B,YAG5B01B,EAAMqH,0BAA4BiR,GAC/B9Q,EAAOI,SAAW2Q,GAClB/Q,EAAOl9B,QAAUkuC,KACrBxY,EAAuBqH,wBAA0BiR,EAClD9Q,EAAOI,OAAS2Q,EAChB/Q,EAAOl9B,MAAQkuC,EACfxY,EAAMuE,IAAIkU,aAAaH,EAAY,EAAG,EAAGA,EAAY,EAAG,IACjD,EAGX,CAOa,MAAAI,GAAgC,WAC3C,IAAIC,GAAmB,EACvB,IACE,MAAMxgC,EAAU,CACd,WAAIygC,GAEF,OADAD,GAAmB,GACZ,CACT,GAGE7D,OACF3qC,OAAO0B,iBAAiB,OAAQ,KAAMsM,GACtChO,OAAO4B,oBAAoB,OAAQ,KAAMoM,GAE7C,CAAE,MAAOiF,G,CAGT,OAAOu7B,CACT,CAlB6C,GA8BtC,SAASE,GACdpD,EACAvhB,GAEA,MAAM/kB,EAAQymC,GAASH,EAASvhB,GAC1BuY,EAAUt9B,GAASA,EAAMQ,MAAM,qBACrC,OAAO88B,GAAWA,EAAQ,QAAKtuB,CACjC,CCtRO,SAAS26B,GAAap5B,EAAWC,EAAWkM,EAAW+Y,GAC5D,MAAO,CACL7kB,EAAGL,EAAGK,EAAI8L,GAAKlM,EAAGI,EAAIL,EAAGK,GACzBiR,EAAGtR,EAAGsR,EAAInF,GAAKlM,EAAGqR,EAAItR,EAAGsR,GAE7B,CAKO,SAAS+nB,GACdr5B,EACAC,EACAkM,EAAW+Y,GAEX,MAAO,CACL7kB,EAAGL,EAAGK,EAAI8L,GAAKlM,EAAGI,EAAIL,EAAGK,GACzBiR,EAAY,WAAT4T,EAAoB/Y,EAAI,GAAMnM,EAAGsR,EAAIrR,EAAGqR,EAC9B,UAAT4T,EAAmB/Y,EAAI,EAAInM,EAAGsR,EAAIrR,EAAGqR,EACnCnF,EAAI,EAAIlM,EAAGqR,EAAItR,EAAGsR,EAE5B,CAKO,SAASgoB,GAAqBt5B,EAAiBC,EAAiBkM,EAAW+Y,GAChF,MAAMqU,EAAM,CAACl5B,EAAGL,EAAGuqB,KAAMjZ,EAAGtR,EAAGyqB,MACzB+O,EAAM,CAACn5B,EAAGJ,EAAGqqB,KAAMhZ,EAAGrR,EAAGuqB,MACzBltB,EAAI87B,GAAap5B,EAAIu5B,EAAKptB,GAC1B5O,EAAI67B,GAAaG,EAAKC,EAAKrtB,GAC3B3O,EAAI47B,GAAaI,EAAKv5B,EAAIkM,GAC1B1O,EAAI27B,GAAa97B,EAAGC,EAAG4O,GACvBzO,EAAI07B,GAAa77B,EAAGC,EAAG2O,GAC7B,OAAOitB,GAAa37B,EAAGC,EAAGyO,EAC5B,CChCA,MAAMstB,GAAwB,SAASC,EAAe9uC,GACpD,MAAO,CACLyV,CAAAA,CAAEA,GACA,OAAOq5B,EAAQA,EAAQ9uC,EAAQyV,CACjC,EACAs5B,QAAAA,CAAS16B,GACPrU,EAAQqU,CACV,EACA6rB,SAAAA,CAAU7R,GACR,MAAc,WAAVA,EACKA,EAEQ,UAAVA,EAAoB,OAAS,OACtC,EACA2gB,KAAAA,CAAMv5B,EAAG5Q,GACP,OAAO4Q,EAAI5Q,CACb,EACAoqC,UAAAA,CAAWx5B,EAAGy5B,GACZ,OAAOz5B,EAAIy5B,CACb,EAEJ,EAEMC,GAAwB,WAC5B,MAAO,CACL15B,CAAAA,CAAEA,GACA,OAAOA,CACT,EACAs5B,QAAAA,CAAS16B,GAAI,EAEb6rB,SAAAA,CAAU7R,GACR,OAAOA,CACT,EACA2gB,KAAAA,CAAMv5B,EAAG5Q,GACP,OAAO4Q,EAAI5Q,CACb,EACAoqC,UAAAA,CAAWx5B,EAAG25B,GACZ,OAAO35B,CACT,EAEJ,EAEO,SAAS45B,GAAc3gB,EAAcogB,EAAe9uC,GACzD,OAAO0uB,EAAMmgB,GAAsBC,EAAO9uC,GAASmvC,IACrD,CAEO,SAASG,GAAsBrV,EAA+BsV,GACnE,IAAInxC,EAA4BoxC,EACd,QAAdD,GAAqC,QAAdA,IACzBnxC,EAAQ67B,EAAIiD,OAAO9+B,MACnBoxC,EAAW,CACTpxC,EAAMmtC,iBAAiB,aACvBntC,EAAMqxC,oBAAoB,cAG5BrxC,EAAMsxC,YAAY,YAAaH,EAAW,aACzCtV,EAAiD0V,kBAAoBH,EAE1E,CAEO,SAASI,GAAqB3V,EAA+BuV,QACjD37B,IAAb27B,WACMvV,EAAiD0V,kBACzD1V,EAAIiD,OAAO9+B,MAAMsxC,YAAY,YAAaF,EAAS,GAAIA,EAAS,IAEpE,CC/DA,SAASK,GAAWjmB,GAClB,MAAiB,UAAbA,EACK,CACLkmB,QAAS9kB,GACT+kB,QAASjlB,GACTklB,UAAWjlB,IAGR,CACL+kB,QAASrkB,GACTskB,QAASA,CAACr9B,EAAGC,IAAMD,EAAIC,EACvBq9B,UAAWv6B,GAAKA,EAEpB,CAEA,SAASw6B,IAAiB,MAAC5pC,EAAK,IAAE4kB,EAAG,MAAE7c,EAAK,KAAEgD,EAAI,MAAEhT,IAClD,MAAO,CACLiI,MAAOA,EAAQ+H,EACf6c,IAAKA,EAAM7c,EACXgD,KAAMA,IAAS6Z,EAAM5kB,EAAQ,GAAK+H,IAAU,EAC5ChQ,QAEJ,CAEA,SAAS8xC,GAAWC,EAASrhB,EAAQ8H,GACnC,MAAM,SAAChN,EAAUvjB,MAAO+pC,EAAYnlB,IAAKolB,GAAYzZ,GAC/C,QAACkZ,EAAO,UAAEE,GAAaH,GAAWjmB,GAClCxb,EAAQ0gB,EAAOroB,OAErB,IACI8N,EAAG8Q,GADH,MAAChf,EAAK,IAAE4kB,EAAA,KAAK7Z,GAAQ++B,EAGzB,GAAI/+B,EAAM,CAGR,IAFA/K,GAAS+H,EACT6c,GAAO7c,EACFmG,EAAI,EAAG8Q,EAAOjX,EAAOmG,EAAI8Q,IAAQ9Q,EAAG,CACvC,IAAKu7B,EAAQE,EAAUlhB,EAAOzoB,EAAQ+H,GAAOwb,IAAYwmB,EAAYC,GACnE,MAEFhqC,IACA4kB,GACF,CACA5kB,GAAS+H,EACT6c,GAAO7c,C,CAMT,OAHI6c,EAAM5kB,IACR4kB,GAAO7c,GAEF,CAAC/H,QAAO4kB,MAAK7Z,OAAMhT,MAAO+xC,EAAQ/xC,MAC3C,CAgBO,SAASkyC,GAAcH,EAASrhB,EAAQ8H,GAC7C,IAAKA,EACH,MAAO,CAACuZ,GAGV,MAAM,SAACvmB,EAAUvjB,MAAO+pC,EAAYnlB,IAAKolB,GAAYzZ,EAC/CxoB,EAAQ0gB,EAAOroB,QACf,QAACspC,EAAA,QAASD,EAAA,UAASE,GAAaH,GAAWjmB,IAC3C,MAACvjB,EAAA,IAAO4kB,EAAA,KAAK7Z,EAAA,MAAMhT,GAAS8xC,GAAWC,EAASrhB,EAAQ8H,GAExD7N,EAAS,GACf,IAEIlkB,EAAOirB,EAAOygB,EAFdC,GAAS,EACTC,EAAW,KAGf,MAAMC,EAAgBA,IAAMZ,EAAQM,EAAYG,EAAW1rC,IAA6C,IAAnCkrC,EAAQK,EAAYG,GACnFI,EAAcA,IAAmC,IAA7BZ,EAAQM,EAAUxrC,IAAgBirC,EAAQO,EAAUE,EAAW1rC,GACnF+rC,EAAcA,IAAMJ,GAAUE,IAC9BG,EAAaA,KAAOL,GAAUG,IAEpC,IAAK,IAAIp8B,EAAIlO,EAAOikC,EAAOjkC,EAAOkO,GAAK0W,IAAO1W,EAC5Cub,EAAQhB,EAAOva,EAAInG,GAEf0hB,EAAMiY,OAIVljC,EAAQmrC,EAAUlgB,EAAMlG,IAEpB/kB,IAAU0rC,IAIdC,EAASV,EAAQjrC,EAAOurC,EAAYC,GAEnB,OAAbI,GAAqBG,MACvBH,EAA0C,IAA/BV,EAAQlrC,EAAOurC,GAAoB77B,EAAI+1B,GAGnC,OAAbmG,GAAqBI,MACvB9nB,EAAOhC,KAAKkpB,GAAiB,CAAC5pC,MAAOoqC,EAAUxlB,IAAK1W,EAAGnD,OAAMhD,QAAOhQ,WACpEqyC,EAAW,MAEbnG,EAAO/1B,EACPg8B,EAAY1rC,IAOd,OAJiB,OAAb4rC,GACF1nB,EAAOhC,KAAKkpB,GAAiB,CAAC5pC,MAAOoqC,EAAUxlB,MAAK7Z,OAAMhD,QAAOhQ,WAG5D2qB,CACT,CAYO,SAAS+nB,GAAezQ,EAAMzJ,GACnC,MAAM7N,EAAS,GACTgoB,EAAW1Q,EAAK0Q,SAEtB,IAAK,IAAIx8B,EAAI,EAAGA,EAAIw8B,EAAStqC,OAAQ8N,IAAK,CACxC,MAAMy8B,EAAMV,GAAcS,EAASx8B,GAAI8rB,EAAKvR,OAAQ8H,GAChDoa,EAAIvqC,QACNsiB,EAAOhC,QAAQiqB,EAEnB,CACA,OAAOjoB,CACT,CAKA,SAASkoB,GAAgBniB,EAAQ1gB,EAAOgD,EAAMie,GAC5C,IAAIhpB,EAAQ,EACR4kB,EAAM7c,EAAQ,EAElB,GAAIgD,IAASie,EAEX,MAAOhpB,EAAQ+H,IAAU0gB,EAAOzoB,GAAO0hC,KACrC1hC,IAKJ,MAAOA,EAAQ+H,GAAS0gB,EAAOzoB,GAAO0hC,KACpC1hC,IAIFA,GAAS+H,EAELgD,IAEF6Z,GAAO5kB,GAGT,MAAO4kB,EAAM5kB,GAASyoB,EAAO7D,EAAM7c,GAAO25B,KACxC9c,IAMF,OAFAA,GAAO7c,EAEA,CAAC/H,QAAO4kB,MACjB,CASA,SAASimB,GAAcpiB,EAAQzoB,EAAOwL,EAAKT,GACzC,MAAMhD,EAAQ0gB,EAAOroB,OACfsiB,EAAS,GACf,IAEIkC,EAFAgB,EAAO5lB,EACPikC,EAAOxb,EAAOzoB,GAGlB,IAAK4kB,EAAM5kB,EAAQ,EAAG4kB,GAAOpZ,IAAOoZ,EAAK,CACvC,MAAMkmB,EAAMriB,EAAO7D,EAAM7c,GACrB+iC,EAAIpJ,MAAQoJ,EAAIC,KACb9G,EAAKvC,OACR32B,GAAO,EACP2X,EAAOhC,KAAK,CAAC1gB,MAAOA,EAAQ+H,EAAO6c,KAAMA,EAAM,GAAK7c,EAAOgD,SAE3D/K,EAAQ4lB,EAAOklB,EAAIC,KAAOnmB,EAAM,OAGlCgB,EAAOhB,EACHqf,EAAKvC,OACP1hC,EAAQ4kB,IAGZqf,EAAO6G,CACT,CAMA,OAJa,OAATllB,GACFlD,EAAOhC,KAAK,CAAC1gB,MAAOA,EAAQ+H,EAAO6c,IAAKgB,EAAO7d,EAAOgD,SAGjD2X,CACT,CAUO,SAASsoB,GAAiBhR,EAAMiR,GACrC,MAAMxiB,EAASuR,EAAKvR,OACdO,EAAWgR,EAAKxyB,QAAQwhB,SACxBjhB,EAAQ0gB,EAAOroB,OAErB,IAAK2H,EACH,MAAO,GAGT,MAAMgD,IAASivB,EAAKkR,OACd,MAAClrC,EAAA,IAAO4kB,GAAOgmB,GAAgBniB,EAAQ1gB,EAAOgD,EAAMie,GAE1D,IAAiB,IAAbA,EACF,OAAOmiB,GAAcnR,EAAM,CAAC,CAACh6B,QAAO4kB,MAAK7Z,SAAQ0d,EAAQwiB,GAG3D,MAAMz/B,EAAMoZ,EAAM5kB,EAAQ4kB,EAAM7c,EAAQ6c,EAClCwmB,IAAiBpR,EAAKqR,WAAuB,IAAVrrC,GAAe4kB,IAAQ7c,EAAQ,EACxE,OAAOojC,GAAcnR,EAAM6Q,GAAcpiB,EAAQzoB,EAAOwL,EAAK4/B,GAAe3iB,EAAQwiB,EACtF,CAQA,SAASE,GAAcnR,EAAM0Q,EAAUjiB,EAAQwiB,GAC7C,OAAKA,GAAmBA,EAAe5L,YAAe5W,EAG/C6iB,GAAgBtR,EAAM0Q,EAAUjiB,EAAQwiB,GAFtCP,CAGX,CASA,SAASY,GAAgBtR,EAAM0Q,EAAUjiB,EAAQwiB,GAC/C,MAAMM,EAAevR,EAAKwR,OAAO1U,aAC3B2U,EAAYC,GAAU1R,EAAKxyB,UAC1BmkC,cAAexsB,EAAc3X,SAAS,SAACwhB,IAAagR,EACrDjyB,EAAQ0gB,EAAOroB,OACfsiB,EAAS,GACf,IAAIkpB,EAAYH,EACZzrC,EAAQ0qC,EAAS,GAAG1qC,MACpBkO,EAAIlO,EAER,SAAS6rC,EAASl+B,EAAGlB,EAAGnB,EAAGwgC,GACzB,MAAMC,EAAM/iB,GAAY,EAAI,EAC5B,GAAIrb,IAAMlB,EAAV,CAIAkB,GAAK5F,EACL,MAAO0gB,EAAO9a,EAAI5F,GAAO25B,KACvB/zB,GAAKo+B,EAEP,MAAOtjB,EAAOhc,EAAI1E,GAAO25B,KACvBj1B,GAAKs/B,EAEHp+B,EAAI5F,IAAU0E,EAAI1E,IACpB2a,EAAOhC,KAAK,CAAC1gB,MAAO2N,EAAI5F,EAAO6c,IAAKnY,EAAI1E,EAAOgD,KAAMO,EAAGvT,MAAO+zC,IAC/DF,EAAYE,EACZ9rC,EAAQyM,EAAI1E,E,CAEhB,CAEA,IAAK,MAAM+hC,KAAWY,EAAU,CAC9B1qC,EAAQgpB,EAAWhpB,EAAQ8pC,EAAQ9pC,MACnC,IACIjI,EADAksC,EAAOxb,EAAOzoB,EAAQ+H,GAE1B,IAAKmG,EAAIlO,EAAQ,EAAGkO,GAAK47B,EAAQllB,IAAK1W,IAAK,CACzC,MAAMu1B,EAAKhb,EAAOva,EAAInG,GACtBhQ,EAAQ2zC,GAAUT,EAAe5L,WAAWlC,GAAcoO,EAAc,CACtEvyC,KAAM,UACNgzC,GAAI/H,EACJl1B,GAAI00B,EACJwI,aAAc/9B,EAAI,GAAKnG,EACvBmkC,YAAah+B,EAAInG,EACjBoX,mBAEEgtB,GAAap0C,EAAO6zC,IACtBC,EAAS7rC,EAAOkO,EAAI,EAAG47B,EAAQ/+B,KAAM6gC,GAEvC3H,EAAOR,EACPmI,EAAY7zC,CACd,CACIiI,EAAQkO,EAAI,GACd29B,EAAS7rC,EAAOkO,EAAI,EAAG47B,EAAQ/+B,KAAM6gC,EAEzC,CAEA,OAAOlpB,CACT,CAEA,SAASgpB,GAAUlkC,GACjB,MAAO,CACLsrB,gBAAiBtrB,EAAQsrB,gBACzBsZ,eAAgB5kC,EAAQ4kC,eACxBC,WAAY7kC,EAAQ6kC,WACpBC,iBAAkB9kC,EAAQ8kC,iBAC1BC,gBAAiB/kC,EAAQ+kC,gBACzB/T,YAAahxB,EAAQgxB,YACrBzF,YAAavrB,EAAQurB,YAEzB,CAEA,SAASoZ,GAAap0C,EAAO6zC,GAC3B,IAAKA,EACH,OAAO,EAET,MAAM5V,EAAQ,GACRwW,EAAW,SAASr0C,EAAKqG,GAC7B,OAAKkuB,GAAoBluB,IAGpBw3B,EAAM/F,SAASzxB,IAClBw3B,EAAMtV,KAAKliB,GAENw3B,EAAMvW,QAAQjhB,IALZA,CAMX,EACA,OAAOgwB,KAAKC,UAAU12B,EAAOy0C,KAAche,KAAKC,UAAUmd,EAAWY,EACvE,CCzWA,SAASC,GAAehY,EAAciY,EAAsBC,GAC1D,OAAOlY,EAAMjtB,QAAQgpB,KAAOiE,EAAMkY,GAASD,EAAUC,EACvD,CAEA,SAASC,GAAepkB,EAAiBkkB,GACvC,MAAM,OAAC9iB,EAAA,OAAQC,GAAUrB,EACzB,OAAIoB,GAAUC,EACL,CACL1B,KAAMskB,GAAe7iB,EAAQ8iB,EAAW,QACxCtkB,MAAOqkB,GAAe7iB,EAAQ8iB,EAAW,SACzCze,IAAKwe,GAAe5iB,EAAQ6iB,EAAW,OACvCxe,OAAQue,GAAe5iB,EAAQ6iB,EAAW,WAGvCA,CACT,CAEO,SAASG,GAAmBxd,EAAc7G,GAC/C,MAAMgI,EAAOhI,EAAKskB,MAClB,GAAItc,EAAK70B,SACP,OAAO,EAET,MAAMg9B,EAAOiU,GAAepkB,EAAM6G,EAAMqd,WAExC,MAAO,CACLvkB,MAAoB,IAAdqI,EAAKrI,KAAiB,EAAIwQ,EAAKxQ,OAAsB,IAAdqI,EAAKrI,KAAgB,EAAIqI,EAAKrI,MAC3EC,OAAsB,IAAfoI,EAAKpI,MAAkBiH,EAAM11B,MAAQg/B,EAAKvQ,QAAwB,IAAfoI,EAAKpI,MAAiB,EAAIoI,EAAKpI,OACzF6F,KAAkB,IAAbuC,EAAKvC,IAAgB,EAAI0K,EAAK1K,MAAoB,IAAbuC,EAAKvC,IAAe,EAAIuC,EAAKvC,KACvEC,QAAwB,IAAhBsC,EAAKtC,OAAmBmB,EAAM4H,OAAS0B,EAAKzK,SAA0B,IAAhBsC,EAAKtC,OAAkB,EAAIsC,EAAKtC,QAElG;;;;;;;ACrBO,MAAM6e,GACXjxB,WAAAA,GACEpiB,KAAKszC,SAAW,KAChBtzC,KAAKuzC,QAAU,IAAI7e,IACnB10B,KAAKwzC,UAAW,EAChBxzC,KAAKyzC,eAAY3/B,CACnB,CAKA4/B,OAAAA,CAAQ/d,EAAOge,EAAO1uC,EAAM3F,GAC1B,MAAMs0C,EAAYD,EAAMhnB,UAAUrtB,GAC5Bu0C,EAAWF,EAAMrgB,SAEvBsgB,EAAU7mB,QAAQlI,GAAMA,EAAG,CACzB8Q,QACAme,QAASH,EAAMG,QACfD,WACAE,YAAa9kC,KAAK8C,IAAI9M,EAAO0uC,EAAMrtC,MAAOutC,KAE9C,CAKAG,QAAAA,GACMh0C,KAAKszC,WAGTtzC,KAAKwzC,UAAW,EAEhBxzC,KAAKszC,SAAW3lB,GAAiB5J,KAAKjkB,OAAQ,KAC5CE,KAAKi0C,UACLj0C,KAAKszC,SAAW,KAEZtzC,KAAKwzC,UACPxzC,KAAKg0C,aAGX,CAKAC,OAAAA,CAAQhvC,EAAOS,KAAKwuC,OAClB,IAAIC,EAAY,EAEhBn0C,KAAKuzC,QAAQxmB,QAAQ,CAAC4mB,EAAOhe,KAC3B,IAAKge,EAAMS,UAAYT,EAAMnmB,MAAM9mB,OACjC,OAEF,MAAM8mB,EAAQmmB,EAAMnmB,MACpB,IAEIhvB,EAFAgW,EAAIgZ,EAAM9mB,OAAS,EACnB2tC,GAAO,EAGX,KAAO7/B,GAAK,IAAKA,EACfhW,EAAOgvB,EAAMhZ,GAEThW,EAAK81C,SACH91C,EAAK+1C,OAASZ,EAAMrgB,WAGtBqgB,EAAMrgB,SAAW90B,EAAK+1C,QAExB/1C,EAAKg2C,KAAKvvC,GACVovC,GAAO,IAIP7mB,EAAMhZ,GAAKgZ,EAAMA,EAAM9mB,OAAS,GAChC8mB,EAAMrE,OAINkrB,IACF1e,EAAM0e,OACNr0C,KAAK0zC,QAAQ/d,EAAOge,EAAO1uC,EAAM,aAG9BuoB,EAAM9mB,SACTitC,EAAMS,SAAU,EAChBp0C,KAAK0zC,QAAQ/d,EAAOge,EAAO1uC,EAAM,YACjC0uC,EAAMG,SAAU,GAGlBK,GAAa3mB,EAAM9mB,SAGrB1G,KAAKyzC,UAAYxuC,EAEC,IAAdkvC,IACFn0C,KAAKwzC,UAAW,EAEpB,CAKAiB,SAAAA,CAAU9e,GACR,MAAM+e,EAAS10C,KAAKuzC,QACpB,IAAII,EAAQe,EAAOzf,IAAIU,GAavB,OAZKge,IACHA,EAAQ,CACNS,SAAS,EACTN,SAAS,EACTtmB,MAAO,GACPb,UAAW,CACTgoB,SAAU,GACVC,SAAU,KAGdF,EAAOjnB,IAAIkI,EAAOge,IAEbA,CACT,CAOAkB,MAAAA,CAAOlf,EAAO8W,EAAOqI,GACnB90C,KAAKy0C,UAAU9e,GAAOhJ,UAAU8f,GAAOzlB,KAAK8tB,EAC9C,CAOAxzC,GAAAA,CAAIq0B,EAAOnI,GACJA,GAAUA,EAAM9mB,QAGrB1G,KAAKy0C,UAAU9e,GAAOnI,MAAMxG,QAAQwG,EACtC,CAMA/F,GAAAA,CAAIkO,GACF,OAAO31B,KAAKy0C,UAAU9e,GAAOnI,MAAM9mB,OAAS,CAC9C,CAMAJ,KAAAA,CAAMqvB,GACJ,MAAMge,EAAQ3zC,KAAKuzC,QAAQte,IAAIU,GAC1Bge,IAGLA,EAAMS,SAAU,EAChBT,EAAMrtC,MAAQZ,KAAKwuC,MACnBP,EAAMrgB,SAAWqgB,EAAMnmB,MAAMunB,OAAO,CAACC,EAAK5D,IAAQniC,KAAK6C,IAAIkjC,EAAK5D,EAAI6D,WAAY,GAChFj1C,KAAKg0C,WACP,CAEAI,OAAAA,CAAQze,GACN,IAAK31B,KAAKwzC,SACR,OAAO,EAET,MAAMG,EAAQ3zC,KAAKuzC,QAAQte,IAAIU,GAC/B,SAAKge,GAAUA,EAAMS,SAAYT,EAAMnmB,MAAM9mB,OAI/C,CAMA2qC,IAAAA,CAAK1b,GACH,MAAMge,EAAQ3zC,KAAKuzC,QAAQte,IAAIU,GAC/B,IAAKge,IAAUA,EAAMnmB,MAAM9mB,OACzB,OAEF,MAAM8mB,EAAQmmB,EAAMnmB,MACpB,IAAIhZ,EAAIgZ,EAAM9mB,OAAS,EAEvB,KAAO8N,GAAK,IAAKA,EACfgZ,EAAMhZ,GAAG0gC,SAEXvB,EAAMnmB,MAAQ,GACdxtB,KAAK0zC,QAAQ/d,EAAOge,EAAOjuC,KAAKwuC,MAAO,WACzC,CAMAhzC,MAAAA,CAAOy0B,GACL,OAAO31B,KAAKuzC,QAAQ3M,OAAOjR,EAC7B,EAIF,IAAAwf,GAA+B,IAAI9B,GCjNnC,MAAMvyB,GAAc,cACds0B,GAAgB,CACpBC,OAAAA,CAAQ5uC,EAAM0a,EAAIm0B,GAChB,OAAOA,EAAS,GAAMn0B,EAAK1a,CAC7B,EAMAic,KAAAA,CAAMjc,EAAM0a,EAAIm0B,GACd,MAAMC,EAAK7yB,GAAajc,GAAQqa,IAC1B8B,EAAK2yB,EAAGhzB,OAASG,GAAavB,GAAML,IAC1C,OAAO8B,GAAMA,EAAGL,MACZK,EAAGH,IAAI8yB,EAAID,GAAQzhC,YACnBsN,CACN,EACAq0B,MAAAA,CAAO/uC,EAAM0a,EAAIm0B,GACf,OAAO7uC,GAAQ0a,EAAK1a,GAAQ6uC,CAC9B,GAGa,MAAMG,GACnBrzB,WAAAA,CAAYszB,EAAK/vB,EAAQ8c,EAAMthB,GAC7B,MAAMw0B,EAAehwB,EAAO8c,GAE5BthB,EAAK8hB,GAAQ,CAACyS,EAAIv0B,GAAIA,EAAIw0B,EAAcD,EAAIjvC,OAC5C,MAAMA,EAAOw8B,GAAQ,CAACyS,EAAIjvC,KAAMkvC,EAAcx0B,IAE9CnhB,KAAKs0C,SAAU,EACft0C,KAAK41C,IAAMF,EAAI7wB,IAAMuwB,GAAcM,EAAIp2C,aAAemH,GACtDzG,KAAK61C,QAAU9kB,GAAQ2kB,EAAIniB,SAAWxC,GAAQC,OAC9ChxB,KAAK81C,OAAS7mC,KAAK2Z,MAAMljB,KAAKwuC,OAASwB,EAAIznB,OAAS,IACpDjuB,KAAKi1C,UAAYj1C,KAAKu0C,OAAStlC,KAAK2Z,MAAM8sB,EAAIpiB,UAC9CtzB,KAAKwxC,QAAUkE,EAAIrkC,KACnBrR,KAAK+1C,QAAUpwB,EACf3lB,KAAKg2C,MAAQvT,EACbziC,KAAKi2C,MAAQxvC,EACbzG,KAAKk2C,IAAM/0B,EACXnhB,KAAKm2C,eAAYriC,CACnB,CAEA+f,MAAAA,GACE,OAAO7zB,KAAKs0C,OACd,CAEA8B,MAAAA,CAAOV,EAAKv0B,EAAIlc,GACd,GAAIjF,KAAKs0C,QAAS,CAChBt0C,KAAK0zC,SAAQ,GAEb,MAAMiC,EAAe31C,KAAK+1C,QAAQ/1C,KAAKg2C,OACjCK,EAAUpxC,EAAOjF,KAAK81C,OACtBzf,EAASr2B,KAAKi1C,UAAYoB,EAChCr2C,KAAK81C,OAAS7wC,EACdjF,KAAKi1C,UAAYhmC,KAAK2Z,MAAM3Z,KAAK6C,IAAIukB,EAAQqf,EAAIpiB,WACjDtzB,KAAKu0C,QAAU8B,EACfr2C,KAAKwxC,QAAUkE,EAAIrkC,KACnBrR,KAAKk2C,IAAMjT,GAAQ,CAACyS,EAAIv0B,GAAIA,EAAIw0B,EAAcD,EAAIjvC,OAClDzG,KAAKi2C,MAAQhT,GAAQ,CAACyS,EAAIjvC,KAAMkvC,EAAcx0B,G,CAElD,CAEA+zB,MAAAA,GACMl1C,KAAKs0C,UAEPt0C,KAAKw0C,KAAK9uC,KAAKwuC,OACfl0C,KAAKs0C,SAAU,EACft0C,KAAK0zC,SAAQ,GAEjB,CAEAc,IAAAA,CAAKvvC,GACH,MAAMoxC,EAAUpxC,EAAOjF,KAAK81C,OACtBxiB,EAAWtzB,KAAKi1C,UAChBxS,EAAOziC,KAAKg2C,MACZvvC,EAAOzG,KAAKi2C,MACZ5kC,EAAOrR,KAAKwxC,MACZrwB,EAAKnhB,KAAKk2C,IAChB,IAAIZ,EAIJ,GAFAt1C,KAAKs0C,QAAU7tC,IAAS0a,IAAO9P,GAASglC,EAAU/iB,IAE7CtzB,KAAKs0C,QAGR,OAFAt0C,KAAK+1C,QAAQtT,GAAQthB,OACrBnhB,KAAK0zC,SAAQ,GAIX2C,EAAU,EACZr2C,KAAK+1C,QAAQtT,GAAQh8B,GAIvB6uC,EAAUe,EAAU/iB,EAAY,EAChCgiB,EAASjkC,GAAQikC,EAAS,EAAI,EAAIA,EAASA,EAC3CA,EAASt1C,KAAK61C,QAAQ5mC,KAAK8C,IAAI,EAAG9C,KAAK6C,IAAI,EAAGwjC,KAE9Ct1C,KAAK+1C,QAAQtT,GAAQziC,KAAK41C,IAAInvC,EAAM0a,EAAIm0B,GAC1C,CAEAgB,IAAAA,GACE,MAAMC,EAAWv2C,KAAKm2C,YAAcn2C,KAAKm2C,UAAY,IACrD,OAAO,IAAIK,QAAQ,CAACtpB,EAAKupB,KACvBF,EAASvvB,KAAK,CAACkG,MAAKupB,SAExB,CAEA/C,OAAAA,CAAQgD,GACN,MAAM1pB,EAAS0pB,EAAW,MAAQ,MAC5BH,EAAWv2C,KAAKm2C,WAAa,GACnC,IAAK,IAAI3hC,EAAI,EAAGA,EAAI+hC,EAAS7vC,OAAQ8N,IACnC+hC,EAAS/hC,GAAGwY,IAEhB,EChHa,MAAM2pB,GACnBv0B,WAAAA,CAAYuT,EAAOihB,GACjB52C,KAAK8xC,OAASnc,EACd31B,KAAK62C,YAAc,IAAIniB,IACvB10B,KAAK82C,UAAUF,EACjB,CAEAE,SAAAA,CAAUF,GACR,IAAK3yB,GAAS2yB,GACZ,OAGF,MAAMG,EAAmB/oC,OAAOC,KAAKolB,GAASS,WACxCkjB,EAAgBh3C,KAAK62C,YAE3B7oC,OAAOipC,oBAAoBL,GAAQ7pB,QAAQtuB,IACzC,MAAMi3C,EAAMkB,EAAOn4C,GACnB,IAAKwlB,GAASyxB,GACZ,OAEF,MAAMgB,EAAW,CAAC,EAClB,IAAK,MAAMQ,KAAUH,EACnBL,EAASQ,GAAUxB,EAAIwB,IAGxBtiC,GAAQ8gC,EAAI9hB,aAAe8hB,EAAI9hB,YAAc,CAACn1B,IAAMsuB,QAAS0V,IACxDA,IAAShkC,GAAQu4C,EAAcvvB,IAAIgb,IACrCuU,EAAcvpB,IAAIgV,EAAMiU,MAIhC,CAMAS,eAAAA,CAAgBxxB,EAAQ2G,GACtB,MAAM8qB,EAAa9qB,EAAOxe,QACpBA,EAAUupC,GAAqB1xB,EAAQyxB,GAC7C,IAAKtpC,EACH,MAAO,GAGT,MAAMmmB,EAAaj0B,KAAKs3C,kBAAkBxpC,EAASspC,GAYnD,OAXIA,EAAWG,SAIbC,GAAS7xB,EAAO7X,QAAQ2pC,YAAaL,GAAYM,KAAK,KACpD/xB,EAAO7X,QAAUspC,GAChB,QAKEnjB,CACT,CAKAqjB,iBAAAA,CAAkB3xB,EAAQ2G,GACxB,MAAM0qB,EAAgBh3C,KAAK62C,YACrB5iB,EAAa,GACbmgB,EAAUzuB,EAAO8xB,cAAgB9xB,EAAO8xB,YAAc,CAAC,GACvDp4C,EAAQ2O,OAAOC,KAAKqe,GACpBrnB,EAAOS,KAAKwuC,MAClB,IAAI1/B,EAEJ,IAAKA,EAAInV,EAAMqH,OAAS,EAAG8N,GAAK,IAAKA,EAAG,CACtC,MAAMiuB,EAAOpjC,EAAMmV,GACnB,GAAuB,MAAnBiuB,EAAKvgB,OAAO,GACd,SAGF,GAAa,YAATugB,EAAoB,CACtBxO,EAAWjN,QAAQhnB,KAAKm3C,gBAAgBxxB,EAAQ2G,IAChD,Q,CAEF,MAAMxnB,EAAQwnB,EAAOmW,GACrB,IAAI3O,EAAYsgB,EAAQ3R,GACxB,MAAMiT,EAAMsB,EAAc/hB,IAAIwN,GAE9B,GAAI3O,EAAW,CACb,GAAI4hB,GAAO5hB,EAAUD,SAAU,CAE7BC,EAAUsiB,OAAOV,EAAK5wC,EAAOG,GAC7B,Q,CAEA6uB,EAAUohB,Q,CAGTQ,GAAQA,EAAIpiB,UAMjB8gB,EAAQ3R,GAAQ3O,EAAY,IAAI2hB,GAAUC,EAAK/vB,EAAQ8c,EAAM39B,GAC7DmvB,EAAWjN,KAAK8M,IALdnO,EAAO8c,GAAQ39B,CAMnB,CACA,OAAOmvB,CACT,CASAmiB,MAAAA,CAAOzwB,EAAQ2G,GACb,GAA8B,IAA1BtsB,KAAK62C,YAAYxpC,KAGnB,YADAW,OAAO8T,OAAO6D,EAAQ2G,GAIxB,MAAM2H,EAAaj0B,KAAKs3C,kBAAkB3xB,EAAQ2G,GAElD,OAAI2H,EAAWvtB,QACbyuC,GAAS7zC,IAAItB,KAAK8xC,OAAQ7d,IACnB,QAFT,CAIF,EAGF,SAASujB,GAASvjB,EAAYL,GAC5B,MAAMwgB,EAAU,GACVnmC,EAAOD,OAAOC,KAAK2lB,GACzB,IAAK,IAAIpf,EAAI,EAAGA,EAAIvG,EAAKvH,OAAQ8N,IAAK,CACpC,MAAMmjC,EAAO1jB,EAAWhmB,EAAKuG,IACzBmjC,GAAQA,EAAK9jB,UACfugB,EAAQptB,KAAK2wB,EAAKrB,OAEtB,CAEA,OAAOE,QAAQoB,IAAIxD,EACrB,CAEA,SAASiD,GAAqB1xB,EAAQyxB,GACpC,IAAKA,EACH,OAEF,IAAItpC,EAAU6X,EAAO7X,QACrB,GAAKA,EASL,OALIA,EAAQypC,UAGV5xB,EAAO7X,QAAUA,EAAUE,OAAO8T,OAAO,CAAC,EAAGhU,EAAS,CAACypC,SAAS,EAAOE,YAAa,CAAC,KAEhF3pC,EARL6X,EAAO7X,QAAUspC,CASrB,CCtJA,SAASS,GAAU9c,EAAO+c,GACxB,MAAM9X,EAAOjF,GAASA,EAAMjtB,SAAW,CAAC,EAClCoX,EAAU8a,EAAK9a,QACfnT,OAAmB+B,IAAbksB,EAAKjuB,IAAoB+lC,EAAkB,EACjDhmC,OAAmBgC,IAAbksB,EAAKluB,IAAoBgmC,EAAkB,EACvD,MAAO,CACLxxC,MAAO4e,EAAUpT,EAAMC,EACvBmZ,IAAKhG,EAAUnT,EAAMD,EAEzB,CAEA,SAASimC,GAAY7nB,EAAQC,EAAQ2nB,GACnC,IAAwB,IAApBA,EACF,OAAO,EAET,MAAMpiC,EAAImiC,GAAU3nB,EAAQ4nB,GACtBnxB,EAAIkxB,GAAU1nB,EAAQ2nB,GAE5B,MAAO,CACLvjB,IAAK5N,EAAEuE,IACPwD,MAAOhZ,EAAEwV,IACTsJ,OAAQ7N,EAAErgB,MACVmoB,KAAM/Y,EAAEpP,MAEZ,CAEA,SAAS0xC,GAAOlzC,GACd,IAAI0c,EAAGlO,EAAGV,EAAGhB,EAWb,OATIqS,GAASnf,IACX0c,EAAI1c,EAAMyvB,IACVjhB,EAAIxO,EAAM4pB,MACV9b,EAAI9N,EAAM0vB,OACV5iB,EAAI9M,EAAM2pB,MAEVjN,EAAIlO,EAAIV,EAAIhB,EAAI9M,EAGX,CACLyvB,IAAK/S,EACLkN,MAAOpb,EACPkhB,OAAQ5hB,EACR6b,KAAM7c,EACN3P,UAAoB,IAAV6C,EAEd,CAEA,SAASmzC,GAAwBtiB,EAAOuiB,GACtC,MAAMjqC,EAAO,GACPkqC,EAAWxiB,EAAMyiB,uBAAuBF,GAC9C,IAAI1jC,EAAG8Q,EAEP,IAAK9Q,EAAI,EAAG8Q,EAAO6yB,EAASzxC,OAAQ8N,EAAI8Q,IAAQ9Q,EAC9CvG,EAAK+Y,KAAKmxB,EAAS3jC,GAAG9V,OAExB,OAAOuP,CACT,CAEA,SAASoqC,GAAWC,EAAOxzC,EAAOyzC,EAASzqC,EAAU,CAAC,GACpD,MAAMG,EAAOqqC,EAAMrqC,KACbuqC,EAA8B,WAAjB1qC,EAAQysB,KAC3B,IAAI/lB,EAAG8Q,EAAMG,EAAcgzB,EAE3B,GAAc,OAAV3zC,EACF,OAGF,IAAI4zC,GAAQ,EACZ,IAAKlkC,EAAI,EAAG8Q,EAAOrX,EAAKvH,OAAQ8N,EAAI8Q,IAAQ9Q,EAAG,CAE7C,GADAiR,GAAgBxX,EAAKuG,GACjBiR,IAAiB8yB,EAAS,CAE5B,GADAG,GAAQ,EACJ5qC,EAAQ8pC,IACV,SAEF,K,CAEFa,EAAaH,EAAMhsB,OAAO7G,GACtBvB,GAASu0B,KAAgBD,GAAyB,IAAV1zC,GAAeujB,GAAKvjB,KAAWujB,GAAKowB,MAC9E3zC,GAAS2zC,EAEb,CAEA,OAAKC,GAAU5qC,EAAQ8pC,IAIhB9yC,EAHE,CAIX,CAEA,SAAS6zC,GAAyBj5C,EAAMovB,GACtC,MAAM,OAACK,EAAA,OAAQC,GAAUN,EACnB8pB,EAA2B,MAAhBzpB,EAAOK,KAAe,IAAM,IACvCqpB,EAA2B,MAAhBzpB,EAAOI,KAAe,IAAM,IACvCvhB,EAAOD,OAAOC,KAAKvO,GACnBo5C,EAAQ,IAAI/yC,MAAMkI,EAAKvH,QAC7B,IAAI8N,EAAG8Q,EAAM7mB,EACb,IAAK+V,EAAI,EAAG8Q,EAAOrX,EAAKvH,OAAQ8N,EAAI8Q,IAAQ9Q,EAC1C/V,EAAMwP,EAAKuG,GACXskC,EAAMtkC,GAAK,CACT,CAACokC,GAAWn6C,EACZ,CAACo6C,GAAWn5C,EAAKjB,IAGrB,OAAOq6C,CACT,CAEA,SAASC,GAAUhe,EAAOjM,GACxB,MAAMkqB,EAAUje,GAASA,EAAMjtB,QAAQkrC,QACvC,OAAOA,QAAwBllC,IAAZklC,QAAwCllC,IAAfgb,EAAKwpB,KACnD,CAEA,SAASW,GAAYC,EAAYC,EAAYrqB,GAC3C,MAAO,GAAGoqB,EAAWnoC,MAAMooC,EAAWpoC,MAAM+d,EAAKwpB,OAASxpB,EAAKxvB,MACjE,CAEA,SAASqwB,GAAcoL,GACrB,MAAM,IAAChpB,EAAG,IAAED,EAAG,WAAE2d,EAAU,WAAEC,GAAcqL,EAAMpL,gBACjD,MAAO,CACL5d,IAAK0d,EAAa1d,EAAMvM,OAAO4zC,kBAC/BtnC,IAAK4d,EAAa5d,EAAMtM,OAAOuiB,kBAEnC,CAEA,SAASsxB,GAAiBC,EAAQC,EAAUC,GAC1C,MAAMC,EAAWH,EAAOC,KAAcD,EAAOC,GAAY,CAAC,GAC1D,OAAOE,EAASD,KAAgBC,EAASD,GAAc,CAAC,EAC1D,CAEA,SAASE,GAAoBpB,EAAOlpB,EAAQuqB,EAAUr6C,GACpD,IAAK,MAAMwvB,KAAQM,EAAOwqB,wBAAwBt6C,GAAM4lB,UAAW,CACjE,MAAMpgB,EAAQwzC,EAAMxpB,EAAKpwB,OACzB,GAAIi7C,GAAa70C,EAAQ,IAAQ60C,GAAY70C,EAAQ,EACnD,OAAOgqB,EAAKpwB,KAEhB,CAEA,OAAO,IACT,CAEA,SAASm7C,GAAaC,EAAYlS,GAChC,MAAM,MAACjS,EAAOokB,YAAajrB,GAAQgrB,EAC7BR,EAAS3jB,EAAMqkB,UAAYrkB,EAAMqkB,QAAU,CAAC,IAC5C,OAAC7qB,EAAA,OAAQC,EAAQ1wB,MAAO+mB,GAAgBqJ,EACxCmrB,EAAQ9qB,EAAOK,KACf0qB,EAAQ9qB,EAAOI,KACf/wB,EAAMw6C,GAAY9pB,EAAQC,EAAQN,GAClCxJ,EAAOsiB,EAAOlhC,OACpB,IAAI4xC,EAEJ,IAAK,IAAI9jC,EAAI,EAAGA,EAAI8Q,IAAQ9Q,EAAG,CAC7B,MAAMhW,EAAOopC,EAAOpzB,IACb,CAACylC,GAAQv7C,EAAO,CAACw7C,GAAQp1C,GAAStG,EACnC27C,EAAa37C,EAAKw7C,UAAYx7C,EAAKw7C,QAAU,CAAC,GACpD1B,EAAQ6B,EAAWD,GAASb,GAAiBC,EAAQ76C,EAAKC,GAC1D45C,EAAM7yB,GAAgB3gB,EAEtBwzC,EAAM8B,KAAOV,GAAoBpB,EAAOlpB,GAAQ,EAAMN,EAAKxvB,MAC3Dg5C,EAAM+B,QAAUX,GAAoBpB,EAAOlpB,GAAQ,EAAON,EAAKxvB,MAE/D,MAAMg7C,EAAehC,EAAMiC,gBAAkBjC,EAAMiC,cAAgB,CAAC,GACpED,EAAa70B,GAAgB3gB,CAC/B,CACF,CAEA,SAAS01C,GAAgB7kB,EAAOnG,GAC9B,MAAMwL,EAASrF,EAAMqF,OACrB,OAAOhtB,OAAOC,KAAK+sB,GAAQ+L,OAAOtoC,GAAOu8B,EAAOv8B,GAAK+wB,OAASA,GAAMirB,OACtE,CAEA,SAASC,GAAqBxT,EAAQxoC,GACpC,OAAO+kC,GAAcyD,EACnB,CACErT,QAAQ,EACRtE,aAASzb,EACT2R,aAAc/mB,EACdA,QACA67B,KAAM,UACNj7B,KAAM,WAGZ,CAEA,SAASq7C,GAAkBzT,EAAQxoC,EAAO0sC,GACxC,OAAO3H,GAAcyD,EAAQ,CAC3BrT,QAAQ,EACR+mB,UAAWl8C,EACXkpC,YAAQ9zB,EACR+mC,SAAK/mC,EACLs3B,UACA1sC,QACA67B,KAAM,UACNj7B,KAAM,QAEV,CAEA,SAASw7C,GAAYhsB,EAAMtB,GAEzB,MAAM/H,EAAeqJ,EAAKgrB,WAAWp7C,MAC/B8wB,EAAOV,EAAKM,QAAUN,EAAKM,OAAOI,KACxC,GAAKA,EAAL,CAIAhC,EAAQA,GAASsB,EAAKO,QACtB,IAAK,MAAMuY,KAAUpa,EAAO,CAC1B,MAAM8rB,EAAS1R,EAAOoS,QACtB,IAAKV,QAA2BxlC,IAAjBwlC,EAAO9pB,SAAsD1b,IAA/BwlC,EAAO9pB,GAAM/J,GACxD,cAEK6zB,EAAO9pB,GAAM/J,QACe3R,IAA/BwlC,EAAO9pB,GAAM+qB,oBAA4EzmC,IAA7CwlC,EAAO9pB,GAAM+qB,cAAc90B,WAClE6zB,EAAO9pB,GAAM+qB,cAAc90B,EAEtC,C,CACF,CAEA,MAAMs1B,GAAsBxgB,GAAkB,UAATA,GAA6B,SAATA,EACnDygB,GAAmBA,CAACC,EAAQC,IAAWA,EAASD,EAASjtC,OAAO8T,OAAO,CAAC,EAAGm5B,GAC3EE,GAAcA,CAACC,EAAUtsB,EAAM6G,IAAUylB,IAAatsB,EAAKusB,QAAUvsB,EAAKwsB,UAC3E,CAACrtC,KAAMgqC,GAAwBtiB,GAAO,GAAOrJ,OAAQ,MAE3C,MAAMivB,GAqBnBn5B,WAAAA,CAAYuT,EAAOlQ,GACjBzlB,KAAK21B,MAAQA,EACb31B,KAAKpC,KAAO+3B,EAAMuE,IAClBl6B,KAAKtB,MAAQ+mB,EACbzlB,KAAKw7C,gBAAkB,CAAC,EACxBx7C,KAAK+5C,YAAc/5C,KAAKy7C,UACxBz7C,KAAK07C,MAAQ17C,KAAK+5C,YAAYz6C,KAC9BU,KAAK8N,aAAUgG,EAEf9T,KAAK2nC,UAAW,EAChB3nC,KAAK27C,WAAQ7nC,EACb9T,KAAK47C,iBAAc9nC,EACnB9T,KAAK67C,oBAAiB/nC,EACtB9T,KAAK87C,gBAAahoC,EAClB9T,KAAK+7C,gBAAajoC,EAClB9T,KAAKg8C,qBAAsB,EAC3Bh8C,KAAKi8C,oBAAqB,EAC1Bj8C,KAAKk8C,cAAWpoC,EAChB9T,KAAKm8C,UAAY,GACjBn8C,KAAKo8C,8BAAgCA,mBACrCp8C,KAAKq8C,2BAA6BA,gBAElCr8C,KAAKs8C,YACP,CAEAA,UAAAA,GACE,MAAMxtB,EAAO9uB,KAAK+5C,YAClB/5C,KAAK82C,YACL92C,KAAKu8C,aACLztB,EAAKwsB,SAAWvC,GAAUjqB,EAAKM,OAAQN,GACvC9uB,KAAKw8C,cAEDx8C,KAAK8N,QAAQ+wB,OAAS7+B,KAAK21B,MAAM8mB,gBAAgB,WACnD1Z,QAAQC,KAAK,qKAEjB,CAEA0Z,WAAAA,CAAYj3B,GACNzlB,KAAKtB,QAAU+mB,GACjBq1B,GAAY96C,KAAK+5C,aAEnB/5C,KAAKtB,MAAQ+mB,CACf,CAEA82B,UAAAA,GACE,MAAM5mB,EAAQ31B,KAAK21B,MACb7G,EAAO9uB,KAAK+5C,YACZxqB,EAAUvvB,KAAK28C,aAEfC,EAAWA,CAACptB,EAAM9Z,EAAGiR,EAAGrT,IAAe,MAATkc,EAAe9Z,EAAa,MAAT8Z,EAAelc,EAAIqT,EAEpEk2B,EAAM/tB,EAAKguB,QAAUx4B,GAAeiL,EAAQutB,QAAStC,GAAgB7kB,EAAO,MAC5EonB,EAAMjuB,EAAKkuB,QAAU14B,GAAeiL,EAAQytB,QAASxC,GAAgB7kB,EAAO,MAC5EsnB,EAAMnuB,EAAKouB,QAAU54B,GAAeiL,EAAQ2tB,QAAS1C,GAAgB7kB,EAAO,MAC5E0E,EAAYvL,EAAKuL,UACjB8iB,EAAMruB,EAAKsuB,QAAUR,EAASviB,EAAWwiB,EAAKE,EAAKE,GACnDI,EAAMvuB,EAAKwuB,QAAUV,EAASviB,EAAW0iB,EAAKF,EAAKI,GACzDnuB,EAAKoB,OAASlwB,KAAKu9C,cAAcV,GACjC/tB,EAAKqB,OAASnwB,KAAKu9C,cAAcR,GACjCjuB,EAAK0uB,OAASx9C,KAAKu9C,cAAcN,GACjCnuB,EAAKK,OAASnvB,KAAKu9C,cAAcJ,GACjCruB,EAAKM,OAASpvB,KAAKu9C,cAAcF,EACnC,CAEAV,UAAAA,GACE,OAAO38C,KAAK21B,MAAMj2B,KAAK45B,SAASt5B,KAAKtB,MACvC,CAEA+8C,OAAAA,GACE,OAAOz7C,KAAK21B,MAAM8nB,eAAez9C,KAAKtB,MACxC,CAMA6+C,aAAAA,CAAcG,GACZ,OAAO19C,KAAK21B,MAAMqF,OAAO0iB,EAC3B,CAKAC,cAAAA,CAAe5iB,GACb,MAAMjM,EAAO9uB,KAAK+5C,YAClB,OAAOhf,IAAUjM,EAAKK,OAClBL,EAAKM,OACLN,EAAKK,MACX,CAEAyuB,KAAAA,GACE59C,KAAKi0C,QAAQ,QACf,CAKA4J,QAAAA,GACE,MAAM/uB,EAAO9uB,KAAK+5C,YACd/5C,KAAK27C,OACPvuB,GAAoBptB,KAAK27C,MAAO37C,MAE9B8uB,EAAKwsB,UACPR,GAAYhsB,EAEhB,CAKAgvB,UAAAA,GACE,MAAMvuB,EAAUvvB,KAAK28C,aACfj9C,EAAO6vB,EAAQ7vB,OAAS6vB,EAAQ7vB,KAAO,IACvCi8C,EAAQ37C,KAAK27C,MAMnB,GAAI13B,GAASvkB,GAAO,CAClB,MAAMovB,EAAO9uB,KAAK+5C,YAClB/5C,KAAK27C,MAAQhD,GAAyBj5C,EAAMovB,E,MACvC,GAAI6sB,IAAUj8C,EAAM,CACzB,GAAIi8C,EAAO,CAETvuB,GAAoBuuB,EAAO37C,MAE3B,MAAM8uB,EAAO9uB,KAAK+5C,YAClBe,GAAYhsB,GACZA,EAAKO,QAAU,E,CAEb3vB,GAAQsO,OAAO+vC,aAAar+C,IAC9B8sB,GAAkB9sB,EAAMM,MAE1BA,KAAKm8C,UAAY,GACjBn8C,KAAK27C,MAAQj8C,C,CAEjB,CAEA88C,WAAAA,GACE,MAAM1tB,EAAO9uB,KAAK+5C,YAElB/5C,KAAK89C,aAED99C,KAAKo8C,qBACPttB,EAAKS,QAAU,IAAIvvB,KAAKo8C,mBAE5B,CAEA4B,qBAAAA,CAAsBC,GACpB,MAAMnvB,EAAO9uB,KAAK+5C,YACZxqB,EAAUvvB,KAAK28C,aACrB,IAAIuB,GAAe,EAEnBl+C,KAAK89C,aAGL,MAAMK,EAAarvB,EAAKwsB,SACxBxsB,EAAKwsB,SAAWvC,GAAUjqB,EAAKM,OAAQN,GAGnCA,EAAKwpB,QAAU/oB,EAAQ+oB,QACzB4F,GAAe,EAEfpD,GAAYhsB,GACZA,EAAKwpB,MAAQ/oB,EAAQ+oB,OAKvBt4C,KAAKo+C,gBAAgBH,IAGjBC,GAAgBC,IAAervB,EAAKwsB,YACtCzB,GAAa75C,KAAM8uB,EAAKO,SACxBP,EAAKwsB,SAAWvC,GAAUjqB,EAAKM,OAAQN,GAE3C,CAMAgoB,SAAAA,GACE,MAAMF,EAAS52C,KAAK21B,MAAMihB,OACpByH,EAAYzH,EAAO0H,iBAAiBt+C,KAAK07C,OACzC9X,EAASgT,EAAO2H,gBAAgBv+C,KAAK28C,aAAc0B,GAAW,GACpEr+C,KAAK8N,QAAU8oC,EAAO4H,eAAe5a,EAAQ5jC,KAAKo9B,cAClDp9B,KAAK2nC,SAAW3nC,KAAK8N,QAAQ8sB,QAC7B56B,KAAKw7C,gBAAkB,CAAC,CAC1B,CAMA3T,KAAAA,CAAMvhC,EAAO+H,GACX,MAAO0rC,YAAajrB,EAAM6sB,MAAOj8C,GAAQM,MACnC,OAACmvB,EAAA,SAAQmsB,GAAYxsB,EACrBmrB,EAAQ9qB,EAAOK,KAErB,IAEIhb,EAAG48B,EAAKxJ,EAFR6W,EAAmB,IAAVn4C,GAAe+H,IAAU3O,EAAKgH,QAAgBooB,EAAKI,QAC5Dqb,EAAOjkC,EAAQ,GAAKwoB,EAAKO,QAAQ/oB,EAAQ,GAG7C,IAAsB,IAAlBtG,KAAK2nC,SACP7Y,EAAKO,QAAU3vB,EACfovB,EAAKI,SAAU,EACf0Y,EAASloC,MACJ,CAEHkoC,EADEhzB,GAAQlV,EAAK4G,IACNtG,KAAK0+C,eAAe5vB,EAAMpvB,EAAM4G,EAAO+H,GACvC4V,GAASvkB,EAAK4G,IACdtG,KAAK2+C,gBAAgB7vB,EAAMpvB,EAAM4G,EAAO+H,GAExCrO,KAAK4+C,mBAAmB9vB,EAAMpvB,EAAM4G,EAAO+H,GAGtD,MAAMwwC,EAA6BA,IAAqB,OAAfzN,EAAI6I,IAAoB1P,GAAQ6G,EAAI6I,GAAS1P,EAAK0P,GAC3F,IAAKzlC,EAAI,EAAGA,EAAInG,IAASmG,EACvBsa,EAAKO,QAAQ7a,EAAIlO,GAAS8qC,EAAMxJ,EAAOpzB,GACnCiqC,IACEI,MACFJ,GAAS,GAEXlU,EAAO6G,GAGXtiB,EAAKI,QAAUuvB,C,CAGbnD,GACFzB,GAAa75C,KAAM4nC,EAEvB,CAaAgX,kBAAAA,CAAmB9vB,EAAMpvB,EAAM4G,EAAO+H,GACpC,MAAM,OAAC8gB,EAAA,OAAQC,GAAUN,EACnBmrB,EAAQ9qB,EAAOK,KACf0qB,EAAQ9qB,EAAOI,KACfsvB,EAAS3vB,EAAO4vB,YAChBC,EAAc7vB,IAAWC,EACzBwY,EAAS,IAAI7hC,MAAMsI,GACzB,IAAImG,EAAG8Q,EAAM5mB,EAEb,IAAK8V,EAAI,EAAG8Q,EAAOjX,EAAOmG,EAAI8Q,IAAQ9Q,EACpC9V,EAAQ8V,EAAIlO,EACZshC,EAAOpzB,GAAK,CACV,CAACylC,GAAQ+E,GAAe7vB,EAAO0Y,MAAMiX,EAAOpgD,GAAQA,GACpD,CAACw7C,GAAQ9qB,EAAOyY,MAAMnoC,EAAKhB,GAAQA,IAGvC,OAAOkpC,CACT,CAaA8W,cAAAA,CAAe5vB,EAAMpvB,EAAM4G,EAAO+H,GAChC,MAAM,OAAC6hB,EAAA,OAAQC,GAAUrB,EACnB8Y,EAAS,IAAI7hC,MAAMsI,GACzB,IAAImG,EAAG8Q,EAAM5mB,EAAOF,EAEpB,IAAKgW,EAAI,EAAG8Q,EAAOjX,EAAOmG,EAAI8Q,IAAQ9Q,EACpC9V,EAAQ8V,EAAIlO,EACZ9H,EAAOkB,EAAKhB,GACZkpC,EAAOpzB,GAAK,CACVkB,EAAGwa,EAAO2X,MAAMrpC,EAAK,GAAIE,GACzBioB,EAAGwJ,EAAO0X,MAAMrpC,EAAK,GAAIE,IAG7B,OAAOkpC,CACT,CAaA+W,eAAAA,CAAgB7vB,EAAMpvB,EAAM4G,EAAO+H,GACjC,MAAM,OAAC6hB,EAAA,OAAQC,GAAUrB,GACnB,SAACmwB,EAAW,aAAKC,EAAW,KAAOl/C,KAAK2nC,SACxCC,EAAS,IAAI7hC,MAAMsI,GACzB,IAAImG,EAAG8Q,EAAM5mB,EAAOF,EAEpB,IAAKgW,EAAI,EAAG8Q,EAAOjX,EAAOmG,EAAI8Q,IAAQ9Q,EACpC9V,EAAQ8V,EAAIlO,EACZ9H,EAAOkB,EAAKhB,GACZkpC,EAAOpzB,GAAK,CACVkB,EAAGwa,EAAO2X,MAAM3gB,GAAiB1oB,EAAMygD,GAAWvgD,GAClDioB,EAAGwJ,EAAO0X,MAAM3gB,GAAiB1oB,EAAM0gD,GAAWxgD,IAGtD,OAAOkpC,CACT,CAKAuX,SAAAA,CAAUzgD,GACR,OAAOsB,KAAK+5C,YAAY1qB,QAAQ3wB,EAClC,CAKA0gD,cAAAA,CAAe1gD,GACb,OAAOsB,KAAK+5C,YAAYr6C,KAAKhB,EAC/B,CAKA25C,UAAAA,CAAWtd,EAAO6M,EAAQrN,GACxB,MAAM5E,EAAQ31B,KAAK21B,MACb7G,EAAO9uB,KAAK+5C,YACZj1C,EAAQ8iC,EAAO7M,EAAMvL,MACrB8oB,EAAQ,CACZrqC,KAAMgqC,GAAwBtiB,GAAO,GACrCrJ,OAAQsb,EAAOoS,QAAQjf,EAAMvL,MAAM+qB,eAErC,OAAOlC,GAAWC,EAAOxzC,EAAOgqB,EAAKpwB,MAAO,CAAC67B,QAC/C,CAKA8kB,qBAAAA,CAAsBn4C,EAAO6zB,EAAO6M,EAAQ0Q,GAC1C,MAAMgH,EAAc1X,EAAO7M,EAAMvL,MACjC,IAAI1qB,EAAwB,OAAhBw6C,EAAuBC,IAAMD,EACzC,MAAMhzB,EAASgsB,GAAS1Q,EAAOoS,QAAQjf,EAAMvL,MACzC8oB,GAAShsB,IACXgsB,EAAMhsB,OAASA,EACfxnB,EAAQuzC,GAAWC,EAAOgH,EAAat/C,KAAK+5C,YAAYr7C,QAE1DwI,EAAM6K,IAAM9C,KAAK8C,IAAI7K,EAAM6K,IAAKjN,GAChCoC,EAAM4K,IAAM7C,KAAK6C,IAAI5K,EAAM4K,IAAKhN,EAClC,CAKA06C,SAAAA,CAAUzkB,EAAOqgB,GACf,MAAMtsB,EAAO9uB,KAAK+5C,YACZ1qB,EAAUP,EAAKO,QACfovB,EAAS3vB,EAAKI,SAAW6L,IAAUjM,EAAKK,OACxC7J,EAAO+J,EAAQ3oB,OACf+4C,EAAaz/C,KAAK29C,eAAe5iB,GACjCud,EAAQ6C,GAAYC,EAAUtsB,EAAM9uB,KAAK21B,OACzCzuB,EAAQ,CAAC6K,IAAKvM,OAAOuiB,kBAAmBjW,IAAKtM,OAAO4zC,oBACnDrnC,IAAK2tC,EAAU5tC,IAAK6tC,GAAYhwB,GAAc8vB,GACrD,IAAIjrC,EAAGozB,EAEP,SAASgY,IACPhY,EAASvY,EAAQ7a,GACjB,MAAMikC,EAAa7Q,EAAO6X,EAAWjwB,MACrC,OAAQtL,GAAS0jB,EAAO7M,EAAMvL,QAAUkwB,EAAWjH,GAAckH,EAAWlH,CAC9E,CAEA,IAAKjkC,EAAI,EAAGA,EAAI8Q,IAAQ9Q,EACtB,IAAIorC,MAGJ5/C,KAAKq/C,sBAAsBn4C,EAAO6zB,EAAO6M,EAAQ0Q,GAC7CmG,GAEF,MAGJ,GAAIA,EAEF,IAAKjqC,EAAI8Q,EAAO,EAAG9Q,GAAK,IAAKA,EAC3B,IAAIorC,IAAJ,CAGA5/C,KAAKq/C,sBAAsBn4C,EAAO6zB,EAAO6M,EAAQ0Q,GACjD,K,CAGJ,OAAOpxC,CACT,CAEA24C,kBAAAA,CAAmB9kB,GACjB,MAAM6M,EAAS5nC,KAAK+5C,YAAY1qB,QAC1B/C,EAAS,GACf,IAAI9X,EAAG8Q,EAAMxgB,EAEb,IAAK0P,EAAI,EAAG8Q,EAAOsiB,EAAOlhC,OAAQ8N,EAAI8Q,IAAQ9Q,EAC5C1P,EAAQ8iC,EAAOpzB,GAAGumB,EAAMvL,MACpBtL,GAASpf,IACXwnB,EAAOtF,KAAKliB,GAGhB,OAAOwnB,CACT,CAMAwzB,cAAAA,GACE,OAAO,CACT,CAKAC,gBAAAA,CAAiBrhD,GACf,MAAMowB,EAAO9uB,KAAK+5C,YACZ5qB,EAASL,EAAKK,OACdC,EAASN,EAAKM,OACdwY,EAAS5nC,KAAKm/C,UAAUzgD,GAC9B,MAAO,CACL4O,MAAO6hB,EAAS,GAAKA,EAAO6wB,iBAAiBpY,EAAOzY,EAAOK,OAAS,GACpE1qB,MAAOsqB,EAAS,GAAKA,EAAO4wB,iBAAiBpY,EAAOxY,EAAOI,OAAS,GAExE,CAKAykB,OAAAA,CAAQ1Z,GACN,MAAMzL,EAAO9uB,KAAK+5C,YAClB/5C,KAAKo2C,OAAO7b,GAAQ,WACpBzL,EAAKskB,MAAQ4E,GAAO1zB,GAAetkB,KAAK8N,QAAQgpB,KAAMihB,GAAYjpB,EAAKoB,OAAQpB,EAAKqB,OAAQnwB,KAAK8/C,mBACnG,CAKA1J,MAAAA,CAAO7b,GAAO,CAEd8Z,IAAAA,GACE,MAAMna,EAAMl6B,KAAKpC,KACX+3B,EAAQ31B,KAAK21B,MACb7G,EAAO9uB,KAAK+5C,YACZpgB,EAAW7K,EAAKpvB,MAAQ,GACxBu/B,EAAOtJ,EAAMqd,UACbnf,EAAS,GACTvtB,EAAQtG,KAAK87C,YAAc,EAC3BztC,EAAQrO,KAAK+7C,YAAepiB,EAASjzB,OAASJ,EAC9C40B,EAA0Bl7B,KAAK8N,QAAQotB,wBAC7C,IAAI1mB,EAMJ,IAJIsa,EAAKS,SACPT,EAAKS,QAAQ8kB,KAAKna,EAAK+E,EAAM34B,EAAO+H,GAGjCmG,EAAIlO,EAAOkO,EAAIlO,EAAQ+H,IAASmG,EAAG,CACtC,MAAM42B,EAAUzR,EAASnlB,GACrB42B,EAAQiQ,SAGRjQ,EAAQvX,QAAUqH,EACpBrH,EAAO7M,KAAKokB,GAEZA,EAAQiJ,KAAKna,EAAK+E,GAEtB,CAEA,IAAKzqB,EAAI,EAAGA,EAAIqf,EAAOntB,SAAU8N,EAC/Bqf,EAAOrf,GAAG6/B,KAAKna,EAAK+E,EAExB,CASAsM,QAAAA,CAAS7sC,EAAOm1B,GACd,MAAM0G,EAAO1G,EAAS,SAAW,UACjC,YAAiB/f,IAAVpV,GAAuBsB,KAAK+5C,YAAYxqB,QAC3CvvB,KAAKigD,6BAA6B1lB,GAClCv6B,KAAKkgD,0BAA0BxhD,GAAS,EAAG67B,EACjD,CAKA6C,UAAAA,CAAW1+B,EAAOm1B,EAAQ0G,GACxB,MAAMhL,EAAUvvB,KAAK28C,aACrB,IAAInjB,EACJ,GAAI96B,GAAS,GAAKA,EAAQsB,KAAK+5C,YAAYr6C,KAAKgH,OAAQ,CACtD,MAAM0kC,EAAUprC,KAAK+5C,YAAYr6C,KAAKhB,GACtC86B,EAAU4R,EAAQ8Q,WACf9Q,EAAQ8Q,SAAWvB,GAAkB36C,KAAKo9B,aAAc1+B,EAAO0sC,IAClE5R,EAAQoO,OAAS5nC,KAAKm/C,UAAUzgD,GAChC86B,EAAQqhB,IAAMtrB,EAAQ7vB,KAAKhB,GAC3B86B,EAAQ96B,MAAQ86B,EAAQohB,UAAYl8C,C,MAEpC86B,EAAUx5B,KAAKk8C,WACZl8C,KAAKk8C,SAAWxB,GAAqB16C,KAAK21B,MAAMyH,aAAcp9B,KAAKtB,QACtE86B,EAAQjK,QAAUA,EAClBiK,EAAQ96B,MAAQ86B,EAAQ/T,aAAezlB,KAAKtB,MAK9C,OAFA86B,EAAQ3F,SAAWA,EACnB2F,EAAQe,KAAOA,EACRf,CACT,CAMAymB,4BAAAA,CAA6B1lB,GAC3B,OAAOv6B,KAAKmgD,uBAAuBngD,KAAKo8C,mBAAmBrrC,GAAIwpB,EACjE,CAOA2lB,yBAAAA,CAA0BxhD,EAAO67B,GAC/B,OAAOv6B,KAAKmgD,uBAAuBngD,KAAKq8C,gBAAgBtrC,GAAIwpB,EAAM77B,EACpE,CAKAyhD,sBAAAA,CAAuBC,EAAa7lB,EAAO,UAAW77B,GACpD,MAAMm1B,EAAkB,WAAT0G,EACT+B,EAAQt8B,KAAKw7C,gBACb3mB,EAAWurB,EAAc,IAAM7lB,EAC/B0gB,EAAS3e,EAAMzH,GACfwrB,EAAUrgD,KAAKg8C,qBAAuB10B,GAAQ5oB,GACpD,GAAIu8C,EACF,OAAOD,GAAiBC,EAAQoF,GAElC,MAAMzJ,EAAS52C,KAAK21B,MAAMihB,OACpByH,EAAYzH,EAAO0J,wBAAwBtgD,KAAK07C,MAAO0E,GACvDvc,EAAWhQ,EAAS,CAAC,GAAGusB,SAAoB,QAASA,EAAa,IAAM,CAACA,EAAa,IACtFxc,EAASgT,EAAO2H,gBAAgBv+C,KAAK28C,aAAc0B,GACnDz9B,EAAQ5S,OAAOC,KAAKolB,GAASsG,SAASymB,IAGtC5mB,EAAUA,IAAMx5B,KAAKo9B,WAAW1+B,EAAOm1B,EAAQ0G,GAC/CjO,EAASsqB,EAAO2J,oBAAoB3c,EAAQhjB,EAAO4Y,EAASqK,GAalE,OAXIvX,EAAOirB,UAGTjrB,EAAOirB,QAAU8I,EAKjB/jB,EAAMzH,GAAY7mB,OAAOwyC,OAAOxF,GAAiB1uB,EAAQ+zB,KAGpD/zB,CACT,CAMAm0B,kBAAAA,CAAmB/hD,EAAOoC,EAAY+yB,GACpC,MAAM8B,EAAQ31B,KAAK21B,MACb2G,EAAQt8B,KAAKw7C,gBACb3mB,EAAW,aAAa/zB,IACxBm6C,EAAS3e,EAAMzH,GACrB,GAAIomB,EACF,OAAOA,EAET,IAAIntC,EACJ,IAAgC,IAA5B6nB,EAAM7nB,QAAQgmB,UAAqB,CACrC,MAAM8iB,EAAS52C,KAAK21B,MAAMihB,OACpByH,EAAYzH,EAAO8J,0BAA0B1gD,KAAK07C,MAAO56C,GACzD8iC,EAASgT,EAAO2H,gBAAgBv+C,KAAK28C,aAAc0B,GACzDvwC,EAAU8oC,EAAO4H,eAAe5a,EAAQ5jC,KAAKo9B,WAAW1+B,EAAOm1B,EAAQ/yB,G,CAEzE,MAAMmzB,EAAa,IAAI0iB,GAAWhhB,EAAO7nB,GAAWA,EAAQmmB,YAI5D,OAHInmB,GAAWA,EAAQq2B,aACrB7H,EAAMzH,GAAY7mB,OAAOwyC,OAAOvsB,IAE3BA,CACT,CAMA0sB,gBAAAA,CAAiB7yC,GACf,GAAKA,EAAQypC,QAGb,OAAOv3C,KAAK67C,iBAAmB77C,KAAK67C,eAAiB7tC,OAAO8T,OAAO,CAAC,EAAGhU,GACzE,CAMA8yC,cAAAA,CAAermB,EAAMsmB,GACnB,OAAQA,GAAiB9F,GAAmBxgB,IAASv6B,KAAK21B,MAAMmrB,mBAClE,CAKAC,iBAAAA,CAAkBz6C,EAAOi0B,GACvB,MAAMymB,EAAYhhD,KAAKkgD,0BAA0B55C,EAAOi0B,GAClD0mB,EAA0BjhD,KAAK67C,eAC/BgF,EAAgB7gD,KAAK2gD,iBAAiBK,GACtCJ,EAAiB5gD,KAAK4gD,eAAermB,EAAMsmB,IAAmBA,IAAkBI,EAEtF,OADAjhD,KAAKkhD,oBAAoBL,EAAetmB,EAAMymB,GACvC,CAACH,gBAAeD,iBACzB,CAMAO,aAAAA,CAAc/V,EAAS1sC,EAAOk1B,EAAY2G,GACpCwgB,GAAmBxgB,GACrBvsB,OAAO8T,OAAOspB,EAASxX,GAEvB5zB,KAAKygD,mBAAmB/hD,EAAO67B,GAAM6b,OAAOhL,EAASxX,EAEzD,CAMAstB,mBAAAA,CAAoBL,EAAetmB,EAAM6c,GACnCyJ,IAAkB9F,GAAmBxgB,IACvCv6B,KAAKygD,wBAAmB3sC,EAAWymB,GAAM6b,OAAOyK,EAAezJ,EAEnE,CAKAgK,SAAAA,CAAUhW,EAAS1sC,EAAO67B,EAAM1G,GAC9BuX,EAAQvX,OAASA,EACjB,MAAM/lB,EAAU9N,KAAKurC,SAAS7sC,EAAOm1B,GACrC7zB,KAAKygD,mBAAmB/hD,EAAO67B,EAAM1G,GAAQuiB,OAAOhL,EAAS,CAG3Dt9B,SAAW+lB,GAAU7zB,KAAK2gD,iBAAiB7yC,IAAaA,GAE5D,CAEAuzC,gBAAAA,CAAiBjW,EAAS3lB,EAAc/mB,GACtCsB,KAAKohD,UAAUhW,EAAS1sC,EAAO,UAAU,EAC3C,CAEA4iD,aAAAA,CAAclW,EAAS3lB,EAAc/mB,GACnCsB,KAAKohD,UAAUhW,EAAS1sC,EAAO,UAAU,EAC3C,CAKA6iD,wBAAAA,GACE,MAAMnW,EAAUprC,KAAK+5C,YAAYxqB,QAE7B6b,GACFprC,KAAKohD,UAAUhW,OAASt3B,EAAW,UAAU,EAEjD,CAKA0tC,qBAAAA,GACE,MAAMpW,EAAUprC,KAAK+5C,YAAYxqB,QAE7B6b,GACFprC,KAAKohD,UAAUhW,OAASt3B,EAAW,UAAU,EAEjD,CAKAsqC,eAAAA,CAAgBH,GACd,MAAMv+C,EAAOM,KAAK27C,MACZhiB,EAAW35B,KAAK+5C,YAAYr6C,KAGlC,IAAK,MAAOstB,EAAQy0B,EAAMC,KAAS1hD,KAAKm8C,UACtCn8C,KAAKgtB,GAAQy0B,EAAMC,GAErB1hD,KAAKm8C,UAAY,GAEjB,MAAMwF,EAAUhoB,EAASjzB,OACnBk7C,EAAUliD,EAAKgH,OACf2H,EAAQY,KAAK8C,IAAI6vC,EAASD,GAE5BtzC,GAKFrO,KAAK6nC,MAAM,EAAGx5B,GAGZuzC,EAAUD,EACZ3hD,KAAK6hD,gBAAgBF,EAASC,EAAUD,EAAS1D,GACxC2D,EAAUD,GACnB3hD,KAAK8hD,gBAAgBF,EAASD,EAAUC,EAE5C,CAKAC,eAAAA,CAAgBv7C,EAAO+H,EAAO4vC,GAAmB,GAC/C,MAAMnvB,EAAO9uB,KAAK+5C,YACZr6C,EAAOovB,EAAKpvB,KACZwrB,EAAM5kB,EAAQ+H,EACpB,IAAImG,EAEJ,MAAMutC,EAAQjb,IAEZ,IADAA,EAAIpgC,QAAU2H,EACTmG,EAAIsyB,EAAIpgC,OAAS,EAAG8N,GAAK0W,EAAK1W,IACjCsyB,EAAItyB,GAAKsyB,EAAItyB,EAAInG,IAKrB,IAFA0zC,EAAKriD,GAEA8U,EAAIlO,EAAOkO,EAAI0W,IAAO1W,EACzB9U,EAAK8U,GAAK,IAAIxU,KAAKq8C,gBAGjBr8C,KAAK2nC,UACPoa,EAAKjzB,EAAKO,SAEZrvB,KAAK6nC,MAAMvhC,EAAO+H,GAEd4vC,GACFj+C,KAAKgiD,eAAetiD,EAAM4G,EAAO+H,EAAO,QAE5C,CAEA2zC,cAAAA,CAAe5W,EAAS9kC,EAAO+H,EAAOksB,GAAO,CAK7CunB,eAAAA,CAAgBx7C,EAAO+H,GACrB,MAAMygB,EAAO9uB,KAAK+5C,YAClB,GAAI/5C,KAAK2nC,SAAU,CACjB,MAAMsa,EAAUnzB,EAAKO,QAAQ/B,OAAOhnB,EAAO+H,GACvCygB,EAAKwsB,UACPR,GAAYhsB,EAAMmzB,E,CAGtBnzB,EAAKpvB,KAAK4tB,OAAOhnB,EAAO+H,EAC1B,CAKA6zC,KAAAA,CAAMhjD,GACJ,GAAIc,KAAK2nC,SACP3nC,KAAKm8C,UAAUn1B,KAAK9nB,OACf,CACL,MAAO8tB,EAAQy0B,EAAMC,GAAQxiD,EAC7Bc,KAAKgtB,GAAQy0B,EAAMC,E,CAErB1hD,KAAK21B,MAAMwsB,aAAan7B,KAAK,CAAChnB,KAAKtB,SAAUQ,GAC/C,CAEAkjD,WAAAA,GACE,MAAM/zC,EAAQg0C,UAAU37C,OACxB1G,KAAKkiD,MAAM,CAAC,kBAAmBliD,KAAK28C,aAAaj9C,KAAKgH,OAAS2H,EAAOA,GACxE,CAEAi0C,UAAAA,GACEtiD,KAAKkiD,MAAM,CAAC,kBAAmBliD,KAAK+5C,YAAYr6C,KAAKgH,OAAS,EAAG,GACnE,CAEA67C,YAAAA,GACEviD,KAAKkiD,MAAM,CAAC,kBAAmB,EAAG,GACpC,CAEAM,aAAAA,CAAcl8C,EAAO+H,GACfA,GACFrO,KAAKkiD,MAAM,CAAC,kBAAmB57C,EAAO+H,IAExC,MAAMo0C,EAAWJ,UAAU37C,OAAS,EAChC+7C,GACFziD,KAAKkiD,MAAM,CAAC,kBAAmB57C,EAAOm8C,GAE1C,CAEAC,cAAAA,GACE1iD,KAAKkiD,MAAM,CAAC,kBAAmB,EAAGG,UAAU37C,QAC9C,EC7iCF,SAASi8C,GAAkB5nB,EAAOz7B,GAChC,IAAKy7B,EAAMl9B,OAAO+kD,KAAM,CACtB,MAAMC,EAAe9nB,EAAM6e,wBAAwBt6C,GACnD,IAAIgtB,EAAS,GAEb,IAAK,IAAI9X,EAAI,EAAG8Q,EAAOu9B,EAAan8C,OAAQ8N,EAAI8Q,EAAM9Q,IACpD8X,EAASA,EAAOw2B,OAAOD,EAAaruC,GAAGslC,WAAW+F,mBAAmB9kB,IAEvEA,EAAMl9B,OAAO+kD,KAAOr1B,GAAajB,EAAOpD,KAAK,CAACvW,EAAGC,IAAMD,EAAIC,G,CAE7D,OAAOmoB,EAAMl9B,OAAO+kD,IACtB,CAMA,SAASG,GAAqBj0B,GAC5B,MAAMiM,EAAQjM,EAAKK,OACb7C,EAASq2B,GAAkB5nB,EAAOjM,EAAKxvB,MAC7C,IACIkV,EAAG8Q,EAAM09B,EAAMzY,EADfx4B,EAAMgpB,EAAMkoB,QAEhB,MAAMC,EAAmBA,KACV,QAATF,IAA4B,QAAVA,IAIlB17B,GAAQijB,KAEVx4B,EAAM9C,KAAK8C,IAAIA,EAAK9C,KAAKuZ,IAAIw6B,EAAOzY,IAASx4B,IAE/Cw4B,EAAOyY,IAGT,IAAKxuC,EAAI,EAAG8Q,EAAOgH,EAAO5lB,OAAQ8N,EAAI8Q,IAAQ9Q,EAC5CwuC,EAAOjoB,EAAMnL,iBAAiBtD,EAAO9X,IACrC0uC,IAIF,IADA3Y,OAAOz2B,EACFU,EAAI,EAAG8Q,EAAOyV,EAAMrF,MAAMhvB,OAAQ8N,EAAI8Q,IAAQ9Q,EACjDwuC,EAAOjoB,EAAMooB,gBAAgB3uC,GAC7B0uC,IAGF,OAAOnxC,CACT,CAQA,SAASqxC,GAAyB1kD,EAAO2kD,EAAOv1C,EAASw1C,GACvD,MAAMC,EAAYz1C,EAAQ01C,aAC1B,IAAIn2C,EAAMqU,EAaV,OAXIkC,GAAc2/B,IAChBl2C,EAAOg2C,EAAMtxC,IAAMjE,EAAQ21C,mBAC3B/hC,EAAQ5T,EAAQ41C,gBAKhBr2C,EAAOk2C,EAAYD,EACnB5hC,EAAQ,GAGH,CACLiiC,MAAOt2C,EAAOi2C,EACd5hC,QACApb,MAAO+8C,EAAMO,OAAOllD,GAAU2O,EAAO,EAEzC,CAQA,SAASw2C,GAA0BnlD,EAAO2kD,EAAOv1C,EAASw1C,GACxD,MAAMM,EAASP,EAAMO,OACfZ,EAAOY,EAAOllD,GACpB,IAAI6rC,EAAO7rC,EAAQ,EAAIklD,EAAOllD,EAAQ,GAAK,KACvC4pC,EAAO5pC,EAAQklD,EAAOl9C,OAAS,EAAIk9C,EAAOllD,EAAQ,GAAK,KAC3D,MAAMolD,EAAUh2C,EAAQ21C,mBAEX,OAATlZ,IAGFA,EAAOyY,GAAiB,OAAT1a,EAAgB+a,EAAMn4B,IAAMm4B,EAAM/8C,MAAQgiC,EAAO0a,IAGrD,OAAT1a,IAEFA,EAAO0a,EAAOA,EAAOzY,GAGvB,MAAMjkC,EAAQ08C,GAAQA,EAAO/zC,KAAK8C,IAAIw4B,EAAMjC,IAAS,EAAIwb,EACnDz2C,EAAO4B,KAAKuZ,IAAI8f,EAAOiC,GAAQ,EAAIuZ,EAEzC,MAAO,CACLH,MAAOt2C,EAAOi2C,EACd5hC,MAAO5T,EAAQ41C,cACfp9C,QAEJ,CAEA,SAASy9C,GAAcC,EAAOxlD,EAAM4wB,EAAQ5a,GAC1C,MAAMyvC,EAAa70B,EAAOyY,MAAMmc,EAAM,GAAIxvC,GACpC0vC,EAAW90B,EAAOyY,MAAMmc,EAAM,GAAIxvC,GAClCzC,EAAM9C,KAAK8C,IAAIkyC,EAAYC,GAC3BpyC,EAAM7C,KAAK6C,IAAImyC,EAAYC,GACjC,IAAIC,EAAWpyC,EACXqyC,EAAStyC,EAET7C,KAAKuZ,IAAIzW,GAAO9C,KAAKuZ,IAAI1W,KAC3BqyC,EAAWryC,EACXsyC,EAASryC,GAKXvT,EAAK4wB,EAAOI,MAAQ40B,EAEpB5lD,EAAK6lD,QAAU,CACbF,WACAC,SACA99C,MAAO29C,EACP/4B,IAAKg5B,EACLnyC,MACAD,MAEJ,CAEA,SAASwyC,GAAWN,EAAOxlD,EAAM4wB,EAAQ5a,GAMvC,OALII,GAAQovC,GACVD,GAAcC,EAAOxlD,EAAM4wB,EAAQ5a,GAEnChW,EAAK4wB,EAAOI,MAAQJ,EAAOyY,MAAMmc,EAAOxvC,GAEnChW,CACT,CAEA,SAAS+lD,GAAsBz1B,EAAMpvB,EAAM4G,EAAO+H,GAChD,MAAM8gB,EAASL,EAAKK,OACdC,EAASN,EAAKM,OACd0vB,EAAS3vB,EAAO4vB,YAChBC,EAAc7vB,IAAWC,EACzBwY,EAAS,GACf,IAAIpzB,EAAG8Q,EAAM9mB,EAAMwlD,EAEnB,IAAKxvC,EAAIlO,EAAOgf,EAAOhf,EAAQ+H,EAAOmG,EAAI8Q,IAAQ9Q,EAChDwvC,EAAQtkD,EAAK8U,GACbhW,EAAO,CAAC,EACRA,EAAK2wB,EAAOK,MAAQwvB,GAAe7vB,EAAO0Y,MAAMiX,EAAOtqC,GAAIA,GAC3DozB,EAAO5gB,KAAKs9B,GAAWN,EAAOxlD,EAAM4wB,EAAQ5a,IAE9C,OAAOozB,CACT,CAEA,SAAS4c,GAAWC,GAClB,OAAOA,QAA8B3wC,IAApB2wC,EAAON,eAA4CrwC,IAAlB2wC,EAAOL,MAC3D,CAEA,SAASM,GAAQr3C,EAAM+hB,EAAQu1B,GAC7B,OAAa,IAATt3C,EACKgb,GAAKhb,IAEN+hB,EAAOw1B,eAAiB,GAAK,IAAMx1B,EAAOrd,KAAO4yC,EAAa,GAAK,EAC7E,CAEA,SAASE,GAAYjxB,GACnB,IAAI1O,EAAS5e,EAAO4kB,EAAKqJ,EAAKC,EAiB9B,OAhBIZ,EAAWkxB,YACb5/B,EAAU0O,EAAW3G,KAAO2G,EAAWle,EACvCpP,EAAQ,OACR4kB,EAAM,UAENhG,EAAU0O,EAAW3G,KAAO2G,EAAWjN,EACvCrgB,EAAQ,SACR4kB,EAAM,OAEJhG,GACFqP,EAAM,MACNC,EAAS,UAETD,EAAM,QACNC,EAAS,OAEJ,CAACluB,QAAO4kB,MAAKhG,UAASqP,MAAKC,SACpC,CAEA,SAASuwB,GAAiBnxB,EAAY9lB,EAASwqC,EAAO55C,GACpD,IAAIsmD,EAAOl3C,EAAQm3C,cACnB,MAAM/3B,EAAM,CAAC,EAEb,IAAK83B,EAEH,YADApxB,EAAWqxB,cAAgB/3B,GAI7B,IAAa,IAAT83B,EAEF,YADApxB,EAAWqxB,cAAgB,CAAC1wB,KAAK,EAAM7F,OAAO,EAAM8F,QAAQ,EAAM/F,MAAM,IAI1E,MAAM,MAACnoB,EAAA,IAAO4kB,EAAA,QAAKhG,EAAA,IAASqP,EAAA,OAAKC,GAAUqwB,GAAYjxB,GAE1C,WAAToxB,GAAqB1M,IACvB1kB,EAAWsxB,oBAAqB,GAC3B5M,EAAM8B,MAAQ,KAAO17C,EACxBsmD,EAAOzwB,GACG+jB,EAAM+B,SAAW,KAAO37C,EAClCsmD,EAAOxwB,GAEPtH,EAAIi4B,GAAU3wB,EAAQluB,EAAO4kB,EAAKhG,KAAY,EAC9C8/B,EAAOzwB,IAIXrH,EAAIi4B,GAAUH,EAAM1+C,EAAO4kB,EAAKhG,KAAY,EAC5C0O,EAAWqxB,cAAgB/3B,CAC7B,CAEA,SAASi4B,GAAUH,EAAMryC,EAAGC,EAAGsS,GAO7B,OANIA,GACF8/B,EAAOI,GAAKJ,EAAMryC,EAAGC,GACrBoyC,EAAOK,GAASL,EAAMpyC,EAAGD,IAEzBqyC,EAAOK,GAASL,EAAMryC,EAAGC,GAEpBoyC,CACT,CAEA,SAASI,GAAKE,EAAM9/B,EAAI+/B,GACtB,OAAOD,IAAS9/B,EAAK+/B,EAAKD,IAASC,EAAK//B,EAAK8/B,CAC/C,CAEA,SAASD,GAAS3zC,EAAGpL,EAAO4kB,GAC1B,MAAa,UAANxZ,EAAgBpL,EAAc,QAANoL,EAAcwZ,EAAMxZ,CACrD,CAEA,SAAS8zC,GAAiB5xB,GAAY,cAAC6xB,GAAgB/jC,GACrDkS,EAAW6xB,cAAkC,SAAlBA,EACb,IAAV/jC,EAAc,IAAO,EACrB+jC,CACN,EDqzBAC,EAAAA,GAAAA,GA30BqBnK,GAAA,WAKD,CAAC,IAAEmK,EAAAA,GAAAA,GALFnK,GAAA,qBAUS,OAAImK,EAAAA,GAAAA,GAVbnK,GAAA,kBAeM,MCSZ,MAAMoK,WAAsBpK,GAgDzCqD,kBAAAA,CAAmB9vB,EAAMpvB,EAAM4G,EAAO+H,GACpC,OAAOk2C,GAAsBz1B,EAAMpvB,EAAM4G,EAAO+H,EAClD,CAOAqwC,cAAAA,CAAe5vB,EAAMpvB,EAAM4G,EAAO+H,GAChC,OAAOk2C,GAAsBz1B,EAAMpvB,EAAM4G,EAAO+H,EAClD,CAOAswC,eAAAA,CAAgB7vB,EAAMpvB,EAAM4G,EAAO+H,GACjC,MAAM,OAAC8gB,EAAA,OAAQC,GAAUN,GACnB,SAACmwB,EAAW,aAAKC,EAAW,KAAOl/C,KAAK2nC,SACxCiR,EAA2B,MAAhBzpB,EAAOK,KAAeyvB,EAAWC,EAC5CrG,EAA2B,MAAhBzpB,EAAOI,KAAeyvB,EAAWC,EAC5CtX,EAAS,GACf,IAAIpzB,EAAG8Q,EAAM9mB,EAAMgkB,EACnB,IAAKhO,EAAIlO,EAAOgf,EAAOhf,EAAQ+H,EAAOmG,EAAI8Q,IAAQ9Q,EAChDgO,EAAM9iB,EAAK8U,GACXhW,EAAO,CAAC,EACRA,EAAK2wB,EAAOK,MAAQL,EAAO0Y,MAAM3gB,GAAiB1E,EAAKo2B,GAAWpkC,GAClEozB,EAAO5gB,KAAKs9B,GAAWp9B,GAAiB1E,EAAKq2B,GAAWr6C,EAAM4wB,EAAQ5a,IAExE,OAAOozB,CACT,CAKAyX,qBAAAA,CAAsBn4C,EAAO6zB,EAAO6M,EAAQ0Q,GAC1CsN,MAAMvG,sBAAsBn4C,EAAO6zB,EAAO6M,EAAQ0Q,GAClD,MAAMmM,EAAS7c,EAAOyc,QAClBI,GAAU1pB,IAAU/6B,KAAK+5C,YAAY3qB,SAEvCloB,EAAM6K,IAAM9C,KAAK8C,IAAI7K,EAAM6K,IAAK0yC,EAAO1yC,KACvC7K,EAAM4K,IAAM7C,KAAK6C,IAAI5K,EAAM4K,IAAK2yC,EAAO3yC,KAE3C,CAMAguC,cAAAA,GACE,OAAO,CACT,CAKAC,gBAAAA,CAAiBrhD,GACf,MAAMowB,EAAO9uB,KAAK+5C,aACZ,OAAC5qB,EAAA,OAAQC,GAAUN,EACnB8Y,EAAS5nC,KAAKm/C,UAAUzgD,GACxB+lD,EAAS7c,EAAOyc,QAChBv/C,EAAQ0/C,GAAWC,GACrB,IAAMA,EAAOn+C,MAAQ,KAAOm+C,EAAOv5B,IAAM,IACzC,GAAKkE,EAAO4wB,iBAAiBpY,EAAOxY,EAAOI,OAE/C,MAAO,CACLliB,MAAO,GAAK6hB,EAAO6wB,iBAAiBpY,EAAOzY,EAAOK,OAClD1qB,QAEJ,CAEAw3C,UAAAA,GACEt8C,KAAKg8C,qBAAsB,EAE3B4J,MAAMtJ,aAEN,MAAMxtB,EAAO9uB,KAAK+5C,YAClBjrB,EAAKwpB,MAAQt4C,KAAK28C,aAAarE,KACjC,CAEAlC,MAAAA,CAAO7b,GACL,MAAMzL,EAAO9uB,KAAK+5C,YAClB/5C,KAAKgiD,eAAelzB,EAAKpvB,KAAM,EAAGovB,EAAKpvB,KAAKgH,OAAQ6zB,EACtD,CAEAynB,cAAAA,CAAe6D,EAAMv/C,EAAO+H,EAAOksB,GACjC,MAAMqjB,EAAiB,UAATrjB,GACR,MAAC77B,EAAOq7C,aAAa,OAAC3qB,IAAWpvB,KACjCitB,EAAOmC,EAAO02B,eACdhB,EAAa11B,EAAOw1B,eACpBvB,EAAQrjD,KAAK+lD,aACb,cAAClF,EAAa,eAAED,GAAkB5gD,KAAK+gD,kBAAkBz6C,EAAOi0B,GAEtE,IAAK,IAAI/lB,EAAIlO,EAAOkO,EAAIlO,EAAQ+H,EAAOmG,IAAK,CAC1C,MAAMozB,EAAS5nC,KAAKm/C,UAAU3qC,GACxBwxC,EAAUpI,GAASh6B,GAAcgkB,EAAOxY,EAAOI,OAAS,CAACvC,OAAMg5B,KAAMh5B,GAAQjtB,KAAKkmD,yBAAyB1xC,GAC3G2xC,EAAUnmD,KAAKomD,yBAAyB5xC,EAAG6uC,GAC3C/K,GAAS1Q,EAAOoS,SAAW,CAAC,GAAG5qB,EAAOI,MAEtCoE,EAAa,CACjBkxB,aACA73B,KAAM+4B,EAAQ/4B,KACdi4B,oBAAqB5M,GAASkM,GAAW5c,EAAOyc,UAAa3lD,IAAU45C,EAAM8B,MAAQ17C,IAAU45C,EAAM+B,QACrG3kC,EAAGovC,EAAakB,EAAQC,KAAOE,EAAQE,OACvC1/B,EAAGm+B,EAAaqB,EAAQE,OAASL,EAAQC,KACzC1oB,OAAQunB,EAAaqB,EAAQ94C,KAAO4B,KAAKuZ,IAAIw9B,EAAQ34C,MACrDpN,MAAO6kD,EAAa71C,KAAKuZ,IAAIw9B,EAAQ34C,MAAQ84C,EAAQ94C,MAGnDuzC,IACFhtB,EAAW9lB,QAAU+yC,GAAiB7gD,KAAKkgD,0BAA0B1rC,EAAGqxC,EAAKrxC,GAAGqf,OAAS,SAAW0G,IAEtG,MAAMzsB,EAAU8lB,EAAW9lB,SAAW+3C,EAAKrxC,GAAG1G,QAC9Ci3C,GAAiBnxB,EAAY9lB,EAASwqC,EAAO55C,GAC7C8mD,GAAiB5xB,EAAY9lB,EAASu1C,EAAM3hC,OAC5C1hB,KAAKmhD,cAAc0E,EAAKrxC,GAAIA,EAAGof,EAAY2G,EAC7C,CACF,CASA+rB,UAAAA,CAAWp6B,EAAM0uB,GACf,MAAM,OAACzrB,GAAUnvB,KAAK+5C,YAChB5B,EAAWhpB,EAAOyqB,wBAAwB55C,KAAK07C,OAClD3U,OAAOjY,GAAQA,EAAKgrB,WAAWhsC,QAAQy4C,SACpCvN,EAAU7pB,EAAOrhB,QAAQkrC,QACzBM,EAAS,GACTkN,EAAgBxmD,KAAK+5C,YAAYD,WAAWqF,UAAUvE,GACtD6L,EAAcD,GAAiBA,EAAcr3B,EAAOK,MAEpDk3B,EAAY53B,IAChB,MAAM8Y,EAAS9Y,EAAKO,QAAQs3B,KAAKnoD,GAAQA,EAAK2wB,EAAOK,QAAUi3B,GACzDtjC,EAAMykB,GAAUA,EAAO9Y,EAAKM,OAAOI,MAEzC,GAAI5L,GAAcT,IAAQqG,MAAMrG,GAC9B,OAAO,GAIX,IAAK,MAAM2L,KAAQqpB,EACjB,SAAkBrkC,IAAd8mC,IAA2B8L,EAAS53B,QASxB,IAAZkqB,IAAqD,IAAhCM,EAAOvzB,QAAQ+I,EAAKwpB,aAClCxkC,IAAZklC,QAAwCllC,IAAfgb,EAAKwpB,QAC3BgB,EAAOtyB,KAAK8H,EAAKwpB,OAEfxpB,EAAKpwB,QAAUwtB,GACjB,MAWJ,OAJKotB,EAAO5yC,QACV4yC,EAAOtyB,UAAKlT,GAGPwlC,CACT,CAMAsN,cAAAA,CAAeloD,GACb,OAAOsB,KAAKsmD,gBAAWxyC,EAAWpV,GAAOgI,MAC3C,CAEAmgD,aAAAA,GACE,OAAO7mD,KAAK8mD,WAAWpgD,MACzB,CAEAqgD,2BAAAA,GACE,MAAM/rB,EAASh7B,KAAK21B,MAAMqF,OACpBgsB,EAAehnD,KAAK21B,MAAM7nB,QAAQusB,UACxC,OAAOrsB,OAAOC,KAAK+sB,GAAQ+L,OAAOtoC,GAAOu8B,EAAOv8B,GAAK+wB,OAASw3B,GAAcvM,OAC9E,CAEAqM,QAAAA,GACE,MAAMt3B,EAAO,CAAC,EACRy3B,EAAmBjnD,KAAK+mD,8BAC9B,IAAK,MAAMx3B,KAAWvvB,KAAK21B,MAAMj2B,KAAK45B,SACpC9J,EAAKlL,GAC8B,MAAjCtkB,KAAK21B,MAAM7nB,QAAQusB,UAAoB9K,EAAQutB,QAAUvtB,EAAQytB,QAASiK,KACvE,EAEP,OAAOj5C,OAAOC,KAAKuhB,EACrB,CAUA03B,cAAAA,CAAezhC,EAAcrmB,EAAMw7C,GACjC,MAAMtB,EAASt5C,KAAKsmD,WAAW7gC,EAAcm1B,GACvCl8C,OAAkBoV,IAAV1U,EACVk6C,EAAOvzB,QAAQ3mB,IACd,EAEL,OAAmB,IAAXV,EACJ46C,EAAO5yC,OAAS,EAChBhI,CACN,CAKAqnD,SAAAA,GACE,MAAM/lB,EAAOhgC,KAAK8N,QACZghB,EAAO9uB,KAAK+5C,YACZ5qB,EAASL,EAAKK,OACdy0B,EAAS,GACf,IAAIpvC,EAAG8Q,EAEP,IAAK9Q,EAAI,EAAG8Q,EAAOwJ,EAAKpvB,KAAKgH,OAAQ8N,EAAI8Q,IAAQ9Q,EAC/CovC,EAAO58B,KAAKmI,EAAOS,iBAAiB5vB,KAAKm/C,UAAU3qC,GAAG2a,EAAOK,MAAOhb,IAGtE,MAAMgvC,EAAexjB,EAAKwjB,aACpBzxC,EAAMyxC,GAAgBT,GAAqBj0B,GAEjD,MAAO,CACL/c,MACA6xC,SACAt9C,MAAO6oB,EAAOg4B,YACdj8B,IAAKiE,EAAOi4B,UACZ9D,WAAYtjD,KAAK4mD,iBACjB7rB,MAAO5L,EACPo3B,QAASvmB,EAAKumB,QAEd7kC,MAAO8hC,EAAe,EAAIxjB,EAAKyjB,mBAAqBzjB,EAAK0jB,cAE7D,CAMAwC,wBAAAA,CAAyBxnD,GACvB,MAAOq7C,aAAa,OAAC3qB,EAAA,SAAQksB,EAAU58C,MAAO+mB,GAAe3X,SAAUmf,KAAMo6B,EAAS,aAAEC,IAAiBtnD,KACnG2kD,EAAa0C,GAAa,EAC1Bzf,EAAS5nC,KAAKm/C,UAAUzgD,GACxB+lD,EAAS7c,EAAOyc,QAChBkD,EAAW/C,GAAWC,GAC5B,IAGIwB,EAAM54C,EAHNvI,EAAQ8iC,EAAOxY,EAAOI,MACtBlpB,EAAQ,EACRI,EAAS40C,EAAWt7C,KAAKq4C,WAAWjpB,EAAQwY,EAAQ0T,GAAYx2C,EAGhE4B,IAAW5B,IACbwB,EAAQI,EAAS5B,EACjB4B,EAAS5B,GAGPyiD,IACFziD,EAAQ2/C,EAAON,SACfz9C,EAAS+9C,EAAOL,OAASK,EAAON,SAElB,IAAVr/C,GAAeujB,GAAKvjB,KAAWujB,GAAKo8B,EAAOL,UAC7C99C,EAAQ,GAEVA,GAASxB,GAGX,MAAMm/C,EAAcrgC,GAAcyjC,IAAeE,EAAuBjhD,EAAZ+gD,EAC5D,IAAIp6B,EAAOmC,EAAOQ,iBAAiBq0B,GAWnC,GAREgC,EADEjmD,KAAK21B,MAAM6xB,kBAAkB9oD,GACxB0wB,EAAOQ,iBAAiBtpB,EAAQI,GAGhCumB,EAGT5f,EAAO44C,EAAOh5B,EAEVhe,KAAKuZ,IAAInb,GAAQi6C,EAAc,CACjCj6C,EAAOq3C,GAAQr3C,EAAM+hB,EAAQu1B,GAAc2C,EACvCxiD,IAAU6/C,IACZ13B,GAAQ5f,EAAO,GAEjB,MAAMo6C,EAAar4B,EAAOs4B,mBAAmB,GACvCC,EAAWv4B,EAAOs4B,mBAAmB,GACrC31C,EAAM9C,KAAK8C,IAAI01C,EAAYE,GAC3B71C,EAAM7C,KAAK6C,IAAI21C,EAAYE,GACjC16B,EAAOhe,KAAK6C,IAAI7C,KAAK8C,IAAIkb,EAAMnb,GAAMC,GACrCk0C,EAAOh5B,EAAO5f,EAEViuC,IAAaiM,IAEf3f,EAAOoS,QAAQ5qB,EAAOI,MAAM+qB,cAAc90B,GAAgB2J,EAAOw4B,iBAAiB3B,GAAQ72B,EAAOw4B,iBAAiB36B,G,CAItH,GAAIA,IAASmC,EAAOQ,iBAAiB+0B,GAAa,CAChD,MAAMkD,EAAWx/B,GAAKhb,GAAQ+hB,EAAO04B,qBAAqBnD,GAAc,EACxE13B,GAAQ46B,EACRx6C,GAAQw6C,C,CAGV,MAAO,CACLx6C,OACA4f,OACAg5B,OACAI,OAAQJ,EAAO54C,EAAO,EAE1B,CAKA+4C,wBAAAA,CAAyB1nD,EAAO2kD,GAC9B,MAAMtoB,EAAQsoB,EAAMtoB,MACdjtB,EAAU9N,KAAK8N,QACf44C,EAAW54C,EAAQ44C,SACnBqB,EAAkBzjC,GAAexW,EAAQi6C,gBAAiBC,KAChE,IAAI3B,EAAQh5C,EACZ,MAAM46C,EAAYjoD,KAAK6mD,gBACvB,GAAIxD,EAAMkD,QAAS,CACjB,MAAMjD,EAAaoD,EAAW1mD,KAAK4mD,eAAeloD,GAAS2kD,EAAMC,WAC3Dp8C,EAAiC,SAAzB4G,EAAQ01C,aAClBK,GAA0BnlD,EAAO2kD,EAAOv1C,EAASw1C,EAAa2E,GAC9D7E,GAAyB1kD,EAAO2kD,EAAOv1C,EAASw1C,EAAa2E,GAC3DC,EAA0C,MAAjCloD,KAAK21B,MAAM7nB,QAAQusB,UAAoBr6B,KAAK28C,aAAaG,QAAU98C,KAAK28C,aAAaK,QAC9FmL,EAAanoD,KAAK8mD,WAAW/gC,QAAQzB,GAAe4jC,EAAQloD,KAAK+mD,gCACjEqB,EAAapoD,KAAKknD,eAAelnD,KAAKtB,MAAOsB,KAAK+5C,YAAYzB,MAAOoO,EAAWhoD,OAAQoV,GAAaq0C,EAC3G9B,EAASn/C,EAAMZ,MAASY,EAAMy8C,MAAQyE,EAAelhD,EAAMy8C,MAAQ,EACnEt2C,EAAO4B,KAAK8C,IAAIg2C,EAAiB7gD,EAAMy8C,MAAQz8C,EAAMwa,M,MAGrD2kC,EAAStrB,EAAMnL,iBAAiB5vB,KAAKm/C,UAAUzgD,GAAOq8B,EAAMvL,MAAO9wB,GACnE2O,EAAO4B,KAAK8C,IAAIg2C,EAAiB1E,EAAMtxC,IAAMsxC,EAAM3hC,OAIrD,MAAO,CACLuL,KAAMo5B,EAASh5C,EAAO,EACtB44C,KAAMI,EAASh5C,EAAO,EACtBg5C,SACAh5C,OAEJ,CAEAgnC,IAAAA,GACE,MAAMvlB,EAAO9uB,KAAK+5C,YACZ3qB,EAASN,EAAKM,OACdi5B,EAAQv5B,EAAKpvB,KACb4lB,EAAO+iC,EAAM3hD,OACnB,IAAI8N,EAAI,EAER,KAAOA,EAAI8Q,IAAQ9Q,EACsB,OAAnCxU,KAAKm/C,UAAU3qC,GAAG4a,EAAOI,OAAmB64B,EAAM7zC,GAAG6mC,QACvDgN,EAAM7zC,GAAG6/B,KAAKr0C,KAAKpC,KAGzB,GAEF8nD,EAAAA,GAAAA,GAxaqBC,GAAsB,KAE7B,QAAMD,EAAAA,GAAAA,GAFCC,GAAsB,WAOvB,CAChBvJ,oBAAoB,EACpBC,gBAAiB,MAEjBoH,mBAAoB,GACpBC,cAAe,GACf6C,SAAS,EAETtyB,WAAY,CACVf,QAAS,CACP5zB,KAAM,SACNs0B,WAAY,CAAC,IAAK,IAAK,OAAQ,QAAS,eAG5C8xB,EAAAA,GAAAA,GArBiBC,GAAsB,YA0BtB,CACjB3qB,OAAQ,CACNstB,QAAS,CACPhpD,KAAM,WACNq3B,QAAQ,EACRK,KAAM,CACJL,QAAQ,IAGZ4xB,QAAS,CACPjpD,KAAM,SACNs3B,aAAa,MCnSN,MAAM4xB,WAAyBjN,GAiC5Ce,UAAAA,GACEt8C,KAAKg8C,qBAAsB,EAC3B4J,MAAMtJ,YACR,CAMAsC,kBAAAA,CAAmB9vB,EAAMpvB,EAAM4G,EAAO+H,GACpC,MAAMu5B,EAASge,MAAMhH,mBAAmB9vB,EAAMpvB,EAAM4G,EAAO+H,GAC3D,IAAK,IAAImG,EAAI,EAAGA,EAAIozB,EAAOlhC,OAAQ8N,IACjCozB,EAAOpzB,GAAG6vC,QAAUrkD,KAAKkgD,0BAA0B1rC,EAAIlO,GAAO23B,OAEhE,OAAO2J,CACT,CAMA8W,cAAAA,CAAe5vB,EAAMpvB,EAAM4G,EAAO+H,GAChC,MAAMu5B,EAASge,MAAMlH,eAAe5vB,EAAMpvB,EAAM4G,EAAO+H,GACvD,IAAK,IAAImG,EAAI,EAAGA,EAAIozB,EAAOlhC,OAAQ8N,IAAK,CACtC,MAAMhW,EAAOkB,EAAK4G,EAAQkO,GAC1BozB,EAAOpzB,GAAG6vC,QAAU//B,GAAe9lB,EAAK,GAAIwB,KAAKkgD,0BAA0B1rC,EAAIlO,GAAO23B,OACxF,CACA,OAAO2J,CACT,CAMA+W,eAAAA,CAAgB7vB,EAAMpvB,EAAM4G,EAAO+H,GACjC,MAAMu5B,EAASge,MAAMjH,gBAAgB7vB,EAAMpvB,EAAM4G,EAAO+H,GACxD,IAAK,IAAImG,EAAI,EAAGA,EAAIozB,EAAOlhC,OAAQ8N,IAAK,CACtC,MAAMhW,EAAOkB,EAAK4G,EAAQkO,GAC1BozB,EAAOpzB,GAAG6vC,QAAU//B,GAAe9lB,GAAQA,EAAK8U,IAAM9U,EAAK8U,EAAGtT,KAAKkgD,0BAA0B1rC,EAAIlO,GAAO23B,OAC1G,CACA,OAAO2J,CACT,CAKAkY,cAAAA,GACE,MAAMpgD,EAAOM,KAAK+5C,YAAYr6C,KAE9B,IAAIoS,EAAM,EACV,IAAK,IAAI0C,EAAI9U,EAAKgH,OAAS,EAAG8N,GAAK,IAAKA,EACtC1C,EAAM7C,KAAK6C,IAAIA,EAAKpS,EAAK8U,GAAGnH,KAAKrN,KAAKkgD,0BAA0B1rC,IAAM,GAExE,OAAO1C,EAAM,GAAKA,CACpB,CAKAiuC,gBAAAA,CAAiBrhD,GACf,MAAMowB,EAAO9uB,KAAK+5C,YACZ+E,EAAS9+C,KAAK21B,MAAMj2B,KAAKo/C,QAAU,IACnC,OAAC5uB,EAAA,OAAQC,GAAUrB,EACnB8Y,EAAS5nC,KAAKm/C,UAAUzgD,GACxBgX,EAAIwa,EAAO8vB,iBAAiBpY,EAAOlyB,GACnCiR,EAAIwJ,EAAO6vB,iBAAiBpY,EAAOjhB,GACnCrT,EAAIs0B,EAAOyc,QAEjB,MAAO,CACL/2C,MAAOwxC,EAAOpgD,IAAU,GACxBoG,MAAO,IAAM4Q,EAAI,KAAOiR,GAAKrT,EAAI,KAAOA,EAAI,IAAM,IAEtD,CAEA8iC,MAAAA,CAAO7b,GACL,MAAMxL,EAAS/uB,KAAK+5C,YAAYr6C,KAGhCM,KAAKgiD,eAAejzB,EAAQ,EAAGA,EAAOroB,OAAQ6zB,EAChD,CAEAynB,cAAAA,CAAejzB,EAAQzoB,EAAO+H,EAAOksB,GACnC,MAAMqjB,EAAiB,UAATrjB,GACR,OAACpL,EAAA,OAAQC,GAAUpvB,KAAK+5C,aACxB,cAAC8G,EAAa,eAAED,GAAkB5gD,KAAK+gD,kBAAkBz6C,EAAOi0B,GAChE0f,EAAQ9qB,EAAOK,KACf0qB,EAAQ9qB,EAAOI,KAErB,IAAK,IAAIhb,EAAIlO,EAAOkO,EAAIlO,EAAQ+H,EAAOmG,IAAK,CAC1C,MAAMub,EAAQhB,EAAOva,GACfozB,GAAUgW,GAAS59C,KAAKm/C,UAAU3qC,GAClCof,EAAa,CAAC,EACd8V,EAAS9V,EAAWqmB,GAAS2D,EAAQzuB,EAAOu4B,mBAAmB,IAAOv4B,EAAOS,iBAAiBgY,EAAOqS,IACrGtQ,EAAS/V,EAAWsmB,GAAS0D,EAAQxuB,EAAO02B,eAAiB12B,EAAOQ,iBAAiBgY,EAAOsS,IAElGtmB,EAAWoU,KAAOxe,MAAMkgB,IAAWlgB,MAAMmgB,GAErCiX,IACFhtB,EAAW9lB,QAAU+yC,GAAiB7gD,KAAKkgD,0BAA0B1rC,EAAGub,EAAM8D,OAAS,SAAW0G,GAE9FqjB,IACFhqB,EAAW9lB,QAAQmwB,OAAS,IAIhCj+B,KAAKmhD,cAAcpxB,EAAOvb,EAAGof,EAAY2G,EAC3C,CACF,CAOA2lB,yBAAAA,CAA0BxhD,EAAO67B,GAC/B,MAAMqN,EAAS5nC,KAAKm/C,UAAUzgD,GAC9B,IAAI4tB,EAASs5B,MAAM1F,0BAA0BxhD,EAAO67B,GAGhDjO,EAAOirB,UACTjrB,EAASte,OAAO8T,OAAO,CAAC,EAAGwK,EAAQ,CAACirB,SAAS,KAI/C,MAAMtZ,EAAS3R,EAAO2R,OAMtB,MALa,WAAT1D,IACFjO,EAAO2R,OAAS,GAElB3R,EAAO2R,QAAU3Z,GAAesjB,GAAUA,EAAOyc,QAASpmB,GAEnD3R,CACT,EC9JF,SAASm8B,GAAkBzqB,EAAU0qB,EAAeC,GAClD,IAAIC,EAAS,EACTC,EAAS,EACT3c,EAAU,EACVC,EAAU,EAEd,GAAIuc,EAAgB9gC,GAAK,CACvB,MAAMkhC,EAAa9qB,EACb+qB,EAAWD,EAAaJ,EACxBM,EAAS/5C,KAAK6iB,IAAIg3B,GAClBG,EAASh6C,KAAK4hB,IAAIi4B,GAClBI,EAAOj6C,KAAK6iB,IAAIi3B,GAChBI,EAAOl6C,KAAK4hB,IAAIk4B,GAChBK,EAAUA,CAAC3+B,EAAO9X,EAAGC,IAAMqY,GAAcR,EAAOq+B,EAAYC,GAAU,GAAQ,EAAI95C,KAAK6C,IAAIa,EAAGA,EAAIg2C,EAAQ/1C,EAAGA,EAAI+1C,GACjHU,EAAUA,CAAC5+B,EAAO9X,EAAGC,IAAMqY,GAAcR,EAAOq+B,EAAYC,GAAU,IAAS,EAAI95C,KAAK8C,IAAIY,EAAGA,EAAIg2C,EAAQ/1C,EAAGA,EAAI+1C,GAClHW,EAAOF,EAAQ,EAAGJ,EAAQE,GAC1BK,EAAOH,EAAQnhC,GAASghC,EAAQE,GAChCK,EAAOH,EAAQ1hC,GAAIqhC,EAAQE,GAC3BO,EAAOJ,EAAQ1hC,GAAKM,GAASghC,EAAQE,GAC3CP,GAAUU,EAAOE,GAAQ,EACzBX,GAAUU,EAAOE,GAAQ,EACzBvd,IAAYod,EAAOE,GAAQ,EAC3Brd,IAAYod,EAAOE,GAAQ,C,CAE7B,MAAO,CAACb,SAAQC,SAAQ3c,UAASC,UACnC,EDsIAuZ,EAAAA,GAAAA,GArKqB8C,GAAyB,KAEhC,WAAS9C,EAAAA,GAAAA,GAFF8C,GAAyB,WAO1B,CAChBpM,oBAAoB,EACpBC,gBAAiB,QAEjBpoB,WAAY,CACVf,QAAS,CACP5zB,KAAM,SACNs0B,WAAY,CAAC,IAAK,IAAK,cAAe,eAG1C8xB,EAAAA,GAAAA,GAjBiB8C,GAAyB,YAsBzB,CACjBxtB,OAAQ,CACNtlB,EAAG,CACDpW,KAAM,UAERqnB,EAAG,CACDrnB,KAAM,aCKC,MAAMoqD,WAA2BnO,GA6F9Cn5B,WAAAA,CAAYuT,EAAOlQ,GACjBmgC,MAAMjwB,EAAOlQ,GAEbzlB,KAAKg8C,qBAAsB,EAC3Bh8C,KAAK2pD,iBAAc71C,EACnB9T,KAAK4pD,iBAAc91C,EACnB9T,KAAKksC,aAAUp4B,EACf9T,KAAKmsC,aAAUr4B,CACjB,CAEAyoC,UAAAA,GAAc,CAKd1U,KAAAA,CAAMvhC,EAAO+H,GACX,MAAM3O,EAAOM,KAAK28C,aAAaj9C,KACzBovB,EAAO9uB,KAAK+5C,YAElB,IAAsB,IAAlB/5C,KAAK2nC,SACP7Y,EAAKO,QAAU3vB,MACV,CACL,IAOI8U,EAAG8Q,EAPHukC,EAAUr1C,IAAO9U,EAAK8U,GAE1B,GAAIyP,GAASvkB,EAAK4G,IAAS,CACzB,MAAM,IAAC7H,EAAM,SAAWuB,KAAK2nC,SAC7BkiB,EAAUr1C,IAAO0S,GAAiBxnB,EAAK8U,GAAI/V,E,CAI7C,IAAK+V,EAAIlO,EAAOgf,EAAOhf,EAAQ+H,EAAOmG,EAAI8Q,IAAQ9Q,EAChDsa,EAAKO,QAAQ7a,GAAKq1C,EAAOr1C,E,CAG/B,CAKAs1C,YAAAA,GACE,OAAOhgC,GAAU9pB,KAAK8N,QAAQkwB,SAAW,GAC3C,CAKA+rB,iBAAAA,GACE,OAAOjgC,GAAU9pB,KAAK8N,QAAQ46C,cAChC,CAMAsB,mBAAAA,GACE,IAAIj4C,EAAM6V,GACN9V,GAAO8V,GAEX,IAAK,IAAIpT,EAAI,EAAGA,EAAIxU,KAAK21B,MAAMj2B,KAAK45B,SAAS5yB,SAAU8N,EACrD,GAAIxU,KAAK21B,MAAMs0B,iBAAiBz1C,IAAMxU,KAAK21B,MAAM8nB,eAAejpC,GAAGlV,OAASU,KAAK07C,MAAO,CACtF,MAAM5B,EAAa95C,KAAK21B,MAAM8nB,eAAejpC,GAAGslC,WAC1C9b,EAAW8b,EAAWgQ,eACtBpB,EAAgB5O,EAAWiQ,oBAEjCh4C,EAAM9C,KAAK8C,IAAIA,EAAKisB,GACpBlsB,EAAM7C,KAAK6C,IAAIA,EAAKksB,EAAW0qB,E,CAInC,MAAO,CACL1qB,SAAUjsB,EACV22C,cAAe52C,EAAMC,EAEzB,CAKAqkC,MAAAA,CAAO7b,GACL,MAAM5E,EAAQ31B,KAAK21B,OACb,UAACqd,GAAard,EACd7G,EAAO9uB,KAAK+5C,YACZmQ,EAAOp7B,EAAKpvB,KACZyqD,EAAUnqD,KAAKoqD,oBAAsBpqD,KAAKqqD,aAAaH,GAAQlqD,KAAK8N,QAAQq8C,QAC5EG,EAAUr7C,KAAK6C,KAAK7C,KAAK8C,IAAIihC,EAAU/yC,MAAO+yC,EAAUzV,QAAU4sB,GAAW,EAAG,GAChFxB,EAAS15C,KAAK8C,IAAIwS,GAAavkB,KAAK8N,QAAQ66C,OAAQ2B,GAAU,GAC9DC,EAAcvqD,KAAKwqD,eAAexqD,KAAKtB,QAKvC,cAACgqD,EAAA,SAAe1qB,GAAYh+B,KAAKgqD,uBACjC,OAACpB,EAAA,OAAQC,EAAA,QAAQ3c,EAAA,QAASC,GAAWsc,GAAkBzqB,EAAU0qB,EAAeC,GAChFjnB,GAAYsR,EAAU/yC,MAAQkqD,GAAWvB,EACzC7b,GAAaiG,EAAUzV,OAAS4sB,GAAWtB,EAC3C4B,EAAYx7C,KAAK6C,IAAI7C,KAAK8C,IAAI2vB,EAAUqL,GAAa,EAAG,GACxD6c,EAAcjlC,GAAY3kB,KAAK8N,QAAQmwB,OAAQwsB,GAC/Cd,EAAc16C,KAAK6C,IAAI83C,EAAcjB,EAAQ,GAC7C+B,GAAgBd,EAAcD,GAAe3pD,KAAK2qD,gCACxD3qD,KAAKksC,QAAUA,EAAU0d,EACzB5pD,KAAKmsC,QAAUA,EAAUyd,EAEzB96B,EAAKxf,MAAQtP,KAAK4qD,iBAElB5qD,KAAK4pD,YAAcA,EAAcc,EAAe1qD,KAAK6qD,qBAAqB7qD,KAAKtB,OAC/EsB,KAAK2pD,YAAc16C,KAAK6C,IAAI9R,KAAK4pD,YAAcc,EAAeH,EAAa,GAE3EvqD,KAAKgiD,eAAekI,EAAM,EAAGA,EAAKxjD,OAAQ6zB,EAC5C,CAKAuwB,cAAAA,CAAet2C,EAAGopC,GAChB,MAAM5d,EAAOhgC,KAAK8N,QACZghB,EAAO9uB,KAAK+5C,YACZ2O,EAAgB1oD,KAAK+pD,oBAC3B,OAAInM,GAAU5d,EAAKlM,UAAUi3B,gBAAmB/qD,KAAK21B,MAAM6xB,kBAAkBhzC,IAA0B,OAApBsa,EAAKO,QAAQ7a,IAAesa,EAAKpvB,KAAK8U,GAAG6mC,OACnH,EAEFr7C,KAAKgrD,uBAAuBl8B,EAAKO,QAAQ7a,GAAKk0C,EAAgB9gC,GACvE,CAEAo6B,cAAAA,CAAekI,EAAM5jD,EAAO+H,EAAOksB,GACjC,MAAMqjB,EAAiB,UAATrjB,EACR5E,EAAQ31B,KAAK21B,MACbqd,EAAYrd,EAAMqd,UAClBhT,EAAOrK,EAAM7nB,QACbm9C,EAAgBjrB,EAAKlM,UACrBo3B,GAAWlY,EAAUvkB,KAAOukB,EAAUtkB,OAAS,EAC/Cy8B,GAAWnY,EAAUze,IAAMye,EAAUxe,QAAU,EAC/C42B,EAAexN,GAASqN,EAAcG,aACtCzB,EAAcyB,EAAe,EAAIprD,KAAK2pD,YACtCC,EAAcwB,EAAe,EAAIprD,KAAK4pD,aACtC,cAAC/I,EAAa,eAAED,GAAkB5gD,KAAK+gD,kBAAkBz6C,EAAOi0B,GACtE,IACI/lB,EADAs0C,EAAa9oD,KAAK8pD,eAGtB,IAAKt1C,EAAI,EAAGA,EAAIlO,IAASkO,EACvBs0C,GAAc9oD,KAAK8qD,eAAet2C,EAAGopC,GAGvC,IAAKppC,EAAIlO,EAAOkO,EAAIlO,EAAQ+H,IAASmG,EAAG,CACtC,MAAMk0C,EAAgB1oD,KAAK8qD,eAAet2C,EAAGopC,GACvCrf,EAAM2rB,EAAK11C,GACXof,EAAa,CACjBle,EAAGw1C,EAAUlrD,KAAKksC,QAClBvlB,EAAGwkC,EAAUnrD,KAAKmsC,QAClB2c,aACAC,SAAUD,EAAaJ,EACvBA,gBACAkB,cACAD,eAEE/I,IACFhtB,EAAW9lB,QAAU+yC,GAAiB7gD,KAAKkgD,0BAA0B1rC,EAAG+pB,EAAI1K,OAAS,SAAW0G,IAElGuuB,GAAcJ,EAEd1oD,KAAKmhD,cAAc5iB,EAAK/pB,EAAGof,EAAY2G,EACzC,CACF,CAEAqwB,cAAAA,GACE,MAAM97B,EAAO9uB,KAAK+5C,YACZsR,EAAWv8B,EAAKpvB,KACtB,IACI8U,EADAlF,EAAQ,EAGZ,IAAKkF,EAAI,EAAGA,EAAI62C,EAAS3kD,OAAQ8N,IAAK,CACpC,MAAM1P,EAAQgqB,EAAKO,QAAQ7a,GACb,OAAV1P,GAAmB0kB,MAAM1kB,KAAU9E,KAAK21B,MAAM6xB,kBAAkBhzC,IAAO62C,EAAS72C,GAAG6mC,SACrF/rC,GAASL,KAAKuZ,IAAI1jB,GAEtB,CAEA,OAAOwK,CACT,CAEA07C,sBAAAA,CAAuBlmD,GACrB,MAAMwK,EAAQtP,KAAK+5C,YAAYzqC,MAC/B,OAAIA,EAAQ,IAAMka,MAAM1kB,GACf8iB,IAAO3Y,KAAKuZ,IAAI1jB,GAASwK,GAE3B,CACT,CAEAywC,gBAAAA,CAAiBrhD,GACf,MAAMowB,EAAO9uB,KAAK+5C,YACZpkB,EAAQ31B,KAAK21B,MACbmpB,EAASnpB,EAAMj2B,KAAKo/C,QAAU,GAC9Bh6C,EAAQswB,GAAatG,EAAKO,QAAQ3wB,GAAQi3B,EAAM7nB,QAAQ8mB,QAE9D,MAAO,CACLtnB,MAAOwxC,EAAOpgD,IAAU,GACxBoG,QAEJ,CAEAslD,iBAAAA,CAAkBF,GAChB,IAAIp4C,EAAM,EACV,MAAM6jB,EAAQ31B,KAAK21B,MACnB,IAAInhB,EAAG8Q,EAAMwJ,EAAMgrB,EAAYhsC,EAE/B,IAAKo8C,EAEH,IAAK11C,EAAI,EAAG8Q,EAAOqQ,EAAMj2B,KAAK45B,SAAS5yB,OAAQ8N,EAAI8Q,IAAQ9Q,EACzD,GAAImhB,EAAMs0B,iBAAiBz1C,GAAI,CAC7Bsa,EAAO6G,EAAM8nB,eAAejpC,GAC5B01C,EAAOp7B,EAAKpvB,KACZo6C,EAAahrB,EAAKgrB,WAClB,K,CAKN,IAAKoQ,EACH,OAAO,EAGT,IAAK11C,EAAI,EAAG8Q,EAAO4kC,EAAKxjD,OAAQ8N,EAAI8Q,IAAQ9Q,EAC1C1G,EAAUgsC,EAAWoG,0BAA0B1rC,GACnB,UAAxB1G,EAAQw9C,cACVx5C,EAAM7C,KAAK6C,IAAIA,EAAKhE,EAAQgxB,aAAe,EAAGhxB,EAAQy9C,kBAAoB,IAG9E,OAAOz5C,CACT,CAEAu4C,YAAAA,CAAaH,GACX,IAAIp4C,EAAM,EAEV,IAAK,IAAI0C,EAAI,EAAG8Q,EAAO4kC,EAAKxjD,OAAQ8N,EAAI8Q,IAAQ9Q,EAAG,CACjD,MAAM1G,EAAU9N,KAAKkgD,0BAA0B1rC,GAC/C1C,EAAM7C,KAAK6C,IAAIA,EAAKhE,EAAQ6oB,QAAU,EAAG7oB,EAAQ09C,aAAe,EAClE,CACA,OAAO15C,CACT,CAMA+4C,oBAAAA,CAAqBplC,GACnB,IAAIgmC,EAAmB,EAEvB,IAAK,IAAIj3C,EAAI,EAAGA,EAAIiR,IAAgBjR,EAC9BxU,KAAK21B,MAAMs0B,iBAAiBz1C,KAC9Bi3C,GAAoBzrD,KAAKwqD,eAAeh2C,IAI5C,OAAOi3C,CACT,CAKAjB,cAAAA,CAAe/kC,GACb,OAAOxW,KAAK6C,IAAIwS,GAAetkB,KAAK21B,MAAMj2B,KAAK45B,SAAS7T,GAAc9C,OAAQ,GAAI,EACpF,CAMAgoC,6BAAAA,GACE,OAAO3qD,KAAK6qD,qBAAqB7qD,KAAK21B,MAAMj2B,KAAK45B,SAAS5yB,SAAW,CACvE,GACFg/C,EAAAA,GAAAA,GA1WqBgE,GAA2B,KAElC,aAAWhE,EAAAA,GAAAA,GAFJgE,GAA2B,WAO5B,CAChBtN,oBAAoB,EACpBC,gBAAiB,MACjBvoB,UAAW,CAETi3B,eAAe,EAEfK,cAAc,GAEhBn3B,WAAY,CACVf,QAAS,CACP5zB,KAAM,SACNs0B,WAAY,CAAC,gBAAiB,WAAY,cAAe,cAAe,aAAc,IAAK,IAAK,SAAU,cAAe,aAI7H+0B,OAAQ,MAGR3qB,SAAU,EAGV0qB,cAAe,IAGfzqB,OAAQ,OAGRksB,QAAS,EAET9vB,UAAW,OACXqrB,EAAAA,GAAAA,GAtCiBgE,GAA2B,cAwCzB,CACnB/1B,YAAcv0B,GAAkB,YAATA,EACvBs0B,WAAat0B,GAAkB,YAATA,IAAuBA,EAAKs5B,WAAW,gBAAkBt5B,EAAKs5B,WAAW,sBAC/FgtB,EAAAA,GAAAA,GA3CiBgE,GAA2B,YAgD3B,CACjBhc,YAAa,EAGb7S,QAAS,CACP6wB,OAAQ,CACN5M,OAAQ,CACN6M,cAAAA,CAAeh2B,GACb,MAAMj2B,EAAOi2B,EAAMj2B,MACZo/C,QAAQ,WAAC/gB,EAAA,UAAYoC,EAAA,MAAWzd,EAAK,gBAAEkpC,EAAA,aAAiBC,IAAiBl2B,EAAM+1B,OAAO59C,QAC7F,OAAIpO,EAAKo/C,OAAOp4C,QAAUhH,EAAK45B,SAAS5yB,OAC/BhH,EAAKo/C,OAAOjqC,IAAI,CAACvH,EAAOkH,KAC7B,MAAMsa,EAAO6G,EAAM8nB,eAAe,GAC5Bp/C,EAAQywB,EAAKgrB,WAAWvO,SAAS/2B,GAEvC,MAAO,CACLkjB,KAAMpqB,EACN4yB,UAAW7hC,EAAM+6B,gBACjB0yB,UAAWppC,EACX24B,QAAS1lB,EAAM6xB,kBAAkBhzC,GACjCu3C,SAAU1tD,EAAMs0C,WAChBqZ,eAAgB3tD,EAAMu0C,iBACtBqZ,SAAU5tD,EAAMw0C,gBAChB5b,UAAW54B,EAAMygC,YACjBiC,YAAa1iC,EAAMg7B,YACnB8G,UAAWA,EACXpC,WAAYA,EACZ8tB,aAAcD,IAAoBC,GAAgBxtD,EAAMwtD,cAExDntD,MAAO8V,KAIN,EACT,GAGF5V,OAAAA,CAAQmU,EAAGm5C,EAAYR,GACrBA,EAAO/1B,MAAMw2B,qBAAqBD,EAAWxtD,OAC7CgtD,EAAO/1B,MAAMygB,QACf,MCvHO,MAAMgW,WAAuB7Q,GA6B1Ce,UAAAA,GACEt8C,KAAKg8C,qBAAsB,EAC3Bh8C,KAAKi8C,oBAAqB,EAC1B2J,MAAMtJ,YACR,CAEAlG,MAAAA,CAAO7b,GACL,MAAMzL,EAAO9uB,KAAK+5C,aACXxqB,QAAS+Q,EAAM5gC,KAAMqvB,EAAS,GAAE,SAAEs9B,GAAYv9B,EAE/CE,EAAqBhvB,KAAK21B,MAAMmrB,oBACtC,IAAI,MAACx6C,EAAA,MAAO+H,GAASwgB,GAAiCC,EAAMC,EAAQC,GAEpEhvB,KAAK87C,WAAax1C,EAClBtG,KAAK+7C,WAAa1tC,EAEd4hB,GAAoBnB,KACtBxoB,EAAQ,EACR+H,EAAQ0gB,EAAOroB,QAIjB45B,EAAKwR,OAAS9xC,KAAK21B,MACnB2K,EAAK2R,cAAgBjyC,KAAKtB,MAC1B4hC,EAAKgsB,aAAeD,EAASC,WAC7BhsB,EAAKvR,OAASA,EAEd,MAAMjhB,EAAU9N,KAAKigD,6BAA6B1lB,GAC7Cv6B,KAAK8N,QAAQmtB,WAChBntB,EAAQgxB,YAAc,GAExBhxB,EAAQsiC,QAAUpwC,KAAK8N,QAAQsiC,QAC/BpwC,KAAKmhD,cAAc7gB,OAAMxsB,EAAW,CAClCy4C,UAAWv9B,EACXlhB,WACCysB,GAGHv6B,KAAKgiD,eAAejzB,EAAQzoB,EAAO+H,EAAOksB,EAC5C,CAEAynB,cAAAA,CAAejzB,EAAQzoB,EAAO+H,EAAOksB,GACnC,MAAMqjB,EAAiB,UAATrjB,GACR,OAACpL,EAAA,OAAQC,EAAA,SAAQksB,EAAA,SAAU+Q,GAAYrsD,KAAK+5C,aAC5C,cAAC8G,EAAa,eAAED,GAAkB5gD,KAAK+gD,kBAAkBz6C,EAAOi0B,GAChE0f,EAAQ9qB,EAAOK,KACf0qB,EAAQ9qB,EAAOI,MACf,SAACF,EAAA,QAAU8gB,GAAWpwC,KAAK8N,QAC3B0+C,EAAejjC,GAAS+F,GAAYA,EAAW9pB,OAAOuiB,kBACtD0kC,EAAezsD,KAAK21B,MAAMmrB,qBAAuBlD,GAAkB,SAATrjB,EAC1DrP,EAAM5kB,EAAQ+H,EACdq+C,EAAc39B,EAAOroB,OAC3B,IAAIimD,EAAarmD,EAAQ,GAAKtG,KAAKm/C,UAAU74C,EAAQ,GAErD,IAAK,IAAIkO,EAAI,EAAGA,EAAIk4C,IAAel4C,EAAG,CACpC,MAAMub,EAAQhB,EAAOva,GACfof,EAAa64B,EAAe18B,EAAQ,GAE1C,GAAIvb,EAAIlO,GAASkO,GAAK0W,EAAK,CACzB0I,EAAWoU,MAAO,EAClB,Q,CAGF,MAAMJ,EAAS5nC,KAAKm/C,UAAU3qC,GACxBo4C,EAAWhpC,GAAcgkB,EAAOsS,IAChCxQ,EAAS9V,EAAWqmB,GAAS9qB,EAAOS,iBAAiBgY,EAAOqS,GAAQzlC,GACpEm1B,EAAS/V,EAAWsmB,GAAS0D,GAASgP,EAAWx9B,EAAO02B,eAAiB12B,EAAOQ,iBAAiB0rB,EAAWt7C,KAAKq4C,WAAWjpB,EAAQwY,EAAQ0T,GAAY1T,EAAOsS,GAAQ1lC,GAE7Kof,EAAWoU,KAAOxe,MAAMkgB,IAAWlgB,MAAMmgB,IAAWijB,EACpDh5B,EAAWyd,KAAO78B,EAAI,GAAKvF,KAAMuZ,IAAIof,EAAOqS,GAAS0S,EAAW1S,IAAWuS,EACvEpc,IACFxc,EAAWgU,OAASA,EACpBhU,EAAWinB,IAAMwR,EAAS3sD,KAAK8U,IAG7BosC,IACFhtB,EAAW9lB,QAAU+yC,GAAiB7gD,KAAKkgD,0BAA0B1rC,EAAGub,EAAM8D,OAAS,SAAW0G,IAG/FkyB,GACHzsD,KAAKmhD,cAAcpxB,EAAOvb,EAAGof,EAAY2G,GAG3CoyB,EAAa/kB,CACf,CACF,CAKAkY,cAAAA,GACE,MAAMhxB,EAAO9uB,KAAK+5C,YACZxqB,EAAUT,EAAKS,QACfgI,EAAShI,EAAQzhB,SAAWyhB,EAAQzhB,QAAQgxB,aAAe,EAC3Dp/B,EAAOovB,EAAKpvB,MAAQ,GAC1B,IAAKA,EAAKgH,OACR,OAAO6wB,EAET,MAAM4Q,EAAazoC,EAAK,GAAG2N,KAAKrN,KAAKkgD,0BAA0B,IACzD2M,EAAYntD,EAAKA,EAAKgH,OAAS,GAAG2G,KAAKrN,KAAKkgD,0BAA0BxgD,EAAKgH,OAAS,IAC1F,OAAOuI,KAAK6C,IAAIylB,EAAQ4Q,EAAY0kB,GAAa,CACnD,CAEAxY,IAAAA,GACE,MAAMvlB,EAAO9uB,KAAK+5C,YAClBjrB,EAAKS,QAAQu9B,oBAAoB9sD,KAAK21B,MAAMqd,UAAWlkB,EAAKK,OAAOK,MACnEo2B,MAAMvR,MACR,GACFqR,EAAAA,GAAAA,GAzIqB0G,GAAuB,KAE9B,SAAO1G,EAAAA,GAAAA,GAFA0G,GAAuB,WAOxB,CAChBhQ,mBAAoB,OACpBC,gBAAiB,QAEjBphB,UAAU,EACV3L,UAAU,KACVo2B,EAAAA,GAAAA,GAbiB0G,GAAuB,YAkBvB,CACjBpxB,OAAQ,CACNstB,QAAS,CACPhpD,KAAM,YAERipD,QAAS,CACPjpD,KAAM,aC1BC,MAAMytD,WAA4BxR,GAoF/Cn5B,WAAAA,CAAYuT,EAAOlQ,GACjBmgC,MAAMjwB,EAAOlQ,GAEbzlB,KAAK2pD,iBAAc71C,EACnB9T,KAAK4pD,iBAAc91C,CACrB,CAEAisC,gBAAAA,CAAiBrhD,GACf,MAAMowB,EAAO9uB,KAAK+5C,YACZpkB,EAAQ31B,KAAK21B,MACbmpB,EAASnpB,EAAMj2B,KAAKo/C,QAAU,GAC9Bh6C,EAAQswB,GAAatG,EAAKO,QAAQ3wB,GAAO4U,EAAGqiB,EAAM7nB,QAAQ8mB,QAEhE,MAAO,CACLtnB,MAAOwxC,EAAOpgD,IAAU,GACxBoG,QAEJ,CAEA65C,eAAAA,CAAgB7vB,EAAMpvB,EAAM4G,EAAO+H,GACjC,OAAOq5B,GAA4BslB,KAAKhtD,KAAjC0nC,CAAuC5Y,EAAMpvB,EAAM4G,EAAO+H,EACnE,CAEA+nC,MAAAA,CAAO7b,GACL,MAAM2vB,EAAOlqD,KAAK+5C,YAAYr6C,KAE9BM,KAAKitD,gBACLjtD,KAAKgiD,eAAekI,EAAM,EAAGA,EAAKxjD,OAAQ6zB,EAC5C,CAKAilB,SAAAA,GACE,MAAM1wB,EAAO9uB,KAAK+5C,YACZ7yC,EAAQ,CAAC6K,IAAKvM,OAAOuiB,kBAAmBjW,IAAKtM,OAAO4zC,mBAgB1D,OAdAtqB,EAAKpvB,KAAKqtB,QAAQ,CAACqe,EAAS1sC,KAC1B,MAAMkpC,EAAS5nC,KAAKm/C,UAAUzgD,GAAO4U,GAEhCkW,MAAMoe,IAAW5nC,KAAK21B,MAAM6xB,kBAAkB9oD,KAC7CkpC,EAAS1gC,EAAM6K,MACjB7K,EAAM6K,IAAM61B,GAGVA,EAAS1gC,EAAM4K,MACjB5K,EAAM4K,IAAM81B,MAKX1gC,CACT,CAKA+lD,aAAAA,GACE,MAAMt3B,EAAQ31B,KAAK21B,MACbqd,EAAYrd,EAAMqd,UAClBhT,EAAOrK,EAAM7nB,QACbo/C,EAAUj+C,KAAK8C,IAAIihC,EAAUtkB,MAAQskB,EAAUvkB,KAAMukB,EAAUxe,OAASwe,EAAUze,KAElFq1B,EAAc36C,KAAK6C,IAAIo7C,EAAU,EAAG,GACpCvD,EAAc16C,KAAK6C,IAAIkuB,EAAKmtB,iBAAmBvD,EAAe,IAAQ5pB,EAAKmtB,iBAAoB,EAAG,GAClGzC,GAAgBd,EAAcD,GAAeh0B,EAAMy3B,yBAEzDptD,KAAK4pD,YAAcA,EAAec,EAAe1qD,KAAKtB,MACtDsB,KAAK2pD,YAAc3pD,KAAK4pD,YAAcc,CACxC,CAEA1I,cAAAA,CAAekI,EAAM5jD,EAAO+H,EAAOksB,GACjC,MAAMqjB,EAAiB,UAATrjB,EACR5E,EAAQ31B,KAAK21B,MACbqK,EAAOrK,EAAM7nB,QACbm9C,EAAgBjrB,EAAKlM,UACrBiH,EAAQ/6B,KAAK+5C,YAAYyD,OACzB0N,EAAUnwB,EAAMsyB,QAChBlC,EAAUpwB,EAAMuyB,QAChBC,EAAoBxyB,EAAMyyB,cAAc,GAAK,GAAM7lC,GACzD,IACInT,EADAiW,EAAQ8iC,EAGZ,MAAME,EAAe,IAAMztD,KAAK0tD,uBAEhC,IAAKl5C,EAAI,EAAGA,EAAIlO,IAASkO,EACvBiW,GAASzqB,KAAK2tD,cAAcn5C,EAAG+lB,EAAMkzB,GAEvC,IAAKj5C,EAAIlO,EAAOkO,EAAIlO,EAAQ+H,EAAOmG,IAAK,CACtC,MAAM+pB,EAAM2rB,EAAK11C,GACjB,IAAIs0C,EAAar+B,EACbs+B,EAAWt+B,EAAQzqB,KAAK2tD,cAAcn5C,EAAG+lB,EAAMkzB,GAC/C7D,EAAcj0B,EAAM6xB,kBAAkBhzC,GAAKumB,EAAM6yB,8BAA8B5tD,KAAKm/C,UAAU3qC,GAAGlB,GAAK,EAC1GmX,EAAQs+B,EAEJnL,IACEqN,EAAcG,eAChBxB,EAAc,GAEZqB,EAAcF,gBAChBjC,EAAaC,EAAWwE,IAI5B,MAAM35B,EAAa,CACjBle,EAAGw1C,EACHvkC,EAAGwkC,EACHxB,YAAa,EACbC,cACAd,aACAC,WACAj7C,QAAS9N,KAAKkgD,0BAA0B1rC,EAAG+pB,EAAI1K,OAAS,SAAW0G,IAGrEv6B,KAAKmhD,cAAc5iB,EAAK/pB,EAAGof,EAAY2G,EACzC,CACF,CAEAmzB,oBAAAA,GACE,MAAM5+B,EAAO9uB,KAAK+5C,YAClB,IAAI1rC,EAAQ,EAQZ,OANAygB,EAAKpvB,KAAKqtB,QAAQ,CAACqe,EAAS1sC,MACrB8qB,MAAMxpB,KAAKm/C,UAAUzgD,GAAO4U,IAAMtT,KAAK21B,MAAM6xB,kBAAkB9oD,IAClE2P,MAIGA,CACT,CAKAs/C,aAAAA,CAAcjvD,EAAO67B,EAAMkzB,GACzB,OAAOztD,KAAK21B,MAAM6xB,kBAAkB9oD,GAChCorB,GAAU9pB,KAAKkgD,0BAA0BxhD,EAAO67B,GAAM9P,OAASgjC,GAC/D,CACN,GACF/H,EAAAA,GAAAA,GA/NqBqH,GAA4B,KAEnC,cAAYrH,EAAAA,GAAAA,GAFLqH,GAA4B,WAO7B,CAChB1Q,gBAAiB,MACjBvoB,UAAW,CACTi3B,eAAe,EACfK,cAAc,GAEhBn3B,WAAY,CACVf,QAAS,CACP5zB,KAAM,SACNs0B,WAAY,CAAC,IAAK,IAAK,aAAc,WAAY,cAAe,iBAGpEyG,UAAW,IACXyuB,WAAY,KACZpD,EAAAA,GAAAA,GArBiBqH,GAA4B,YA0B5B,CACjBrf,YAAa,EAEb7S,QAAS,CACP6wB,OAAQ,CACN5M,OAAQ,CACN6M,cAAAA,CAAeh2B,GACb,MAAMj2B,EAAOi2B,EAAMj2B,KACnB,GAAIA,EAAKo/C,OAAOp4C,QAAUhH,EAAK45B,SAAS5yB,OAAQ,CAC9C,MAAOo4C,QAAQ,WAAC/gB,EAAA,MAAYrb,IAAUiT,EAAM+1B,OAAO59C,QAEnD,OAAOpO,EAAKo/C,OAAOjqC,IAAI,CAACvH,EAAOkH,KAC7B,MAAMsa,EAAO6G,EAAM8nB,eAAe,GAC5Bp/C,EAAQywB,EAAKgrB,WAAWvO,SAAS/2B,GAEvC,MAAO,CACLkjB,KAAMpqB,EACN4yB,UAAW7hC,EAAM+6B,gBACjB2H,YAAa1iC,EAAMg7B,YACnByyB,UAAWppC,EACXuU,UAAW54B,EAAMygC,YACjBf,WAAYA,EACZsd,QAAS1lB,EAAM6xB,kBAAkBhzC,GAGjC9V,MAAO8V,I,CAIb,MAAO,EACT,GAGF5V,OAAAA,CAAQmU,EAAGm5C,EAAYR,GACrBA,EAAO/1B,MAAMw2B,qBAAqBD,EAAWxtD,OAC7CgtD,EAAO/1B,MAAMygB,QACf,IAIJpb,OAAQ,CACN1nB,EAAG,CACDhU,KAAM,eACNuuD,WAAY,CACVn3B,SAAS,GAEXE,aAAa,EACbI,KAAM,CACJ82B,UAAU,GAEZC,YAAa,CACXr3B,SAAS,GAEXoyB,WAAY,MC/EL,MAAMkF,WAAsBtE,KAoB3ChE,EAAAA,GAAAA,GApBqBsI,GAAsB,KAE7B,QAAMtI,EAAAA,GAAAA,GAFCsI,GAAsB,WAOvB,CAEhBrF,OAAQ,EAGR3qB,SAAU,EAGV0qB,cAAe,IAGfzqB,OAAQ,SClBG,MAAMgwB,WAAwB1S,GAmC3CwE,gBAAAA,CAAiBrhD,GACf,MAAM0wB,EAASpvB,KAAK+5C,YAAY3qB,OAC1BwY,EAAS5nC,KAAKm/C,UAAUzgD,GAE9B,MAAO,CACL4O,MAAO8hB,EAAO2vB,YAAYrgD,GAC1BoG,MAAO,GAAKsqB,EAAO4wB,iBAAiBpY,EAAOxY,EAAOI,OAEtD,CAEAmvB,eAAAA,CAAgB7vB,EAAMpvB,EAAM4G,EAAO+H,GACjC,OAAOq5B,GAA4BslB,KAAKhtD,KAAjC0nC,CAAuC5Y,EAAMpvB,EAAM4G,EAAO+H,EACnE,CAEA+nC,MAAAA,CAAO7b,GACL,MAAMzL,EAAO9uB,KAAK+5C,YACZzZ,EAAOxR,EAAKS,QACZR,EAASD,EAAKpvB,MAAQ,GACtBo/C,EAAShwB,EAAKK,OAAO4vB,YAK3B,GAFAze,EAAKvR,OAASA,EAED,WAATwL,EAAmB,CACrB,MAAMzsB,EAAU9N,KAAKigD,6BAA6B1lB,GAC7Cv6B,KAAK8N,QAAQmtB,WAChBntB,EAAQgxB,YAAc,GAGxB,MAAMlL,EAAa,CACjB4d,OAAO,EACPG,UAAWmN,EAAOp4C,SAAWqoB,EAAOroB,OACpCoH,WAGF9N,KAAKmhD,cAAc7gB,OAAMxsB,EAAW8f,EAAY2G,E,CAIlDv6B,KAAKgiD,eAAejzB,EAAQ,EAAGA,EAAOroB,OAAQ6zB,EAChD,CAEAynB,cAAAA,CAAejzB,EAAQzoB,EAAO+H,EAAOksB,GACnC,MAAMQ,EAAQ/6B,KAAK+5C,YAAYyD,OACzBI,EAAiB,UAATrjB,EAEd,IAAK,IAAI/lB,EAAIlO,EAAOkO,EAAIlO,EAAQ+H,EAAOmG,IAAK,CAC1C,MAAMub,EAAQhB,EAAOva,GACf1G,EAAU9N,KAAKkgD,0BAA0B1rC,EAAGub,EAAM8D,OAAS,SAAW0G,GACtE2zB,EAAgBnzB,EAAMozB,yBAAyB35C,EAAGxU,KAAKm/C,UAAU3qC,GAAGlB,GAEpEoC,EAAIkoC,EAAQ7iB,EAAMsyB,QAAUa,EAAcx4C,EAC1CiR,EAAIi3B,EAAQ7iB,EAAMuyB,QAAUY,EAAcvnC,EAE1CiN,EAAa,CACjBle,IACAiR,IACA8D,MAAOyjC,EAAczjC,MACrBud,KAAMxe,MAAM9T,IAAM8T,MAAM7C,GACxB7Y,WAGF9N,KAAKmhD,cAAcpxB,EAAOvb,EAAGof,EAAY2G,EAC3C,CACF,GACFmrB,EAAAA,GAAAA,GApGqBuI,GAAwB,KAE/B,UAAQvI,EAAAA,GAAAA,GAFDuI,GAAwB,WAOzB,CAChB7R,mBAAoB,OACpBC,gBAAiB,QACjBhiB,UAAW,IACXY,UAAU,EACVtB,SAAU,CACR2G,KAAM,CACJzB,KAAM,aAGV6mB,EAAAA,GAAAA,GAjBiBuI,GAAwB,YAsBxB,CACjBvgB,YAAa,EAEb1S,OAAQ,CACN1nB,EAAG,CACDhU,KAAM,mBCzBC,MAAM8uD,WAA0B7S,GAoC7CwE,gBAAAA,CAAiBrhD,GACf,MAAMowB,EAAO9uB,KAAK+5C,YACZ+E,EAAS9+C,KAAK21B,MAAMj2B,KAAKo/C,QAAU,IACnC,OAAC5uB,EAAA,OAAQC,GAAUrB,EACnB8Y,EAAS5nC,KAAKm/C,UAAUzgD,GACxBgX,EAAIwa,EAAO8vB,iBAAiBpY,EAAOlyB,GACnCiR,EAAIwJ,EAAO6vB,iBAAiBpY,EAAOjhB,GAEzC,MAAO,CACLrZ,MAAOwxC,EAAOpgD,IAAU,GACxBoG,MAAO,IAAM4Q,EAAI,KAAOiR,EAAI,IAEhC,CAEAyvB,MAAAA,CAAO7b,GACL,MAAMzL,EAAO9uB,KAAK+5C,aACXr6C,KAAMqvB,EAAS,IAAMD,EAEtBE,EAAqBhvB,KAAK21B,MAAMmrB,oBACtC,IAAI,MAACx6C,EAAA,MAAO+H,GAASwgB,GAAiCC,EAAMC,EAAQC,GAUpE,GARAhvB,KAAK87C,WAAax1C,EAClBtG,KAAK+7C,WAAa1tC,EAEd4hB,GAAoBnB,KACtBxoB,EAAQ,EACR+H,EAAQ0gB,EAAOroB,QAGb1G,KAAK8N,QAAQmtB,SAAU,CAGpBj7B,KAAKo8C,oBACRp8C,KAAKw8C,cAEP,MAAOjtB,QAAS+Q,EAAA,SAAM+rB,GAAYv9B,EAGlCwR,EAAKwR,OAAS9xC,KAAK21B,MACnB2K,EAAK2R,cAAgBjyC,KAAKtB,MAC1B4hC,EAAKgsB,aAAeD,EAASC,WAC7BhsB,EAAKvR,OAASA,EAEd,MAAMjhB,EAAU9N,KAAKigD,6BAA6B1lB,GAClDzsB,EAAQsiC,QAAUpwC,KAAK8N,QAAQsiC,QAC/BpwC,KAAKmhD,cAAc7gB,OAAMxsB,EAAW,CAClCy4C,UAAWv9B,EACXlhB,WACCysB,EACL,MAAWv6B,KAAKo8C,4BAEPttB,EAAKS,QACZvvB,KAAKo8C,oBAAqB,GAI5Bp8C,KAAKgiD,eAAejzB,EAAQzoB,EAAO+H,EAAOksB,EAC5C,CAEAiiB,WAAAA,GACE,MAAM,SAACvhB,GAAYj7B,KAAK8N,SAEnB9N,KAAKo8C,oBAAsBnhB,IAC9Bj7B,KAAKo8C,mBAAqBp8C,KAAK21B,MAAM04B,SAASC,WAAW,SAG3D1I,MAAMpJ,aACR,CAEAwF,cAAAA,CAAejzB,EAAQzoB,EAAO+H,EAAOksB,GACnC,MAAMqjB,EAAiB,UAATrjB,GACR,OAACpL,EAAA,OAAQC,EAAA,SAAQksB,EAAA,SAAU+Q,GAAYrsD,KAAK+5C,YAC5CiH,EAAYhhD,KAAKkgD,0BAA0B55C,EAAOi0B,GAClDsmB,EAAgB7gD,KAAK2gD,iBAAiBK,GACtCJ,EAAiB5gD,KAAK4gD,eAAermB,EAAMsmB,GAC3C5G,EAAQ9qB,EAAOK,KACf0qB,EAAQ9qB,EAAOI,MACf,SAACF,EAAA,QAAU8gB,GAAWpwC,KAAK8N,QAC3B0+C,EAAejjC,GAAS+F,GAAYA,EAAW9pB,OAAOuiB,kBACtD0kC,EAAezsD,KAAK21B,MAAMmrB,qBAAuBlD,GAAkB,SAATrjB,EAChE,IAAIoyB,EAAarmD,EAAQ,GAAKtG,KAAKm/C,UAAU74C,EAAQ,GAErD,IAAK,IAAIkO,EAAIlO,EAAOkO,EAAIlO,EAAQ+H,IAASmG,EAAG,CAC1C,MAAMub,EAAQhB,EAAOva,GACfozB,EAAS5nC,KAAKm/C,UAAU3qC,GACxBof,EAAa64B,EAAe18B,EAAQ,GACpC68B,EAAWhpC,GAAcgkB,EAAOsS,IAChCxQ,EAAS9V,EAAWqmB,GAAS9qB,EAAOS,iBAAiBgY,EAAOqS,GAAQzlC,GACpEm1B,EAAS/V,EAAWsmB,GAAS0D,GAASgP,EAAWx9B,EAAO02B,eAAiB12B,EAAOQ,iBAAiB0rB,EAAWt7C,KAAKq4C,WAAWjpB,EAAQwY,EAAQ0T,GAAY1T,EAAOsS,GAAQ1lC,GAE7Kof,EAAWoU,KAAOxe,MAAMkgB,IAAWlgB,MAAMmgB,IAAWijB,EACpDh5B,EAAWyd,KAAO78B,EAAI,GAAKvF,KAAMuZ,IAAIof,EAAOqS,GAAS0S,EAAW1S,IAAWuS,EACvEpc,IACFxc,EAAWgU,OAASA,EACpBhU,EAAWinB,IAAMwR,EAAS3sD,KAAK8U,IAG7BosC,IACFhtB,EAAW9lB,QAAU+yC,GAAiB7gD,KAAKkgD,0BAA0B1rC,EAAGub,EAAM8D,OAAS,SAAW0G,IAG/FkyB,GACHzsD,KAAKmhD,cAAcpxB,EAAOvb,EAAGof,EAAY2G,GAG3CoyB,EAAa/kB,CACf,CAEA5nC,KAAKkhD,oBAAoBL,EAAetmB,EAAMymB,EAChD,CAKAlB,cAAAA,GACE,MAAMhxB,EAAO9uB,KAAK+5C,YACZr6C,EAAOovB,EAAKpvB,MAAQ,GAE1B,IAAKM,KAAK8N,QAAQmtB,SAAU,CAC1B,IAAInpB,EAAM,EACV,IAAK,IAAI0C,EAAI9U,EAAKgH,OAAS,EAAG8N,GAAK,IAAKA,EACtC1C,EAAM7C,KAAK6C,IAAIA,EAAKpS,EAAK8U,GAAGnH,KAAKrN,KAAKkgD,0BAA0B1rC,IAAM,GAExE,OAAO1C,EAAM,GAAKA,C,CAGpB,MAAMyd,EAAUT,EAAKS,QACfgI,EAAShI,EAAQzhB,SAAWyhB,EAAQzhB,QAAQgxB,aAAe,EAEjE,IAAKp/B,EAAKgH,OACR,OAAO6wB,EAGT,MAAM4Q,EAAazoC,EAAK,GAAG2N,KAAKrN,KAAKkgD,0BAA0B,IACzD2M,EAAYntD,EAAKA,EAAKgH,OAAS,GAAG2G,KAAKrN,KAAKkgD,0BAA0BxgD,EAAKgH,OAAS,IAC1F,OAAOuI,KAAK6C,IAAIylB,EAAQ4Q,EAAY0kB,GAAa,CACnD,GACFnH,EAAAA,GAAAA,GA7KqB0I,GAA0B,KAEjC,YAAU1I,EAAAA,GAAAA,GAFH0I,GAA0B,WAO3B,CAChBhS,oBAAoB,EACpBC,gBAAiB,QACjBphB,UAAU,EACV4D,MAAM,KACN6mB,EAAAA,GAAAA,GAZiB0I,GAA0B,YAiB1B,CAEjB9zB,YAAa,CACXC,KAAM,SAGRS,OAAQ,CACNtlB,EAAG,CACDpW,KAAM,UAERqnB,EAAG,CACDrnB,KAAM,aC+Bd,SAASivD,KACP,MAAM,IAAI7nB,MAAM,kFAClB,CAQA,MAAM8nB,GAYJ,eAAOrzB,CACLszB,GAEAzgD,OAAO8T,OAAO0sC,GAAgB3qC,UAAW4qC,EAC3C,CAIArsC,WAAAA,CAAYtU,IAAqB43C,EAAAA,GAAAA,GAAA,uBAC/B1lD,KAAK8N,QAAUA,GAAW,CAAC,CAC7B,CAGA4gD,IAAAA,GAAQ,CAERC,OAAAA,GACE,OAAOJ,IACT,CAEA1mB,KAAAA,GACE,OAAO0mB,IACT,CAEAj5B,MAAAA,GACE,OAAOi5B,IACT,CAEAjtD,GAAAA,GACE,OAAOitD,IACT,CAEAK,IAAAA,GACE,OAAOL,IACT,CAEAM,OAAAA,GACE,OAAON,IACT,CAEAO,KAAAA,GACE,OAAOP,IACT,EAGF,IAAAQ,GAAe,CACbC,MAAOR,IC9GT,SAASS,GAAaC,EAAS1/B,EAAM1qB,EAAO01B,GAC1C,MAAM,WAACsf,EAAU,KAAEp6C,EAAA,QAAMwvB,GAAWggC,EAC9B//B,EAAS2qB,EAAWC,YAAY5qB,OAChCG,EAAW4/B,EAAQ3/B,SAAU2/B,EAAQ3/B,QAAQzhB,QAAUohD,EAAQ3/B,QAAQzhB,QAAQwhB,SAAkB,KAEvG,GAAIH,GAAUK,IAASL,EAAOK,MAAiB,MAATA,GAAgBN,GAAWxvB,EAAKgH,OAAQ,CAC5E,MAAMyoD,EAAehgC,EAAOigC,eAAiBhjC,GAAgBH,GAC7D,IAAKuO,EAAW,CACd,MAAMxR,EAASmmC,EAAazvD,EAAM8vB,EAAM1qB,GACxC,GAAIwqB,EAAU,CACZ,MAAM,OAACF,GAAU0qB,EAAWC,aACtB,QAAC1qB,GAAW6/B,EAEZr/B,EAAuBR,EAC1BrL,MAAM,EAAGgF,EAAOgD,GAAK,GACrB9G,UACA4K,UACCC,IAAUnM,GAAcmM,EAAMX,EAAOI,QACzCxG,EAAOgD,IAAM/c,KAAK6C,IAAI,EAAG+d,GAEzB,MAAMG,EAAuBX,EAC1BrL,MAAMgF,EAAO+C,IACb+D,UACCC,IAAUnM,GAAcmM,EAAMX,EAAOI,QACzCxG,EAAO+C,IAAM9c,KAAK6C,IAAI,EAAGke,E,CAE3B,OAAOhH,C,CACF,GAAI8wB,EAAW+B,eAAgB,CAIpC,MAAMp7C,EAAKf,EAAK,GACVwH,EAA+B,oBAAhBzG,EAAG4uD,UAA2B5uD,EAAG4uD,SAAS7/B,GAC/D,GAAItoB,EAAO,CACT,MAAMZ,EAAQ6oD,EAAazvD,EAAM8vB,EAAM1qB,EAAQoC,GACzCgkB,EAAMikC,EAAazvD,EAAM8vB,EAAM1qB,EAAQoC,GAC7C,MAAO,CAAC8kB,GAAI1lB,EAAM0lB,GAAID,GAAIb,EAAIa,G,GAKpC,MAAO,CAACC,GAAI,EAAGD,GAAIrsB,EAAKgH,OAAS,EACnC,CAUA,SAAS4oD,GAAyB35B,EAAOnG,EAAM+/B,EAAU1oD,EAAS2zB,GAChE,MAAM2d,EAAWxiB,EAAM65B,+BACjB1qD,EAAQyqD,EAAS//B,GACvB,IAAK,IAAIhb,EAAI,EAAG8Q,EAAO6yB,EAASzxC,OAAQ8N,EAAI8Q,IAAQ9Q,EAAG,CACrD,MAAM,MAAC9V,EAAA,KAAOgB,GAAQy4C,EAAS3jC,IACzB,GAACwX,EAAA,GAAID,GAAMkjC,GAAa9W,EAAS3jC,GAAIgb,EAAM1qB,EAAO01B,GACxD,IAAK,IAAIja,EAAIyL,EAAIzL,GAAKwL,IAAMxL,EAAG,CAC7B,MAAM6qB,EAAU1rC,EAAK6gB,GAChB6qB,EAAQpD,MACXnhC,EAAQukC,EAAS1sC,EAAO6hB,EAE5B,CACF,CACF,CAOA,SAASkvC,GAAyBjgC,GAChC,MAAMkgC,GAA8B,IAAvBlgC,EAAKzJ,QAAQ,KACpB4pC,GAA8B,IAAvBngC,EAAKzJ,QAAQ,KAE1B,OAAO,SAAS8E,EAAKC,GACnB,MAAM8kC,EAASF,EAAOzgD,KAAKuZ,IAAIqC,EAAInV,EAAIoV,EAAIpV,GAAK,EAC1Cm6C,EAASF,EAAO1gD,KAAKuZ,IAAIqC,EAAIlE,EAAImE,EAAInE,GAAK,EAChD,OAAO1X,KAAKga,KAAKha,KAAKmS,IAAIwuC,EAAQ,GAAK3gD,KAAKmS,IAAIyuC,EAAQ,GAC1D,CACF,CAWA,SAASC,GAAkBn6B,EAAO45B,EAAU//B,EAAMugC,EAAkBt1B,GAClE,MAAMjN,EAAQ,GAEd,IAAKiN,IAAqB9E,EAAMq6B,cAAcT,GAC5C,OAAO/hC,EAGT,MAAMyiC,EAAiB,SAAS7kB,EAAS3lB,EAAc/mB,IAChD+7B,GAAqBuE,GAAeoM,EAASzV,EAAMqd,UAAW,KAG/D5H,EAAQ8kB,QAAQX,EAAS75C,EAAG65C,EAAS5oC,EAAGopC,IAC1CviC,EAAMxG,KAAK,CAACokB,UAAS3lB,eAAc/mB,SAEvC,EAGA,OADA4wD,GAAyB35B,EAAOnG,EAAM+/B,EAAUU,GAAgB,GACzDziC,CACT,CAUA,SAAS2iC,GAAsBx6B,EAAO45B,EAAU//B,EAAMugC,GACpD,IAAIviC,EAAQ,GAEZ,SAASyiC,EAAe7kB,EAAS3lB,EAAc/mB,GAC7C,MAAM,WAACoqD,EAAA,SAAYC,GAAY3d,EAAQglB,SAAS,CAAC,aAAc,YAAaL,IACtE,MAACtlC,GAASN,GAAkBihB,EAAS,CAAC11B,EAAG65C,EAAS75C,EAAGiR,EAAG4oC,EAAS5oC,IAEnEsE,GAAcR,EAAOq+B,EAAYC,IACnCv7B,EAAMxG,KAAK,CAACokB,UAAS3lB,eAAc/mB,SAEvC,CAGA,OADA4wD,GAAyB35B,EAAOnG,EAAM+/B,EAAUU,GACzCziC,CACT,CAYA,SAAS6iC,GAAyB16B,EAAO45B,EAAU//B,EAAMgL,EAAWu1B,EAAkBt1B,GACpF,IAAIjN,EAAQ,GACZ,MAAM8iC,EAAiBb,GAAyBjgC,GAChD,IAAI+gC,EAAc/qD,OAAOuiB,kBAEzB,SAASkoC,EAAe7kB,EAAS3lB,EAAc/mB,GAC7C,MAAMwxD,EAAU9kB,EAAQ8kB,QAAQX,EAAS75C,EAAG65C,EAAS5oC,EAAGopC,GACxD,GAAIv1B,IAAc01B,EAChB,OAGF,MAAM7J,EAASjb,EAAQolB,eAAeT,GAChCU,IAAgBh2B,GAAoB9E,EAAMq6B,cAAc3J,GAC9D,IAAKoK,IAAgBP,EACnB,OAGF,MAAMvlC,EAAW2lC,EAAef,EAAUlJ,GACtC17B,EAAW4lC,GACb/iC,EAAQ,CAAC,CAAC4d,UAAS3lB,eAAc/mB,UACjC6xD,EAAc5lC,GACLA,IAAa4lC,GAEtB/iC,EAAMxG,KAAK,CAACokB,UAAS3lB,eAAc/mB,SAEvC,CAGA,OADA4wD,GAAyB35B,EAAOnG,EAAM+/B,EAAUU,GACzCziC,CACT,CAYA,SAASkjC,GAAgB/6B,EAAO45B,EAAU//B,EAAMgL,EAAWu1B,EAAkBt1B,GAC3E,OAAKA,GAAqB9E,EAAMq6B,cAAcT,GAI9B,MAAT//B,GAAiBgL,EAEpB61B,GAAyB16B,EAAO45B,EAAU//B,EAAMgL,EAAWu1B,EAAkBt1B,GAD7E01B,GAAsBx6B,EAAO45B,EAAU//B,EAAMugC,GAJxC,EAMX,CAWA,SAASY,GAAah7B,EAAO45B,EAAU//B,EAAMgL,EAAWu1B,GACtD,MAAMviC,EAAQ,GACRojC,EAAuB,MAATphC,EAAe,WAAa,WAChD,IAAIqhC,GAAiB,EAWrB,OATAvB,GAAyB35B,EAAOnG,EAAM+/B,EAAU,CAACnkB,EAAS3lB,EAAc/mB,KAClE0sC,EAAQwlB,IAAgBxlB,EAAQwlB,GAAarB,EAAS//B,GAAOugC,KAC/DviC,EAAMxG,KAAK,CAACokB,UAAS3lB,eAAc/mB,UACnCmyD,EAAiBA,GAAkBzlB,EAAQ8kB,QAAQX,EAAS75C,EAAG65C,EAAS5oC,EAAGopC,MAM3Ev1B,IAAcq2B,EACT,GAEFrjC,CACT,CAMA,IAAAsjC,GAAe,CAEbxB,4BAGAyB,MAAO,CAYLryD,KAAAA,CAAMi3B,EAAO5iB,EAAGjF,EAASiiD,GACvB,MAAMR,EAAW/iB,GAAoBz5B,EAAG4iB,GAElCnG,EAAO1hB,EAAQ0hB,MAAQ,IACvBiL,EAAmB3sB,EAAQ2sB,mBAAoB,EAC/CjN,EAAQ1f,EAAQ0sB,UAClBs1B,GAAkBn6B,EAAO45B,EAAU//B,EAAMugC,EAAkBt1B,GAC3Di2B,GAAgB/6B,EAAO45B,EAAU//B,GAAM,EAAOugC,EAAkBt1B,GAC9Dd,EAAW,GAEjB,OAAKnM,EAAM9mB,QAIXivB,EAAM65B,+BAA+BziC,QAAS+B,IAC5C,MAAMpwB,EAAQ8uB,EAAM,GAAG9uB,MACjB0sC,EAAUtc,EAAKpvB,KAAKhB,GAGtB0sC,IAAYA,EAAQpD,MACtBrO,EAAS3S,KAAK,CAACokB,UAAS3lB,aAAcqJ,EAAKpwB,MAAOA,YAI/Ci7B,GAbE,EAcX,EAYApK,OAAAA,CAAQoG,EAAO5iB,EAAGjF,EAASiiD,GACzB,MAAMR,EAAW/iB,GAAoBz5B,EAAG4iB,GAClCnG,EAAO1hB,EAAQ0hB,MAAQ,KACvBiL,EAAmB3sB,EAAQ2sB,mBAAoB,EACrD,IAAIjN,EAAQ1f,EAAQ0sB,UAChBs1B,GAAkBn6B,EAAO45B,EAAU//B,EAAMugC,EAAkBt1B,GAC7Di2B,GAAgB/6B,EAAO45B,EAAU//B,GAAM,EAAOugC,EAAkBt1B,GAElE,GAAIjN,EAAM9mB,OAAS,EAAG,CACpB,MAAM+e,EAAe+H,EAAM,GAAG/H,aACxB/lB,EAAOi2B,EAAM8nB,eAAeh4B,GAAc/lB,KAChD8tB,EAAQ,GACR,IAAK,IAAIhZ,EAAI,EAAGA,EAAI9U,EAAKgH,SAAU8N,EACjCgZ,EAAMxG,KAAK,CAACokB,QAAS1rC,EAAK8U,GAAIiR,eAAc/mB,MAAO8V,G,CAIvD,OAAOgZ,CACT,EAYAuC,KAAAA,CAAM4F,EAAO5iB,EAAGjF,EAASiiD,GACvB,MAAMR,EAAW/iB,GAAoBz5B,EAAG4iB,GAClCnG,EAAO1hB,EAAQ0hB,MAAQ,KACvBiL,EAAmB3sB,EAAQ2sB,mBAAoB,EACrD,OAAOq1B,GAAkBn6B,EAAO45B,EAAU//B,EAAMugC,EAAkBt1B,EACpE,EAWAu2B,OAAAA,CAAQr7B,EAAO5iB,EAAGjF,EAASiiD,GACzB,MAAMR,EAAW/iB,GAAoBz5B,EAAG4iB,GAClCnG,EAAO1hB,EAAQ0hB,MAAQ,KACvBiL,EAAmB3sB,EAAQ2sB,mBAAoB,EACrD,OAAOi2B,GAAgB/6B,EAAO45B,EAAU//B,EAAM1hB,EAAQ0sB,UAAWu1B,EAAkBt1B,EACrF,EAWA/kB,CAAAA,CAAEigB,EAAO5iB,EAAGjF,EAASiiD,GACnB,MAAMR,EAAW/iB,GAAoBz5B,EAAG4iB,GACxC,OAAOg7B,GAAah7B,EAAO45B,EAAU,IAAKzhD,EAAQ0sB,UAAWu1B,EAC/D,EAWAppC,CAAAA,CAAEgP,EAAO5iB,EAAGjF,EAASiiD,GACnB,MAAMR,EAAW/iB,GAAoBz5B,EAAG4iB,GACxC,OAAOg7B,GAAah7B,EAAO45B,EAAU,IAAKzhD,EAAQ0sB,UAAWu1B,EAC/D,ICzXJ,MAAMkB,GAAmB,CAAC,OAAQ,MAAO,QAAS,UAElD,SAASC,GAAiBtnC,EAAO2lC,GAC/B,OAAO3lC,EAAMmd,OAAOr1B,GAAKA,EAAEm6B,MAAQ0jB,EACrC,CAEA,SAAS4B,GAA4BvnC,EAAO4F,GAC1C,OAAO5F,EAAMmd,OAAOr1B,IAA0C,IAArCu/C,GAAiBlrC,QAAQrU,EAAEm6B,MAAen6B,EAAE06B,IAAI5c,OAASA,EACpF,CAEA,SAAS4hC,GAAaxnC,EAAO1E,GAC3B,OAAO0E,EAAMV,KAAK,CAACvW,EAAGC,KACpB,MAAM2S,EAAKL,EAAUtS,EAAID,EACnB6S,EAAKN,EAAUvS,EAAIC,EACzB,OAAO2S,EAAG5C,SAAW6C,EAAG7C,OACtB4C,EAAG7mB,MAAQ8mB,EAAG9mB,MACd6mB,EAAG5C,OAAS6C,EAAG7C,QAErB,CAEA,SAAS0uC,GAAUC,GACjB,MAAMC,EAAc,GACpB,IAAI/8C,EAAG8Q,EAAM8mB,EAAKP,EAAKyM,EAAOkZ,EAE9B,IAAKh9C,EAAI,EAAG8Q,GAAQgsC,GAAS,IAAI5qD,OAAQ8N,EAAI8Q,IAAQ9Q,EACnD43B,EAAMklB,EAAM98C,KACV+6C,SAAU1jB,EAAK/9B,SAAUwqC,QAAOkZ,cAAc,IAAMplB,GACtDmlB,EAAYvqC,KAAK,CACftoB,MAAO8V,EACP43B,MACAP,MACAiZ,WAAY1Y,EAAIwY,eAChBjiC,OAAQypB,EAAIzpB,OACZ21B,MAAOA,GAAUzM,EAAMyM,EACvBkZ,gBAGJ,OAAOD,CACT,CAEA,SAASE,GAAYC,GACnB,MAAMpY,EAAS,CAAC,EAChB,IAAK,MAAMqY,KAAQD,EAAS,CAC1B,MAAM,MAACpZ,EAAK,IAAEzM,EAAA,YAAK2lB,GAAeG,EAClC,IAAKrZ,IAAU2Y,GAAiB16B,SAASsV,GACvC,SAEF,MAAMnG,EAAS4T,EAAOhB,KAAWgB,EAAOhB,GAAS,CAACjqC,MAAO,EAAGujD,OAAQ,EAAGjvC,OAAQ,EAAGtV,KAAM,IACxFq4B,EAAOr3B,QACPq3B,EAAO/iB,QAAU6uC,CACnB,CACA,OAAOlY,CACT,CAKA,SAASuY,GAAcH,EAASI,GAC9B,MAAMxY,EAASmY,GAAYC,IACrB,aAACK,EAAA,cAAcC,GAAiBF,EACtC,IAAIt9C,EAAG8Q,EAAM2sC,EACb,IAAKz9C,EAAI,EAAG8Q,EAAOosC,EAAQhrD,OAAQ8N,EAAI8Q,IAAQ9Q,EAAG,CAChDy9C,EAASP,EAAQl9C,GACjB,MAAM,SAAC09C,GAAYD,EAAO7lB,IACpBkM,EAAQgB,EAAO2Y,EAAO3Z,OACtBhD,EAASgD,GAAS2Z,EAAOT,YAAclZ,EAAM31B,OAC/CsvC,EAAOnN,YACTmN,EAAOhyD,MAAQq1C,EAASA,EAASyc,EAAeG,GAAYJ,EAAOK,eACnEF,EAAO10B,OAASy0B,IAEhBC,EAAOhyD,MAAQ8xD,EACfE,EAAO10B,OAAS+X,EAASA,EAAS0c,EAAgBE,GAAYJ,EAAOM,gBAEzE,CACA,OAAO9Y,CACT,CAEA,SAAS+Y,GAAiBf,GACxB,MAAMC,EAAcF,GAAUC,GACxBY,EAAWd,GAAaG,EAAYxqB,OAAO4qB,GAAQA,EAAKvlB,IAAI8lB,WAAW,GACvEzjC,EAAO2iC,GAAaF,GAAiBK,EAAa,SAAS,GAC3D7iC,EAAQ0iC,GAAaF,GAAiBK,EAAa,UACnDh9B,EAAM68B,GAAaF,GAAiBK,EAAa,QAAQ,GACzD/8B,EAAS48B,GAAaF,GAAiBK,EAAa,WACpDe,EAAmBnB,GAA4BI,EAAa,KAC5DgB,EAAiBpB,GAA4BI,EAAa,KAEhE,MAAO,CACLW,WACAM,WAAY/jC,EAAKq0B,OAAOvuB,GACxBk+B,eAAgB/jC,EAAMo0B,OAAOyP,GAAgBzP,OAAOtuB,GAAQsuB,OAAOwP,GACnEtf,UAAWke,GAAiBK,EAAa,aACzCmB,SAAUjkC,EAAKq0B,OAAOp0B,GAAOo0B,OAAOyP,GACpCzN,WAAYvwB,EAAIuuB,OAAOtuB,GAAQsuB,OAAOwP,GAE1C,CAEA,SAASK,GAAeC,EAAY5f,EAAWrgC,EAAGC,GAChD,OAAO3D,KAAK6C,IAAI8gD,EAAWjgD,GAAIqgC,EAAUrgC,IAAM1D,KAAK6C,IAAI8gD,EAAWhgD,GAAIogC,EAAUpgC,GACnF,CAEA,SAASigD,GAAiBD,EAAYE,GACpCF,EAAWr+B,IAAMtlB,KAAK6C,IAAI8gD,EAAWr+B,IAAKu+B,EAAWv+B,KACrDq+B,EAAWnkC,KAAOxf,KAAK6C,IAAI8gD,EAAWnkC,KAAMqkC,EAAWrkC,MACvDmkC,EAAWp+B,OAASvlB,KAAK6C,IAAI8gD,EAAWp+B,OAAQs+B,EAAWt+B,QAC3Do+B,EAAWlkC,MAAQzf,KAAK6C,IAAI8gD,EAAWlkC,MAAOokC,EAAWpkC,MAC3D,CAEA,SAASqkC,GAAW/f,EAAW8e,EAAQG,EAAQ3Y,GAC7C,MAAM,IAACzN,EAAA,IAAKO,GAAO6lB,EACbW,EAAa5f,EAAU4f,WAG7B,IAAK3uC,GAAS4nB,GAAM,CACdomB,EAAO5kD,OAET2lC,EAAUnH,IAAQomB,EAAO5kD,MAE3B,MAAMirC,EAAQgB,EAAO2Y,EAAO3Z,QAAU,CAACjrC,KAAM,EAAGgB,MAAO,GACvDiqC,EAAMjrC,KAAO4B,KAAK6C,IAAIwmC,EAAMjrC,KAAM4kD,EAAOnN,WAAa1Y,EAAI7O,OAAS6O,EAAInsC,OACvEgyD,EAAO5kD,KAAOirC,EAAMjrC,KAAOirC,EAAMjqC,MACjC2kC,EAAUnH,IAAQomB,EAAO5kD,I,CAGvB++B,EAAI4mB,YACNH,GAAiBD,EAAYxmB,EAAI4mB,cAGnC,MAAMC,EAAWhkD,KAAK6C,IAAI,EAAGggD,EAAOoB,WAAaP,GAAeC,EAAY5f,EAAW,OAAQ,UACzFmgB,EAAYlkD,KAAK6C,IAAI,EAAGggD,EAAOsB,YAAcT,GAAeC,EAAY5f,EAAW,MAAO,WAC1FqgB,EAAeJ,IAAajgB,EAAU1+B,EACtCg/C,EAAgBH,IAAcngB,EAAUnhC,EAK9C,OAJAmhC,EAAU1+B,EAAI2+C,EACdjgB,EAAUnhC,EAAIshD,EAGPlB,EAAOnN,WACV,CAACyO,KAAMF,EAAcG,MAAOF,GAC5B,CAACC,KAAMD,EAAeE,MAAOH,EACnC,CAEA,SAASI,GAAiBzgB,GACxB,MAAM4f,EAAa5f,EAAU4f,WAE7B,SAASc,EAAU7nB,GACjB,MAAMtI,EAASt0B,KAAK6C,IAAI8gD,EAAW/mB,GAAOmH,EAAUnH,GAAM,GAE1D,OADAmH,EAAUnH,IAAQtI,EACXA,CACT,CACAyP,EAAUrsB,GAAK+sC,EAAU,OACzB1gB,EAAUt9B,GAAKg+C,EAAU,QACzBA,EAAU,SACVA,EAAU,SACZ,CAEA,SAASC,GAAW7O,EAAY9R,GAC9B,MAAM4f,EAAa5f,EAAU4f,WAE7B,SAASgB,EAAmBnoB,GAC1B,MAAMvM,EAAS,CAACzQ,KAAM,EAAG8F,IAAK,EAAG7F,MAAO,EAAG8F,OAAQ,GAInD,OAHAiX,EAAU1e,QAAS8e,IACjB3M,EAAO2M,GAAO58B,KAAK6C,IAAIkhC,EAAUnH,GAAM+mB,EAAW/mB,MAE7C3M,CACT,CAEA,OACI00B,EADG9O,EACgB,CAAC,OAAQ,SACT,CAAC,MAAO,UACjC,CAEA,SAAS+O,GAASvC,EAAOte,EAAW8e,EAAQxY,GAC1C,MAAMwa,EAAa,GACnB,IAAIt/C,EAAG8Q,EAAM2sC,EAAQ7lB,EAAK2nB,EAAOrjC,EAEjC,IAAKlc,EAAI,EAAG8Q,EAAOgsC,EAAM5qD,OAAQqtD,EAAQ,EAAGv/C,EAAI8Q,IAAQ9Q,EAAG,CACzDy9C,EAASX,EAAM98C,GACf43B,EAAM6lB,EAAO7lB,IAEbA,EAAIgK,OACF6b,EAAOhyD,OAAS+yC,EAAU1+B,EAC1B29C,EAAO10B,QAAUyV,EAAUnhC,EAC3B8hD,GAAW1B,EAAOnN,WAAY9R,IAEhC,MAAM,KAACugB,EAAA,MAAMC,GAAST,GAAW/f,EAAW8e,EAAQG,EAAQ3Y,GAI5Dya,GAASR,GAAQO,EAAWptD,OAG5BgqB,EAAUA,GAAW8iC,EAEhBpnB,EAAI8lB,UACP4B,EAAW9sC,KAAKirC,EAEpB,CAEA,OAAO8B,GAASF,GAASC,EAAY9gB,EAAW8e,EAAQxY,IAAW5oB,CACrE,CAEA,SAASsjC,GAAW5nB,EAAK3d,EAAM8F,EAAKt0B,EAAOs9B,GACzC6O,EAAI7X,IAAMA,EACV6X,EAAI3d,KAAOA,EACX2d,EAAI1d,MAAQD,EAAOxuB,EACnBmsC,EAAI5X,OAASD,EAAMgJ,EACnB6O,EAAInsC,MAAQA,EACZmsC,EAAI7O,OAASA,CACf,CAEA,SAAS02B,GAAW3C,EAAOte,EAAW8e,EAAQxY,GAC5C,MAAM4a,EAAcpC,EAAOx9B,QAC3B,IAAI,EAAC5e,EAAA,EAAGiR,GAAKqsB,EAEb,IAAK,MAAMif,KAAUX,EAAO,CAC1B,MAAMllB,EAAM6lB,EAAO7lB,IACbkM,EAAQgB,EAAO2Y,EAAO3Z,QAAU,CAACjqC,MAAO,EAAGujD,OAAQ,EAAGjvC,OAAQ,GAC9DA,EAASsvC,EAAQT,YAAclZ,EAAM31B,QAAW,EACtD,GAAIsvC,EAAOnN,WAAY,CACrB,MAAM7kD,EAAQ+yC,EAAU1+B,EAAIqO,EACtB4a,EAAS+a,EAAMjrC,MAAQ++B,EAAI7O,OAC7BjW,GAAQgxB,EAAMhyC,SAChBqgB,EAAI2xB,EAAMhyC,OAER8lC,EAAI8lB,SACN8B,GAAW5nB,EAAK8nB,EAAYzlC,KAAM9H,EAAGmrC,EAAOoB,WAAagB,EAAYxlC,MAAQwlC,EAAYzlC,KAAM8O,GAE/Fy2B,GAAW5nB,EAAK4G,EAAUvkB,KAAO6pB,EAAMsZ,OAAQjrC,EAAG1mB,EAAOs9B,GAE3D+a,EAAMhyC,MAAQqgB,EACd2xB,EAAMsZ,QAAU3xD,EAChB0mB,EAAIylB,EAAI5X,M,KACH,CACL,MAAM+I,EAASyV,EAAUnhC,EAAI8Q,EACvB1iB,EAAQq4C,EAAMjrC,MAAQ++B,EAAInsC,MAC5BqnB,GAAQgxB,EAAMhyC,SAChBoP,EAAI4iC,EAAMhyC,OAER8lC,EAAI8lB,SACN8B,GAAW5nB,EAAK12B,EAAGw+C,EAAY3/B,IAAKt0B,EAAO6xD,EAAOsB,YAAcc,EAAY1/B,OAAS0/B,EAAY3/B,KAEjGy/B,GAAW5nB,EAAK12B,EAAGs9B,EAAUze,IAAM+jB,EAAMsZ,OAAQ3xD,EAAOs9B,GAE1D+a,EAAMhyC,MAAQoP,EACd4iC,EAAMsZ,QAAUr0B,EAChB7nB,EAAI02B,EAAI1d,K,CAEZ,CAEAskB,EAAUt9B,EAAIA,EACds9B,EAAUrsB,EAAIA,CAChB,CAwBA,IAAA+qC,GAAe,CAQbyC,MAAAA,CAAOx+B,EAAOn3B,GACPm3B,EAAM27B,QACT37B,EAAM27B,MAAQ,IAIhB9yD,EAAK0zD,SAAW1zD,EAAK0zD,WAAY,EACjC1zD,EAAK+wD,SAAW/wD,EAAK+wD,UAAY,MACjC/wD,EAAKmkB,OAASnkB,EAAKmkB,QAAU,EAE7BnkB,EAAK41D,QAAU51D,EAAK41D,SAAW,WAC7B,MAAO,CAAC,CACNC,EAAG,EACHhgB,IAAAA,CAAKrB,GACHx0C,EAAK61C,KAAKrB,EACZ,GAEJ,EAEArd,EAAM27B,MAAMtqC,KAAKxoB,EACnB,EAOA81D,SAAAA,CAAU3+B,EAAO4+B,GACf,MAAM71D,EAAQi3B,EAAM27B,MAAQ37B,EAAM27B,MAAMvrC,QAAQwuC,IAAe,GAChD,IAAX71D,GACFi3B,EAAM27B,MAAMhkC,OAAO5uB,EAAO,EAE9B,EAQAo4C,SAAAA,CAAUnhB,EAAOn3B,EAAMsP,GACrBtP,EAAK0zD,SAAWpkD,EAAQokD,SACxB1zD,EAAK+wD,SAAWzhD,EAAQyhD,SACxB/wD,EAAKmkB,OAAS7U,EAAQ6U,MACxB,EAUAyzB,MAAAA,CAAOzgB,EAAO11B,EAAOs9B,EAAQi3B,GAC3B,IAAK7+B,EACH,OAGF,MAAMrB,EAAUsO,GAAUjN,EAAM7nB,QAAQmkD,OAAO39B,SACzC69B,EAAiBljD,KAAK6C,IAAI7R,EAAQq0B,EAAQr0B,MAAO,GACjDmyD,EAAkBnjD,KAAK6C,IAAIyrB,EAASjJ,EAAQiJ,OAAQ,GACpD+zB,EAAQe,GAAiB18B,EAAM27B,OAC/BmD,EAAgBnD,EAAMoB,SACtBgC,EAAkBpD,EAAMxM,WAI9B9/B,GAAK2Q,EAAM27B,MAAOllB,IACgB,oBAArBA,EAAIuoB,cACbvoB,EAAIuoB,iBA+BR,MAAMC,EAA0BH,EAAc1f,OAAO,CAACzlC,EAAOqiD,IAC3DA,EAAKvlB,IAAIt+B,UAAwC,IAA7B6jD,EAAKvlB,IAAIt+B,QAAQ4oB,QAAoBpnB,EAAQA,EAAQ,EAAG,IAAM,EAE9EwiD,EAAS9jD,OAAOwyC,OAAO,CAC3B0S,WAAYjzD,EACZmzD,YAAa71B,EACbjJ,UACA69B,iBACAC,kBACAL,aAAcI,EAAiB,EAAIyC,EACnC5C,cAAeI,EAAkB,IAE7BQ,EAAa5kD,OAAO8T,OAAO,CAAC,EAAGwS,GACrCu+B,GAAiBD,EAAYhwB,GAAU4xB,IACvC,MAAMxhB,EAAYhlC,OAAO8T,OAAO,CAC9B8wC,aACAt+C,EAAG69C,EACHtgD,EAAGugD,EACH18C,EAAG4e,EAAQ7F,KACX9H,EAAG2N,EAAQC,KACVD,GAEGglB,EAASuY,GAAc4C,EAAc3R,OAAO4R,GAAkB5C,GAGpE+B,GAASvC,EAAMY,SAAUlf,EAAW8e,EAAQxY,GAG5Cua,GAASY,EAAezhB,EAAW8e,EAAQxY,GAGvCua,GAASa,EAAiB1hB,EAAW8e,EAAQxY,IAE/Cua,GAASY,EAAezhB,EAAW8e,EAAQxY,GAG7Cma,GAAiBzgB,GAGjBihB,GAAW3C,EAAMkB,WAAYxf,EAAW8e,EAAQxY,GAGhDtG,EAAUt9B,GAAKs9B,EAAU1+B,EACzB0+B,EAAUrsB,GAAKqsB,EAAUnhC,EAEzBoiD,GAAW3C,EAAMmB,eAAgBzf,EAAW8e,EAAQxY,GAEpD3jB,EAAMqd,UAAY,CAChBvkB,KAAMukB,EAAUvkB,KAChB8F,IAAKye,EAAUze,IACf7F,MAAOskB,EAAUvkB,KAAOukB,EAAU1+B,EAClCkgB,OAAQwe,EAAUze,IAAMye,EAAUnhC,EAClC0rB,OAAQyV,EAAUnhC,EAClB5R,MAAO+yC,EAAU1+B,GAInB0Q,GAAKssC,EAAMte,UAAYif,IACrB,MAAM7lB,EAAM6lB,EAAO7lB,IACnBp+B,OAAO8T,OAAOsqB,EAAKzW,EAAMqd,WACzB5G,EAAIgK,OAAOpD,EAAU1+B,EAAG0+B,EAAUnhC,EAAG,CAAC4c,KAAM,EAAG8F,IAAK,EAAG7F,MAAO,EAAG8F,OAAQ,KAE7E,GC7ba,MAAMqgC,GAOnBC,cAAAA,CAAe33B,EAAQuQ,GAAc,CAQrCqnB,cAAAA,CAAev7B,GACb,OAAO,CACT,CASAh4B,gBAAAA,CAAiBm0B,EAAOr2B,EAAMmtB,GAAW,CAQzC/qB,mBAAAA,CAAoBi0B,EAAOr2B,EAAMmtB,GAAW,CAK5CiN,mBAAAA,GACE,OAAO,CACT,CASA6T,cAAAA,CAAenC,EAASnrC,EAAOs9B,EAAQmQ,GAGrC,OAFAztC,EAAQgP,KAAK6C,IAAI,EAAG7R,GAASmrC,EAAQnrC,OACrCs9B,EAASA,GAAU6N,EAAQ7N,OACpB,CACLt9B,QACAs9B,OAAQtuB,KAAK6C,IAAI,EAAG47B,EAAcz+B,KAAK2Z,MAAM3oB,EAAQytC,GAAenQ,GAExE,CAMAy3B,UAAAA,CAAW73B,GACT,OAAO,CACT,CAMA83B,YAAAA,CAAare,GAEb,ECrEa,MAAMse,WAAsBL,GACzCC,cAAAA,CAAet2D,GAIb,OAAOA,GAAQA,EAAK4+B,YAAc5+B,EAAK4+B,WAAW,OAAS,IAC7D,CACA63B,YAAAA,CAAare,GACXA,EAAO9oC,QAAQgmB,WAAY,CAC7B,ECRF,MAAMqhC,GAAc,WAOdC,GAAc,CAClBC,WAAY,YACZC,UAAW,YACXC,SAAU,UACVC,aAAc,aACdC,YAAa,YACbC,YAAa,YACbC,UAAW,UACXC,aAAc,WACdC,WAAY,YAGRC,GAAgBhxD,GAAmB,OAAVA,GAA4B,KAAVA,EAQjD,SAASixD,GAAW54B,EAAQuQ,GAC1B,MAAMrvC,EAAQ8+B,EAAO9+B,MAIf23D,EAAe74B,EAAO84B,aAAa,UACnCC,EAAc/4B,EAAO84B,aAAa,SAsBxC,GAnBA94B,EAAOg4B,IAAe,CACpBrhB,QAAS,CACPvW,OAAQy4B,EACR/1D,MAAOi2D,EACP73D,MAAO,CACLq4B,QAASr4B,EAAMq4B,QACf6G,OAAQl/B,EAAMk/B,OACdt9B,MAAO5B,EAAM4B,SAQnB5B,EAAMq4B,QAAUr4B,EAAMq4B,SAAW,QAEjCr4B,EAAMsuC,UAAYtuC,EAAMsuC,WAAa,aAEjCmpB,GAAcI,GAAc,CAC9B,MAAMC,EAAe3nB,GAAarR,EAAQ,cACrBrpB,IAAjBqiD,IACFh5B,EAAOl9B,MAAQk2D,E,CAInB,GAAIL,GAAcE,GAChB,GAA4B,KAAxB74B,EAAO9+B,MAAMk/B,OAIfJ,EAAOI,OAASJ,EAAOl9B,OAASytC,GAAe,OAC1C,CACL,MAAM0oB,EAAgB5nB,GAAarR,EAAQ,eACrBrpB,IAAlBsiD,IACFj5B,EAAOI,OAAS64B,E,CAKtB,OAAOj5B,CACT,CAIA,MAAMk5B,KAAuBhoB,IAA+B,CAACE,SAAS,GAEtE,SAAS+nB,GAAYx9B,EAAMx5B,EAAMmtB,GAC3BqM,GACFA,EAAKt3B,iBAAiBlC,EAAMmtB,EAAU4pC,GAE1C,CAEA,SAASE,GAAe5gC,EAAOr2B,EAAMmtB,GAC/BkJ,GAASA,EAAMwH,QACjBxH,EAAMwH,OAAOz7B,oBAAoBpC,EAAMmtB,EAAU4pC,GAErD,CAEA,SAASG,GAAgB/pB,EAAO9W,GAC9B,MAAMr2B,EAAO81D,GAAY3oB,EAAMntC,OAASmtC,EAAMntC,MACxC,EAACoW,EAAC,EAAEiR,GAAK6lB,GAAoBC,EAAO9W,GAC1C,MAAO,CACLr2B,OACAq2B,QACA8gC,OAAQhqB,EACR/2B,OAAS5B,IAAN4B,EAAkBA,EAAI,KACzBiR,OAAS7S,IAAN6S,EAAkBA,EAAI,KAE7B,CAEA,SAAS+vC,GAAiBC,EAAUx5B,GAClC,IAAK,MAAMrE,KAAQ69B,EACjB,GAAI79B,IAASqE,GAAUrE,EAAK73B,SAASk8B,GACnC,OAAO,CAGb,CAEA,SAASy5B,GAAqBjhC,EAAOr2B,EAAMmtB,GACzC,MAAM0Q,EAASxH,EAAMwH,OACf05B,EAAW,IAAIC,iBAAiBC,IACpC,IAAIC,GAAU,EACd,IAAK,MAAMhT,KAAS+S,EAClBC,EAAUA,GAAWN,GAAiB1S,EAAMiT,WAAY95B,GACxD65B,EAAUA,IAAYN,GAAiB1S,EAAMkT,aAAc/5B,GAEzD65B,GACFvqC,MAIJ,OADAoqC,EAASM,QAAQzsB,SAAU,CAAC0sB,WAAW,EAAMC,SAAS,IAC/CR,CACT,CAEA,SAASS,GAAqB3hC,EAAOr2B,EAAMmtB,GACzC,MAAM0Q,EAASxH,EAAMwH,OACf05B,EAAW,IAAIC,iBAAiBC,IACpC,IAAIC,GAAU,EACd,IAAK,MAAMhT,KAAS+S,EAClBC,EAAUA,GAAWN,GAAiB1S,EAAMkT,aAAc/5B,GAC1D65B,EAAUA,IAAYN,GAAiB1S,EAAMiT,WAAY95B,GAEvD65B,GACFvqC,MAIJ,OADAoqC,EAASM,QAAQzsB,SAAU,CAAC0sB,WAAW,EAAMC,SAAS,IAC/CR,CACT,CAEA,MAAMU,GAAqB,IAAI7iC,IAC/B,IAAI8iC,GAAsB,EAE1B,SAASC,KACP,MAAMC,EAAM53D,OAAOy5B,iBACfm+B,IAAQF,KAGZA,GAAsBE,EACtBH,GAAmBxqC,QAAQ,CAACgH,EAAQ4B,KAC9BA,EAAMqH,0BAA4B06B,GACpC3jC,MAGN,CAEA,SAAS4jC,GAA8BhiC,EAAO5B,GACvCwjC,GAAmBlqD,MACtBvN,OAAO0B,iBAAiB,SAAUi2D,IAEpCF,GAAmB9pC,IAAIkI,EAAO5B,EAChC,CAEA,SAAS6jC,GAAgCjiC,GACvC4hC,GAAmB3wB,OAAOjR,GACrB4hC,GAAmBlqD,MACtBvN,OAAO4B,oBAAoB,SAAU+1D,GAEzC,CAEA,SAASI,GAAqBliC,EAAOr2B,EAAMmtB,GACzC,MAAM0Q,EAASxH,EAAMwH,OACf6P,EAAY7P,GAAUwN,GAAexN,GAC3C,IAAK6P,EACH,OAEF,MAAMjZ,EAASlG,GAAU,CAAC5tB,EAAOs9B,KAC/B,MAAMjpB,EAAI04B,EAAUI,YACpB3gB,EAASxsB,EAAOs9B,GACZjpB,EAAI04B,EAAUI,aAQhB3gB,KAED3sB,QAGG+2D,EAAW,IAAIiB,eAAef,IAClC,MAAM/S,EAAQ+S,EAAQ,GAChB92D,EAAQ+jD,EAAM+T,YAAY93D,MAC1Bs9B,EAASymB,EAAM+T,YAAYx6B,OAInB,IAAVt9B,GAA0B,IAAXs9B,GAGnBxJ,EAAO9zB,EAAOs9B,KAKhB,OAHAs5B,EAASM,QAAQnqB,GACjB2qB,GAA8BhiC,EAAO5B,GAE9B8iC,CACT,CAEA,SAASmB,GAAgBriC,EAAOr2B,EAAMu3D,GAChCA,GACFA,EAASoB,aAEE,WAAT34D,GACFs4D,GAAgCjiC,EAEpC,CAEA,SAASuiC,GAAqBviC,EAAOr2B,EAAMmtB,GACzC,MAAM0Q,EAASxH,EAAMwH,OACfiI,EAAQvX,GAAW4e,IAIL,OAAd9W,EAAMuE,KACRzN,EAAS+pC,GAAgB/pB,EAAO9W,KAEjCA,GAIH,OAFA2gC,GAAYn5B,EAAQ79B,EAAM8lC,GAEnBA,CACT,CAMe,MAAM+yB,WAAoBtD,GAOvCC,cAAAA,CAAe33B,EAAQuQ,GAIrB,MAAMlU,EAAU2D,GAAUA,EAAOC,YAAcD,EAAOC,WAAW,MASjE,OAAI5D,GAAWA,EAAQ2D,SAAWA,GAGhC44B,GAAW54B,EAAQuQ,GACZlU,GAGF,IACT,CAKAu7B,cAAAA,CAAev7B,GACb,MAAM2D,EAAS3D,EAAQ2D,OACvB,IAAKA,EAAOg4B,IACV,OAAO,EAGT,MAAMrhB,EAAU3W,EAAOg4B,IAAarhB,QACpC,CAAC,SAAU,SAAS/mB,QAAS0V,IAC3B,MAAM39B,EAAQgvC,EAAQrR,GAClB7e,GAAc9e,GAChBq4B,EAAOi7B,gBAAgB31B,GAEvBtF,EAAOk7B,aAAa51B,EAAM39B,KAI9B,MAAMzG,EAAQy1C,EAAQz1C,OAAS,CAAC,EAahC,OAZA2P,OAAOC,KAAK5P,GAAO0uB,QAAStuB,IAC1B0+B,EAAO9+B,MAAMI,GAAOJ,EAAMI,KAQ5B0+B,EAAOl9B,MAAQk9B,EAAOl9B,aAEfk9B,EAAOg4B,KACP,CACT,CAQA3zD,gBAAAA,CAAiBm0B,EAAOr2B,EAAMmtB,GAE5BzsB,KAAK0B,oBAAoBi0B,EAAOr2B,GAEhC,MAAMg5D,EAAU3iC,EAAM4iC,WAAa5iC,EAAM4iC,SAAW,CAAC,GAC/CC,EAAW,CACfC,OAAQ7B,GACR8B,OAAQpB,GACRvjC,OAAQ8jC,IAEJhxD,EAAU2xD,EAASl5D,IAAS44D,GAClCI,EAAQh5D,GAAQuH,EAAQ8uB,EAAOr2B,EAAMmtB,EACvC,CAOA/qB,mBAAAA,CAAoBi0B,EAAOr2B,GACzB,MAAMg5D,EAAU3iC,EAAM4iC,WAAa5iC,EAAM4iC,SAAW,CAAC,GAC/CnzB,EAAQkzB,EAAQh5D,GAEtB,IAAK8lC,EACH,OAGF,MAAMozB,EAAW,CACfC,OAAQT,GACRU,OAAQV,GACRjkC,OAAQikC,IAEJnxD,EAAU2xD,EAASl5D,IAASi3D,GAClC1vD,EAAQ8uB,EAAOr2B,EAAM8lC,GACrBkzB,EAAQh5D,QAAQwU,CAClB,CAEA4lB,mBAAAA,GACE,OAAO55B,OAAOy5B,gBAChB,CAQAgU,cAAAA,CAAepQ,EAAQl9B,EAAOs9B,EAAQmQ,GACpC,OAAOH,GAAepQ,EAAQl9B,EAAOs9B,EAAQmQ,EAC/C,CAKAsnB,UAAAA,CAAW73B,GACT,MAAM6P,EAAY7P,GAAUwN,GAAexN,GAC3C,SAAU6P,IAAaA,EAAU2rB,YACnC,EC9XK,SAASC,GAAgBz7B,GAC9B,OAAKsN,MAAiD,qBAApBouB,iBAAmC17B,aAAkB07B,gBAC9E3D,GAEFiD,EACT,CCLe,MAAMW,GAAA12C,WAAAA,IAAAsjC,EAAAA,GAAAA,GAAA,kBAAAA,EAAAA,GAAAA,GAAA,kBAAAA,EAAAA,GAAAA,GAAA,eAOV,IAAKA,EAAAA,GAAAA,GAAA,wBAAAA,EAAAA,GAAAA,GAAA,2BAIdqT,eAAAA,CAAgBhJ,GACd,MAAM,EAACr6C,EAAA,EAAGiR,GAAK3mB,KAAKowD,SAAS,CAAC,IAAK,KAAML,GACzC,MAAO,CAACr6C,IAAGiR,IACb,CAEAqyC,QAAAA,GACE,OAAOzvC,GAASvpB,KAAK0V,IAAM6T,GAASvpB,KAAK2mB,EAC3C,CASAypC,QAAAA,CAAS/wD,EAAiB45D,GACxB,MAAMtlB,EAAQ3zC,KAAKy3C,YACnB,IAAKwhB,IAAUtlB,EAEb,OAAO3zC,KAET,MAAM0T,EAA+B,CAAC,EAItC,OAHArU,EAAM0tB,QAAS0V,IACb/uB,EAAI+uB,GAAQkR,EAAMlR,IAASkR,EAAMlR,GAAM5O,SAAW8f,EAAMlR,GAAMyT,IAAMl2C,KAAKyiC,KAEpE/uB,CACT,EC3BK,SAASskB,GAAS+C,EAAOrF,GAC9B,MAAMwjC,EAAWn+B,EAAMjtB,QAAQ4nB,MACzByjC,EAAqBC,GAAkBr+B,GACvCs+B,EAAapqD,KAAK8C,IAAImnD,EAASI,eAAiBH,EAAoBA,GACpEI,EAAeL,EAAS9gC,MAAMohC,QAAUC,GAAgB/jC,GAAS,GACjEgkC,EAAkBH,EAAa7yD,OAC/BizD,EAAQJ,EAAa,GACrBrtC,EAAOqtC,EAAaG,EAAkB,GACtCE,EAAW,GAGjB,GAAIF,EAAkBL,EAEpB,OADAQ,GAAWnkC,EAAOkkC,EAAUL,EAAcG,EAAkBL,GACrDO,EAGT,MAAMzP,EAAU2P,GAAiBP,EAAc7jC,EAAO2jC,GAEtD,GAAIK,EAAkB,EAAG,CACvB,IAAIllD,EAAG8Q,EACP,MAAMy0C,EAAkBL,EAAkB,EAAIzqD,KAAKC,OAAOgd,EAAOytC,IAAUD,EAAkB,IAAM,KAEnG,IADA1xB,GAAKtS,EAAOkkC,EAAUzP,EAASvmC,GAAcm2C,GAAmB,EAAIJ,EAAQI,EAAiBJ,GACxFnlD,EAAI,EAAG8Q,EAAOo0C,EAAkB,EAAGllD,EAAI8Q,EAAM9Q,IAChDwzB,GAAKtS,EAAOkkC,EAAUzP,EAASoP,EAAa/kD,GAAI+kD,EAAa/kD,EAAI,IAGnE,OADAwzB,GAAKtS,EAAOkkC,EAAUzP,EAASj+B,EAAMtI,GAAcm2C,GAAmBrkC,EAAMhvB,OAASwlB,EAAO6tC,GACrFH,C,CAGT,OADA5xB,GAAKtS,EAAOkkC,EAAUzP,GACfyP,CACT,CAEA,SAASR,GAAkBr+B,GACzB,MAAMpE,EAASoE,EAAMjtB,QAAQ6oB,OACvBS,EAAa2D,EAAMi/B,YACnBC,EAAWl/B,EAAMkoB,QAAU7rB,GAAcT,EAAS,EAAI,GACtDujC,EAAWn/B,EAAMo/B,WAAa/iC,EACpC,OAAOnoB,KAAK2Z,MAAM3Z,KAAK8C,IAAIkoD,EAAUC,GACvC,CAOA,SAASJ,GAAiBP,EAAc7jC,EAAO2jC,GAC7C,MAAMe,EAAmBC,GAAed,GAClCpP,EAAUz0B,EAAMhvB,OAAS2yD,EAI/B,IAAKe,EACH,OAAOnrD,KAAK6C,IAAIq4C,EAAS,GAG3B,MAAMmQ,EAAUvxC,GAAWqxC,GAC3B,IAAK,IAAI5lD,EAAI,EAAG8Q,EAAOg1C,EAAQ5zD,OAAS,EAAG8N,EAAI8Q,EAAM9Q,IAAK,CACxD,MAAM8gC,EAASglB,EAAQ9lD,GACvB,GAAI8gC,EAAS6U,EACX,OAAO7U,CAEX,CACA,OAAOrmC,KAAK6C,IAAIq4C,EAAS,EAC3B,CAKA,SAASsP,GAAgB/jC,GACvB,MAAM1M,EAAS,GACf,IAAIxU,EAAG8Q,EACP,IAAK9Q,EAAI,EAAG8Q,EAAOoQ,EAAMhvB,OAAQ8N,EAAI8Q,EAAM9Q,IACrCkhB,EAAMlhB,GAAG4jB,OACXpP,EAAOhC,KAAKxS,GAGhB,OAAOwU,CACT,CAQA,SAAS6wC,GAAWnkC,EAAOkkC,EAAUL,EAAcpP,GACjD,IAEI31C,EAFAnG,EAAQ,EACRi6B,EAAOixB,EAAa,GAIxB,IADApP,EAAUl7C,KAAKsrD,KAAKpQ,GACf31C,EAAI,EAAGA,EAAIkhB,EAAMhvB,OAAQ8N,IACxBA,IAAM8zB,IACRsxB,EAAS5yC,KAAK0O,EAAMlhB,IACpBnG,IACAi6B,EAAOixB,EAAalrD,EAAQ87C,GAGlC,CASA,SAASniB,GAAKtS,EAAOkkC,EAAUzP,EAASqQ,EAAYC,GAClD,MAAMn0D,EAAQge,GAAek2C,EAAY,GACnCtvC,EAAMjc,KAAK8C,IAAIuS,GAAem2C,EAAU/kC,EAAMhvB,QAASgvB,EAAMhvB,QACnE,IACIA,EAAQ8N,EAAG8zB,EADXj6B,EAAQ,EAGZ87C,EAAUl7C,KAAKsrD,KAAKpQ,GAChBsQ,IACF/zD,EAAS+zD,EAAWD,EACpBrQ,EAAUzjD,EAASuI,KAAK2Z,MAAMliB,EAASyjD,IAGzC7hB,EAAOhiC,EAEP,MAAOgiC,EAAO,EACZj6B,IACAi6B,EAAOr5B,KAAKC,MAAM5I,EAAQ+H,EAAQ87C,GAGpC,IAAK31C,EAAIvF,KAAK6C,IAAIxL,EAAO,GAAIkO,EAAI0W,EAAK1W,IAChCA,IAAM8zB,IACRsxB,EAAS5yC,KAAK0O,EAAMlhB,IACpBnG,IACAi6B,EAAOr5B,KAAKC,MAAM5I,EAAQ+H,EAAQ87C,GAGxC,CAMA,SAASkQ,GAAevzB,GACtB,MAAMnzB,EAAMmzB,EAAIpgC,OAChB,IAAI8N,EAAGo6C,EAEP,GAAIj7C,EAAM,EACR,OAAO,EAGT,IAAKi7C,EAAO9nB,EAAI,GAAItyB,EAAI,EAAGA,EAAIb,IAAOa,EACpC,GAAIsyB,EAAItyB,GAAKsyB,EAAItyB,EAAI,KAAOo6C,EAC1B,OAAO,EAGX,OAAOA,CACT,ED7HAlJ,EAAAA,GAAAA,GAvCqBoT,GAAA,WAED,CAAC,IAAEpT,EAAAA,GAAAA,GAFFoT,GAAA,qBAGIhlD,GEAzB,MAAM4mD,GAAgBpsC,GAAoB,SAAVA,EAAmB,QAAoB,UAAVA,EAAoB,OAASA,EACpFqsC,GAAiBA,CAAC5/B,EAAOiqB,EAAMruB,IAAoB,QAATquB,GAA2B,SAATA,EAAkBjqB,EAAMiqB,GAAQruB,EAASoE,EAAMiqB,GAAQruB,EACnHikC,GAAgBA,CAACC,EAAavB,IAAkBrqD,KAAK8C,IAAIunD,GAAiBuB,EAAaA,GAY7F,SAASC,GAAOh0B,EAAKi0B,GACnB,MAAM/xC,EAAS,GACTgyC,EAAYl0B,EAAIpgC,OAASq0D,EACzBpnD,EAAMmzB,EAAIpgC,OAChB,IAAI8N,EAAI,EAER,KAAOA,EAAIb,EAAKa,GAAKwmD,EACnBhyC,EAAOhC,KAAK8f,EAAI73B,KAAK2Z,MAAMpU,KAE7B,OAAOwU,CACT,CAOA,SAASiyC,GAAoBlgC,EAAOr8B,EAAOw8D,GACzC,MAAMx0D,EAASq0B,EAAMrF,MAAMhvB,OACrBy0D,EAAalsD,KAAK8C,IAAIrT,EAAOgI,EAAS,GACtCJ,EAAQy0B,EAAMosB,YACdj8B,EAAM6P,EAAMqsB,UACZ7+B,EAAU,KAChB,IACIoO,EADAykC,EAAYrgC,EAAMooB,gBAAgBgY,GAGtC,KAAID,IAEAvkC,EADa,IAAXjwB,EACOuI,KAAK6C,IAAIspD,EAAY90D,EAAO4kB,EAAMkwC,GACxB,IAAV18D,GACCq8B,EAAMooB,gBAAgB,GAAKiY,GAAa,GAExCA,EAAYrgC,EAAMooB,gBAAgBgY,EAAa,IAAM,EAEjEC,GAAaD,EAAaz8D,EAAQi4B,GAAUA,EAGxCykC,EAAY90D,EAAQiiB,GAAW6yC,EAAYlwC,EAAM3C,IAIvD,OAAO6yC,CACT,CAMA,SAAS7+B,GAAe8+B,EAAQ30D,GAC9Bse,GAAKq2C,EAAS/+B,IACZ,MAAMP,EAAKO,EAAMP,GACXc,EAAQd,EAAGr1B,OAAS,EAC1B,IAAI8N,EACJ,GAAIqoB,EAAQn2B,EAAQ,CAClB,IAAK8N,EAAI,EAAGA,EAAIqoB,IAASroB,SAChB8nB,EAAM58B,KAAKq8B,EAAGvnB,IAEvBunB,EAAGzO,OAAO,EAAGuP,E,GAGnB,CAKA,SAASy+B,GAAkBxtD,GACzB,OAAOA,EAAQqpB,UAAYrpB,EAAQspB,WAAa,CAClD,CAKA,SAASmkC,GAAeztD,EAASg1B,GAC/B,IAAKh1B,EAAQ4oB,QACX,OAAO,EAGT,MAAMmD,EAAOgJ,GAAO/0B,EAAQ+rB,KAAMiJ,GAC5BxO,EAAUsO,GAAU90B,EAAQwmB,SAC5B+M,EAAQzsB,GAAQ9G,EAAQ4pB,MAAQ5pB,EAAQ4pB,KAAKhxB,OAAS,EAE5D,OAAO26B,EAASxH,EAAKE,WAAczF,EAAQiJ,MAC7C,CAEA,SAASi+B,GAAmBt0B,EAAQnM,GAClC,OAAO0I,GAAcyD,EAAQ,CAC3BnM,QACAz7B,KAAM,SAEV,CAEA,SAASm8D,GAAkBv0B,EAAQxoC,EAAO81C,GACxC,OAAO/Q,GAAcyD,EAAQ,CAC3BsN,OACA91C,QACAY,KAAM,QAEV,CAEA,SAASo8D,GAAWptC,EAAOihC,EAAUrqC,GAEnC,IAAIxR,EAAM2a,GAAmBC,GAI7B,OAHIpJ,GAAyB,UAAbqqC,IAA2BrqC,GAAwB,UAAbqqC,KACpD77C,EAAMgnD,GAAahnD,IAEdA,CACT,CAEA,SAASioD,GAAU5gC,EAAOpE,EAAQ44B,EAAUjhC,GAC1C,MAAM,IAACiG,EAAG,KAAE9F,EAAI,OAAE+F,EAAM,MAAE9F,EAAK,MAAEiH,GAASoF,GACpC,UAACiY,EAAA,OAAWhY,GAAUrF,EAC5B,IACI+L,EAAUk6B,EAAQC,EADlB79B,EAAW,EAEf,MAAMT,EAAS/I,EAASD,EAClBt0B,EAAQyuB,EAAQD,EAEtB,GAAIsM,EAAM6pB,eAAgB,CAGxB,GAFAgX,EAASrtC,GAAeD,EAAOG,EAAMC,GAEjCzK,GAASsrC,GAAW,CACtB,MAAMuM,EAAiB9tD,OAAOC,KAAKshD,GAAU,GACvCzqD,EAAQyqD,EAASuM,GACvBD,EAAS7gC,EAAO8gC,GAAgBlsC,iBAAiB9qB,GAASy4B,EAAS5G,C,MAEnEklC,EADsB,WAAbtM,GACCvc,EAAUxe,OAASwe,EAAUze,KAAO,EAAIgJ,EAAS5G,EAElDgkC,GAAe5/B,EAAOw0B,EAAU54B,GAE3C+K,EAAWhT,EAAQD,C,KACd,CACL,GAAIxK,GAASsrC,GAAW,CACtB,MAAMuM,EAAiB9tD,OAAOC,KAAKshD,GAAU,GACvCzqD,EAAQyqD,EAASuM,GACvBF,EAAS5gC,EAAO8gC,GAAgBlsC,iBAAiB9qB,GAAS7E,EAAQ02B,C,MAElEilC,EADsB,WAAbrM,GACCvc,EAAUvkB,KAAOukB,EAAUtkB,OAAS,EAAIzuB,EAAQ02B,EAEjDgkC,GAAe5/B,EAAOw0B,EAAU54B,GAE3CklC,EAASttC,GAAeD,EAAOkG,EAAQD,GACvCyJ,EAAwB,SAAbuxB,GAAuBtnC,GAAUA,E,CAE9C,MAAO,CAAC2zC,SAAQC,SAAQn6B,WAAU1D,WACpC,CAEe,MAAM+9B,WAAcjD,GAGjC12C,WAAAA,CAAYszB,GACVkQ,QAGA5lD,KAAK+Q,GAAK2kC,EAAI3kC,GAEd/Q,KAAKV,KAAOo2C,EAAIp2C,KAEhBU,KAAK8N,aAAUgG,EAEf9T,KAAKk6B,IAAMwb,EAAIxb,IAEfl6B,KAAK21B,MAAQ+f,EAAI/f,MAIjB31B,KAAKu0B,SAAMzgB,EAEX9T,KAAKw0B,YAAS1gB,EAEd9T,KAAKyuB,UAAO3a,EAEZ9T,KAAK0uB,WAAQ5a,EAEb9T,KAAKC,WAAQ6T,EAEb9T,KAAKu9B,YAASzpB,EACd9T,KAAKg8D,SAAW,CACdvtC,KAAM,EACNC,MAAO,EACP6F,IAAK,EACLC,OAAQ,GAGVx0B,KAAK0hC,cAAW5tB,EAEhB9T,KAAK+sC,eAAYj5B,EAEjB9T,KAAKi8D,gBAAanoD,EAElB9T,KAAKk8D,mBAAgBpoD,EAErB9T,KAAKm8D,iBAAcroD,EAEnB9T,KAAKo8D,kBAAetoD,EAIpB9T,KAAKwvB,UAAO1b,EAEZ9T,KAAKq8D,mBAAgBvoD,EACrB9T,KAAK+R,SAAM+B,EACX9T,KAAK8R,SAAMgC,EACX9T,KAAKs8D,YAASxoD,EAEd9T,KAAK01B,MAAQ,GAEb11B,KAAKu8D,eAAiB,KAEtBv8D,KAAKw8D,YAAc,KAEnBx8D,KAAKy8D,YAAc,KACnBz8D,KAAKijD,QAAU,EACfjjD,KAAKm6D,WAAa,EAClBn6D,KAAK08D,kBAAoB,CAAC,EAE1B18D,KAAKmnD,iBAAcrzC,EAEnB9T,KAAKonD,eAAYtzC,EACjB9T,KAAKovD,gBAAiB,EACtBpvD,KAAK28D,cAAW7oD,EAChB9T,KAAK48D,cAAW9oD,EAChB9T,KAAK68D,mBAAgB/oD,EACrB9T,KAAK88D,mBAAgBhpD,EACrB9T,KAAK+8D,aAAe,EACpB/8D,KAAKg9D,aAAe,EACpBh9D,KAAKnC,OAAS,CAAC,EACfmC,KAAKi9D,mBAAoB,EACzBj9D,KAAKk8C,cAAWpoC,CAClB,CAMA46C,IAAAA,CAAK5gD,GACH9N,KAAK8N,QAAUA,EAAQ63B,WAAW3lC,KAAKo9B,cAEvCp9B,KAAKwvB,KAAO1hB,EAAQ0hB,KAGpBxvB,KAAK48D,SAAW58D,KAAK6nC,MAAM/5B,EAAQiE,KACnC/R,KAAK28D,SAAW38D,KAAK6nC,MAAM/5B,EAAQgE,KACnC9R,KAAK88D,cAAgB98D,KAAK6nC,MAAM/5B,EAAQovD,cACxCl9D,KAAK68D,cAAgB78D,KAAK6nC,MAAM/5B,EAAQqvD,aAC1C,CAQAt1B,KAAAA,CAAMgT,EAAKn8C,GACT,OAAOm8C,CACT,CAOAlrB,aAAAA,GACE,IAAI,SAACitC,EAAQ,SAAED,EAAQ,cAAEG,EAAA,cAAeD,GAAiB78D,KAKzD,OAJA48D,EAAWx4C,GAAgBw4C,EAAUp3D,OAAOuiB,mBAC5C40C,EAAWv4C,GAAgBu4C,EAAUn3D,OAAO4zC,mBAC5C0jB,EAAgB14C,GAAgB04C,EAAet3D,OAAOuiB,mBACtD80C,EAAgBz4C,GAAgBy4C,EAAer3D,OAAO4zC,mBAC/C,CACLrnC,IAAKqS,GAAgBw4C,EAAUE,GAC/BhrD,IAAKsS,GAAgBu4C,EAAUE,GAC/BptC,WAAYvL,GAAS04C,GACrBltC,WAAYxL,GAASy4C,GAEzB,CAQAnd,SAAAA,CAAUpE,GACR,IACIl0C,GADA,IAAC6K,EAAA,IAAKD,EAAA,WAAK2d,EAAA,WAAYC,GAAc1vB,KAAK2vB,gBAG9C,GAAIF,GAAcC,EAChB,MAAO,CAAC3d,MAAKD,OAGf,MAAMsrD,EAAQp9D,KAAK45C,0BACnB,IAAK,IAAIplC,EAAI,EAAG8Q,EAAO83C,EAAM12D,OAAQ8N,EAAI8Q,IAAQ9Q,EAC/CtN,EAAQk2D,EAAM5oD,GAAGslC,WAAW0F,UAAUx/C,KAAMo7C,GACvC3rB,IACH1d,EAAM9C,KAAK8C,IAAIA,EAAK7K,EAAM6K,MAEvB2d,IACH5d,EAAM7C,KAAK6C,IAAIA,EAAK5K,EAAM4K,MAQ9B,OAHAC,EAAM2d,GAAc3d,EAAMD,EAAMA,EAAMC,EACtCD,EAAM2d,GAAc1d,EAAMD,EAAMC,EAAMD,EAE/B,CACLC,IAAKqS,GAAgBrS,EAAKqS,GAAgBtS,EAAKC,IAC/CD,IAAKsS,GAAgBtS,EAAKsS,GAAgBrS,EAAKD,IAEnD,CAOAkhD,UAAAA,GACE,MAAO,CACLvkC,KAAMzuB,KAAKm8D,aAAe,EAC1B5nC,IAAKv0B,KAAKi8D,YAAc,EACxBvtC,MAAO1uB,KAAKo8D,cAAgB,EAC5B5nC,OAAQx0B,KAAKk8D,eAAiB,EAElC,CAOAmB,QAAAA,GACE,OAAOr9D,KAAK01B,KACd,CAKAqpB,SAAAA,GACE,MAAMr/C,EAAOM,KAAK21B,MAAMj2B,KACxB,OAAOM,KAAK8N,QAAQgxC,SAAW9+C,KAAK4kD,eAAiBllD,EAAK49D,QAAU59D,EAAK69D,UAAY79D,EAAKo/C,QAAU,EACtG,CAKA0e,aAAAA,CAAcxqB,EAAYhzC,KAAK21B,MAAMqd,WACnC,MAAMxlB,EAAQxtB,KAAKw8D,cAAgBx8D,KAAKw8D,YAAcx8D,KAAKy9D,mBAAmBzqB,IAC9E,OAAOxlB,CACT,CAGAmnC,YAAAA,GACE30D,KAAKnC,OAAS,CAAC,EACfmC,KAAKi9D,mBAAoB,CAC3B,CAMAS,YAAAA,GACE94C,GAAK5kB,KAAK8N,QAAQ4vD,aAAc,CAAC19D,MACnC,CAUAo2C,MAAAA,CAAO1U,EAAUqL,EAAWY,GAC1B,MAAM,YAAC/W,EAAW,MAAEG,EAAOrB,MAAOwjC,GAAYl5D,KAAK8N,QAC7C6vD,EAAazE,EAASyE,WAG5B39D,KAAK09D,eAGL19D,KAAK0hC,SAAWA,EAChB1hC,KAAK+sC,UAAYA,EACjB/sC,KAAKg8D,SAAWruB,EAAU3/B,OAAO8T,OAAO,CACtC2M,KAAM,EACNC,MAAO,EACP6F,IAAK,EACLC,OAAQ,GACPmZ,GAEH3tC,KAAK01B,MAAQ,KACb11B,KAAKy8D,YAAc,KACnBz8D,KAAKu8D,eAAiB,KACtBv8D,KAAKw8D,YAAc,KAGnBx8D,KAAK49D,sBACL59D,KAAK69D,gBACL79D,KAAK89D,qBAEL99D,KAAKm6D,WAAan6D,KAAK4kD,eACnB5kD,KAAKC,MAAQ0tC,EAAQlf,KAAOkf,EAAQjf,MACpC1uB,KAAKu9B,OAASoQ,EAAQpZ,IAAMoZ,EAAQnZ,OAGnCx0B,KAAKi9D,oBACRj9D,KAAK+9D,mBACL/9D,KAAKg+D,sBACLh+D,KAAKi+D,kBACLj+D,KAAKs8D,OAASj5B,GAAUrjC,KAAM+2B,EAAOH,GACrC52B,KAAKi9D,mBAAoB,GAG3Bj9D,KAAKk+D,mBAELl+D,KAAK01B,MAAQ11B,KAAKm+D,cAAgB,GAGlCn+D,KAAKo+D,kBAIL,MAAMC,EAAkBV,EAAa39D,KAAK01B,MAAMhvB,OAChD1G,KAAKs+D,sBAAsBD,EAAkBvD,GAAO96D,KAAK01B,MAAOioC,GAAc39D,KAAK01B,OAMnF11B,KAAK82C,YAGL92C,KAAKu+D,+BACLv+D,KAAKw+D,yBACLx+D,KAAKy+D,8BAGDvF,EAASxiC,UAAYwiC,EAASlhC,UAAgC,SAApBkhC,EAASxzC,UACrD1lB,KAAK01B,MAAQsC,GAASh4B,KAAMA,KAAK01B,OACjC11B,KAAKy8D,YAAc,KACnBz8D,KAAK0+D,iBAGHL,GAEFr+D,KAAKs+D,sBAAsBt+D,KAAK01B,OAGlC11B,KAAK2+D,YACL3+D,KAAKgR,MACLhR,KAAK4+D,WAIL5+D,KAAK6+D,aACP,CAKA/nB,SAAAA,GACE,IACI2Q,EAAYE,EADZmX,EAAgB9+D,KAAK8N,QAAQoX,QAG7BllB,KAAK4kD,gBACP6C,EAAaznD,KAAKyuB,KAClBk5B,EAAW3nD,KAAK0uB,QAEhB+4B,EAAaznD,KAAKu0B,IAClBozB,EAAW3nD,KAAKw0B,OAEhBsqC,GAAiBA,GAEnB9+D,KAAKmnD,YAAcM,EACnBznD,KAAKonD,UAAYO,EACjB3nD,KAAKovD,eAAiB0P,EACtB9+D,KAAKijD,QAAU0E,EAAWF,EAC1BznD,KAAK++D,eAAiB/+D,KAAK8N,QAAQkxD,aACrC,CAEAH,WAAAA,GACEj6C,GAAK5kB,KAAK8N,QAAQ+wD,YAAa,CAAC7+D,MAClC,CAIA49D,mBAAAA,GACEh5C,GAAK5kB,KAAK8N,QAAQ8vD,oBAAqB,CAAC59D,MAC1C,CACA69D,aAAAA,GAEM79D,KAAK4kD,gBAEP5kD,KAAKC,MAAQD,KAAK0hC,SAClB1hC,KAAKyuB,KAAO,EACZzuB,KAAK0uB,MAAQ1uB,KAAKC,QAElBD,KAAKu9B,OAASv9B,KAAK+sC,UAGnB/sC,KAAKu0B,IAAM,EACXv0B,KAAKw0B,OAASx0B,KAAKu9B,QAIrBv9B,KAAKm8D,YAAc,EACnBn8D,KAAKi8D,WAAa,EAClBj8D,KAAKo8D,aAAe,EACpBp8D,KAAKk8D,cAAgB,CACvB,CACA4B,kBAAAA,GACEl5C,GAAK5kB,KAAK8N,QAAQgwD,mBAAoB,CAAC99D,MACzC,CAEAi/D,UAAAA,CAAW7/D,GACTY,KAAK21B,MAAMupC,cAAc9/D,EAAMY,KAAKo9B,cACpCxY,GAAK5kB,KAAK8N,QAAQ1O,GAAO,CAACY,MAC5B,CAGA+9D,gBAAAA,GACE/9D,KAAKi/D,WAAW,mBAClB,CACAjB,mBAAAA,GAAuB,CACvBC,eAAAA,GACEj+D,KAAKi/D,WAAW,kBAClB,CAGAf,gBAAAA,GACEl+D,KAAKi/D,WAAW,mBAClB,CAIAd,UAAAA,GACE,MAAO,EACT,CACAC,eAAAA,GACEp+D,KAAKi/D,WAAW,kBAClB,CAEAE,2BAAAA,GACEv6C,GAAK5kB,KAAK8N,QAAQqxD,4BAA6B,CAACn/D,MAClD,CAKAo/D,kBAAAA,CAAmB1pC,GACjB,MAAMwjC,EAAWl5D,KAAK8N,QAAQ4nB,MAC9B,IAAIlhB,EAAG8Q,EAAMkvB,EACb,IAAKhgC,EAAI,EAAG8Q,EAAOoQ,EAAMhvB,OAAQ8N,EAAI8Q,EAAM9Q,IACzCggC,EAAO9e,EAAMlhB,GACbggC,EAAKlnC,MAAQsX,GAAKs0C,EAASt0C,SAAU,CAAC4vB,EAAK1vC,MAAO0P,EAAGkhB,GAAQ11B,KAEjE,CACAq/D,0BAAAA,GACEz6C,GAAK5kB,KAAK8N,QAAQuxD,2BAA4B,CAACr/D,MACjD,CAIAu+D,4BAAAA,GACE35C,GAAK5kB,KAAK8N,QAAQywD,6BAA8B,CAACv+D,MACnD,CACAw+D,sBAAAA,GACE,MAAM1wD,EAAU9N,KAAK8N,QACforD,EAAWprD,EAAQ4nB,MACnB4pC,EAAW1E,GAAc56D,KAAK01B,MAAMhvB,OAAQoH,EAAQ4nB,MAAM4jC,eAC1D3hC,EAAcuhC,EAASvhC,aAAe,EACtCC,EAAcshC,EAASthC,YAC7B,IACIP,EAAW0V,EAAWwyB,EADtBlD,EAAgB1kC,EAGpB,IAAK33B,KAAKw/D,eAAiBtG,EAASxiC,SAAWiB,GAAeC,GAAe0nC,GAAY,IAAMt/D,KAAK4kD,eAElG,YADA5kD,KAAKq8D,cAAgB1kC,GAIvB,MAAM8nC,EAAaz/D,KAAK0/D,iBAClBC,EAAgBF,EAAWG,OAAO3/D,MAClC4/D,EAAiBJ,EAAWK,QAAQviC,OAIpCmE,EAAWlW,GAAYxrB,KAAK21B,MAAM11B,MAAQ0/D,EAAe,EAAG3/D,KAAK0hC,UACvErK,EAAYvpB,EAAQ6oB,OAAS32B,KAAK0hC,SAAW49B,EAAW59B,GAAY49B,EAAW,GAG3EK,EAAgB,EAAItoC,IACtBA,EAAYqK,GAAY49B,GAAYxxD,EAAQ6oB,OAAS,GAAM,IAC3DoW,EAAY/sC,KAAK+sC,UAAYuuB,GAAkBxtD,EAAQkpB,MACvDkiC,EAAS5kC,QAAUinC,GAAeztD,EAAQN,MAAOxN,KAAK21B,MAAM7nB,QAAQ+rB,MACpE0lC,EAAmBtwD,KAAKga,KAAK02C,EAAgBA,EAAgBE,EAAiBA,GAC9ExD,EAAgBryC,GAAU/a,KAAK8C,IAC7B9C,KAAK8wD,KAAKv0C,IAAai0C,EAAWK,QAAQviC,OAAS,GAAKlG,GAAY,EAAG,IACvEpoB,KAAK8wD,KAAKv0C,GAAYuhB,EAAYwyB,GAAmB,EAAG,IAAMtwD,KAAK8wD,KAAKv0C,GAAYq0C,EAAiBN,GAAmB,EAAG,MAE7HlD,EAAgBptD,KAAK6C,IAAI6lB,EAAa1oB,KAAK8C,IAAI6lB,EAAaykC,KAG9Dr8D,KAAKq8D,cAAgBA,CACvB,CACAoC,2BAAAA,GACE75C,GAAK5kB,KAAK8N,QAAQ2wD,4BAA6B,CAACz+D,MAClD,CACA0+D,aAAAA,GAAiB,CAIjBC,SAAAA,GACE/5C,GAAK5kB,KAAK8N,QAAQ6wD,UAAW,CAAC3+D,MAChC,CACAgR,GAAAA,GAEE,MAAMk8C,EAAU,CACdjtD,MAAO,EACPs9B,OAAQ,IAGJ,MAAC5H,EAAO7nB,SAAU4nB,MAAOwjC,EAAU1rD,MAAOwyD,EAAWhpC,KAAMipC,IAAajgE,KACxE02B,EAAU12B,KAAKw/D,aACf5a,EAAe5kD,KAAK4kD,eAE1B,GAAIluB,EAAS,CACX,MAAMwpC,EAAc3E,GAAeyE,EAAWrqC,EAAM7nB,QAAQ+rB,MAU5D,GATI+qB,GACFsI,EAAQjtD,MAAQD,KAAK0hC,SACrBwrB,EAAQ3vB,OAAS+9B,GAAkB2E,GAAYC,IAE/ChT,EAAQ3vB,OAASv9B,KAAK+sC,UACtBmgB,EAAQjtD,MAAQq7D,GAAkB2E,GAAYC,GAI5ChH,EAASxiC,SAAW12B,KAAK01B,MAAMhvB,OAAQ,CACzC,MAAM,MAACizD,EAAA,KAAOztC,EAAA,OAAM0zC,EAAA,QAAQE,GAAW9/D,KAAK0/D,iBACtCS,EAAiC,EAAnBjH,EAAS5kC,QACvB8rC,EAAet2C,GAAU9pB,KAAKq8D,eAC9BvqC,EAAM7iB,KAAK6iB,IAAIsuC,GACfvvC,EAAM5hB,KAAK4hB,IAAIuvC,GAErB,GAAIxb,EAAc,CAEhB,MAAMyb,EAAcnH,EAASrhC,OAAS,EAAIhH,EAAM+uC,EAAO3/D,MAAQ6xB,EAAMguC,EAAQviC,OAC7E2vB,EAAQ3vB,OAAStuB,KAAK8C,IAAI/R,KAAK+sC,UAAWmgB,EAAQ3vB,OAAS8iC,EAAcF,E,KACpE,CAGL,MAAMG,EAAapH,EAASrhC,OAAS,EAAI/F,EAAM8tC,EAAO3/D,MAAQ4wB,EAAMivC,EAAQviC,OAE5E2vB,EAAQjtD,MAAQgP,KAAK8C,IAAI/R,KAAK0hC,SAAUwrB,EAAQjtD,MAAQqgE,EAAaH,E,CAEvEngE,KAAKugE,kBAAkB5G,EAAOztC,EAAM2E,EAAKiB,E,EAI7C9xB,KAAKwgE,iBAED5b,GACF5kD,KAAKC,MAAQD,KAAKijD,QAAUttB,EAAM11B,MAAQD,KAAKg8D,SAASvtC,KAAOzuB,KAAKg8D,SAASttC,MAC7E1uB,KAAKu9B,OAAS2vB,EAAQ3vB,SAEtBv9B,KAAKC,MAAQitD,EAAQjtD,MACrBD,KAAKu9B,OAASv9B,KAAKijD,QAAUttB,EAAM4H,OAASv9B,KAAKg8D,SAASznC,IAAMv0B,KAAKg8D,SAASxnC,OAElF,CAEA+rC,iBAAAA,CAAkB5G,EAAOztC,EAAM2E,EAAKiB,GAClC,MAAO4D,OAAO,MAACpH,EAAA,QAAOgG,GAAQ,SAAEi7B,GAAYvvD,KAAK8N,QAC3C2yD,EAAmC,IAAvBzgE,KAAKq8D,cACjBqE,EAAgC,QAAbnR,GAAoC,MAAdvvD,KAAKwvB,KAEpD,GAAIxvB,KAAK4kD,eAAgB,CACvB,MAAM+b,EAAa3gE,KAAKmjD,gBAAgB,GAAKnjD,KAAKyuB,KAC5CmyC,EAAc5gE,KAAK0uB,MAAQ1uB,KAAKmjD,gBAAgBnjD,KAAK01B,MAAMhvB,OAAS,GAC1E,IAAIy1D,EAAc,EACdC,EAAe,EAIfqE,EACEC,GACFvE,EAAcrqC,EAAM6nC,EAAM15D,MAC1Bm8D,EAAevrC,EAAM3E,EAAKqR,SAE1B4+B,EAActrC,EAAM8oC,EAAMp8B,OAC1B6+B,EAAetqC,EAAM5F,EAAKjsB,OAET,UAAVquB,EACT8tC,EAAelwC,EAAKjsB,MACD,QAAVquB,EACT6tC,EAAcxC,EAAM15D,MACD,UAAVquB,IACT6tC,EAAcxC,EAAM15D,MAAQ,EAC5Bm8D,EAAelwC,EAAKjsB,MAAQ,GAI9BD,KAAKm8D,YAAcltD,KAAK6C,KAAKqqD,EAAcwE,EAAarsC,GAAWt0B,KAAKC,OAASD,KAAKC,MAAQ0gE,GAAa,GAC3G3gE,KAAKo8D,aAAentD,KAAK6C,KAAKsqD,EAAewE,EAActsC,GAAWt0B,KAAKC,OAASD,KAAKC,MAAQ2gE,GAAc,E,KAC1G,CACL,IAAI3E,EAAa/vC,EAAKqR,OAAS,EAC3B2+B,EAAgBvC,EAAMp8B,OAAS,EAErB,UAAVjP,GACF2tC,EAAa,EACbC,EAAgBvC,EAAMp8B,QACH,QAAVjP,IACT2tC,EAAa/vC,EAAKqR,OAClB2+B,EAAgB,GAGlBl8D,KAAKi8D,WAAaA,EAAa3nC,EAC/Bt0B,KAAKk8D,cAAgBA,EAAgB5nC,C,CAEzC,CAMAksC,cAAAA,GACMxgE,KAAKg8D,WACPh8D,KAAKg8D,SAASvtC,KAAOxf,KAAK6C,IAAI9R,KAAKm8D,YAAan8D,KAAKg8D,SAASvtC,MAC9DzuB,KAAKg8D,SAASznC,IAAMtlB,KAAK6C,IAAI9R,KAAKi8D,WAAYj8D,KAAKg8D,SAASznC,KAC5Dv0B,KAAKg8D,SAASttC,MAAQzf,KAAK6C,IAAI9R,KAAKo8D,aAAcp8D,KAAKg8D,SAASttC,OAChE1uB,KAAKg8D,SAASxnC,OAASvlB,KAAK6C,IAAI9R,KAAKk8D,cAAel8D,KAAKg8D,SAASxnC,QAEtE,CAEAoqC,QAAAA,GACEh6C,GAAK5kB,KAAK8N,QAAQ8wD,SAAU,CAAC5+D,MAC/B,CAMA4kD,YAAAA,GACE,MAAM,KAACp1B,EAAA,SAAM+/B,GAAYvvD,KAAK8N,QAC9B,MAAoB,QAAbyhD,GAAmC,WAAbA,GAAkC,MAAT//B,CACxD,CAIAqxC,UAAAA,GACE,OAAO7gE,KAAK8N,QAAQokD,QACtB,CAMAoM,qBAAAA,CAAsB5oC,GAMpB,IAAIlhB,EAAG8Q,EACP,IANAtlB,KAAKm/D,8BAELn/D,KAAKo/D,mBAAmB1pC,GAInBlhB,EAAI,EAAG8Q,EAAOoQ,EAAMhvB,OAAQ8N,EAAI8Q,EAAM9Q,IACrCoP,GAAc8R,EAAMlhB,GAAGlH,SACzBooB,EAAMpI,OAAO9Y,EAAG,GAChB8Q,IACA9Q,KAIJxU,KAAKq/D,4BACP,CAMAK,cAAAA,GACE,IAAID,EAAaz/D,KAAKy8D,YAEtB,IAAKgD,EAAY,CACf,MAAM9B,EAAa39D,KAAK8N,QAAQ4nB,MAAMioC,WACtC,IAAIjoC,EAAQ11B,KAAK01B,MACbioC,EAAajoC,EAAMhvB,SACrBgvB,EAAQolC,GAAOplC,EAAOioC,IAGxB39D,KAAKy8D,YAAcgD,EAAaz/D,KAAK8gE,mBAAmBprC,EAAOA,EAAMhvB,OAAQ1G,KAAK8N,QAAQ4nB,MAAM4jC,c,CAGlG,OAAOmG,CACT,CAQAqB,kBAAAA,CAAmBprC,EAAOhvB,EAAQ4yD,GAChC,MAAM,IAACp/B,EAAKwiC,kBAAmBrB,GAAUr7D,KACnC+gE,EAAS,GACTC,EAAU,GACVhG,EAAY/rD,KAAK2Z,MAAMliB,EAASk0D,GAAcl0D,EAAQ4yD,IAC5D,IAEI9kD,EAAG+L,EAAGkc,EAAMnvB,EAAO2zD,EAAUC,EAAY5kC,EAAOvC,EAAY95B,EAAOs9B,EAAQ4jC,EAF3EC,EAAkB,EAClBC,EAAmB,EAGvB,IAAK7sD,EAAI,EAAGA,EAAI9N,EAAQ8N,GAAKwmD,EAAW,CAQtC,GAPA1tD,EAAQooB,EAAMlhB,GAAGlH,MACjB2zD,EAAWjhE,KAAKshE,wBAAwB9sD,GACxC0lB,EAAIL,KAAOqnC,EAAaD,EAAShlC,OACjCK,EAAQ++B,EAAO6F,GAAc7F,EAAO6F,IAAe,CAACxhE,KAAM,CAAC,EAAGq8B,GAAI,IAClEhC,EAAaknC,EAASlnC,WACtB95B,EAAQs9B,EAAS,EAEZ3Z,GAActW,IAAWsH,GAAQtH,IAG/B,GAAIsH,GAAQtH,GAEjB,IAAKiT,EAAI,EAAGkc,EAAOnvB,EAAM5G,OAAQ6Z,EAAIkc,IAAQlc,EAC3C4gD,EAAqC7zD,EAAMiT,GAEtCqD,GAAcu9C,IAAiBvsD,GAAQusD,KAC1ClhE,EAAQ67B,GAAa5B,EAAKoC,EAAM58B,KAAM48B,EAAMP,GAAI97B,EAAOkhE,GACvD5jC,GAAUxD,QATd95B,EAAQ67B,GAAa5B,EAAKoC,EAAM58B,KAAM48B,EAAMP,GAAI97B,EAAOqN,GACvDiwB,EAASxD,EAYXgnC,EAAO/5C,KAAK/mB,GACZ+gE,EAAQh6C,KAAKuW,GACb6jC,EAAkBnyD,KAAK6C,IAAI7R,EAAOmhE,GAClCC,EAAmBpyD,KAAK6C,IAAIyrB,EAAQ8jC,EACtC,CACA9kC,GAAe8+B,EAAQ30D,GAEvB,MAAMk5D,EAASmB,EAAOh7C,QAAQq7C,GACxBtB,EAAUkB,EAAQj7C,QAAQs7C,GAE1BE,EAAWC,IAAA,CAAUvhE,MAAO8gE,EAAOS,IAAQ,EAAGjkC,OAAQyjC,EAAQQ,IAAQ,IAE5E,MAAO,CACL7H,MAAO4H,EAAQ,GACfr1C,KAAMq1C,EAAQ76D,EAAS,GACvBk5D,OAAQ2B,EAAQ3B,GAChBE,QAASyB,EAAQzB,GACjBiB,SACAC,UAEJ,CAOAhhB,gBAAAA,CAAiBl7C,GACf,OAAOA,CACT,CASA8qB,gBAAAA,CAAiB9qB,EAAOpG,GACtB,OAAO6gD,GACT,CAQAqI,gBAAAA,CAAiB7qB,GAAQ,CAQzBomB,eAAAA,CAAgBzkD,GACd,MAAMg3B,EAAQ11B,KAAK01B,MACnB,OAAIh3B,EAAQ,GAAKA,EAAQg3B,EAAMhvB,OAAS,EAC/B,KAEF1G,KAAK4vB,iBAAiB8F,EAAMh3B,GAAOoG,MAC5C,CAQA4iD,kBAAAA,CAAmB+Z,GACbzhE,KAAKovD,iBACPqS,EAAU,EAAIA,GAGhB,MAAM1kC,EAAQ/8B,KAAKmnD,YAAcsa,EAAUzhE,KAAKijD,QAChD,OAAOx3B,GAAYzrB,KAAK++D,eAAiBjiC,GAAY98B,KAAK21B,MAAOoH,EAAO,GAAKA,EAC/E,CAMA2kC,kBAAAA,CAAmB3kC,GACjB,MAAM0kC,GAAW1kC,EAAQ/8B,KAAKmnD,aAAennD,KAAKijD,QAClD,OAAOjjD,KAAKovD,eAAiB,EAAIqS,EAAUA,CAC7C,CAOA3b,YAAAA,GACE,OAAO9lD,KAAK4vB,iBAAiB5vB,KAAK2hE,eACpC,CAKAA,YAAAA,GACE,MAAM,IAAC5vD,EAAG,IAAED,GAAO9R,KAEnB,OAAO+R,EAAM,GAAKD,EAAM,EAAIA,EAC1BC,EAAM,GAAKD,EAAM,EAAIC,EACrB,CACJ,CAKAqrB,UAAAA,CAAW1+B,GACT,MAAMg3B,EAAQ11B,KAAK01B,OAAS,GAE5B,GAAIh3B,GAAS,GAAKA,EAAQg3B,EAAMhvB,OAAQ,CACtC,MAAM8tC,EAAO9e,EAAMh3B,GACnB,OAAO81C,EAAK0H,WACb1H,EAAK0H,SAAWuf,GAAkBz7D,KAAKo9B,aAAc1+B,EAAO81C,G,CAE7D,OAAOx0C,KAAKk8C,WACZl8C,KAAKk8C,SAAWsf,GAAmBx7D,KAAK21B,MAAMyH,aAAcp9B,MAC9D,CAMAg6D,SAAAA,GACE,MAAM4H,EAAc5hE,KAAK8N,QAAQ4nB,MAG3BmsC,EAAM/3C,GAAU9pB,KAAKq8D,eACrBvqC,EAAM7iB,KAAKuZ,IAAIvZ,KAAK6iB,IAAI+vC,IACxBhxC,EAAM5hB,KAAKuZ,IAAIvZ,KAAK4hB,IAAIgxC,IAExBpC,EAAaz/D,KAAK0/D,iBAClBprC,EAAUstC,EAAY3pC,iBAAmB,EACzC3jB,EAAImrD,EAAaA,EAAWG,OAAO3/D,MAAQq0B,EAAU,EACrDziB,EAAI4tD,EAAaA,EAAWK,QAAQviC,OAASjJ,EAAU,EAG7D,OAAOt0B,KAAK4kD,eACR/yC,EAAIigB,EAAMxd,EAAIuc,EAAMvc,EAAIwd,EAAMjgB,EAAIgf,EAClChf,EAAIgf,EAAMvc,EAAIwd,EAAMjgB,EAAIigB,EAAMxd,EAAIuc,CACxC,CAMA2uC,UAAAA,GACE,MAAM9oC,EAAU12B,KAAK8N,QAAQ4oB,QAE7B,MAAgB,SAAZA,IACOA,EAGJ12B,KAAK45C,0BAA0BlzC,OAAS,CACjD,CAKAo7D,qBAAAA,CAAsB9uB,GACpB,MAAMxjB,EAAOxvB,KAAKwvB,KACZmG,EAAQ31B,KAAK21B,MACb7nB,EAAU9N,KAAK8N,SACf,KAACkpB,EAAI,SAAEu4B,EAAA,OAAUh4B,GAAUzpB,EAC3B6oB,EAASK,EAAKL,OACdiuB,EAAe5kD,KAAK4kD,eACpBlvB,EAAQ11B,KAAK01B,MACbmlC,EAAcnlC,EAAMhvB,QAAUiwB,EAAS,EAAI,GAC3CorC,EAAKzG,GAAkBtkC,GACvBxJ,EAAQ,GAERw0C,EAAazqC,EAAOoO,WAAW3lC,KAAKo9B,cACpC6kC,EAAYD,EAAWtrC,QAAUsrC,EAAW/hE,MAAQ,EACpDiiE,EAAgBD,EAAY,EAC5BE,EAAmB,SAASplC,GAChC,OAAOD,GAAYnH,EAAOoH,EAAOklC,EACnC,EACA,IAAIG,EAAa5tD,EAAG4mD,EAAWiH,EAC3BC,EAAKC,EAAKC,EAAKC,EAAKC,EAAIC,EAAIC,EAAIC,EAEpC,GAAiB,QAAbtT,EACF6S,EAAcD,EAAiBniE,KAAKw0B,QACpC+tC,EAAMviE,KAAKw0B,OAASutC,EACpBU,EAAML,EAAcF,EACpBS,EAAKR,EAAiBnvB,EAAUze,KAAO2tC,EACvCW,EAAK7vB,EAAUxe,YACV,GAAiB,WAAb+6B,EACT6S,EAAcD,EAAiBniE,KAAKu0B,KACpCouC,EAAK3vB,EAAUze,IACfsuC,EAAKV,EAAiBnvB,EAAUxe,QAAU0tC,EAC1CK,EAAMH,EAAcF,EACpBO,EAAMziE,KAAKu0B,IAAMwtC,OACZ,GAAiB,SAAbxS,EACT6S,EAAcD,EAAiBniE,KAAK0uB,OACpC4zC,EAAMtiE,KAAK0uB,MAAQqzC,EACnBS,EAAMJ,EAAcF,EACpBQ,EAAKP,EAAiBnvB,EAAUvkB,MAAQyzC,EACxCU,EAAK5vB,EAAUtkB,WACV,GAAiB,UAAb6gC,EACT6S,EAAcD,EAAiBniE,KAAKyuB,MACpCi0C,EAAK1vB,EAAUvkB,KACfm0C,EAAKT,EAAiBnvB,EAAUtkB,OAASwzC,EACzCI,EAAMF,EAAcF,EACpBM,EAAMxiE,KAAKyuB,KAAOszC,OACb,GAAa,MAATvyC,EAAc,CACvB,GAAiB,WAAb+/B,EACF6S,EAAcD,GAAkBnvB,EAAUze,IAAMye,EAAUxe,QAAU,EAAI,SACnE,GAAIvQ,GAASsrC,GAAW,CAC7B,MAAMuM,EAAiB9tD,OAAOC,KAAKshD,GAAU,GACvCzqD,EAAQyqD,EAASuM,GACvBsG,EAAcD,EAAiBniE,KAAK21B,MAAMqF,OAAO8gC,GAAgBlsC,iBAAiB9qB,G,CAGpF69D,EAAK3vB,EAAUze,IACfsuC,EAAK7vB,EAAUxe,OACf+tC,EAAMH,EAAcF,EACpBO,EAAMF,EAAMR,C,MACP,GAAa,MAATvyC,EAAc,CACvB,GAAiB,WAAb+/B,EACF6S,EAAcD,GAAkBnvB,EAAUvkB,KAAOukB,EAAUtkB,OAAS,QAC/D,GAAIzK,GAASsrC,GAAW,CAC7B,MAAMuM,EAAiB9tD,OAAOC,KAAKshD,GAAU,GACvCzqD,EAAQyqD,EAASuM,GACvBsG,EAAcD,EAAiBniE,KAAK21B,MAAMqF,OAAO8gC,GAAgBlsC,iBAAiB9qB,G,CAGpFw9D,EAAMF,EAAcF,EACpBM,EAAMF,EAAMP,EACZW,EAAK1vB,EAAUvkB,KACfm0C,EAAK5vB,EAAUtkB,K,CAGjB,MAAMo0C,EAAQx+C,GAAexW,EAAQ4nB,MAAM4jC,cAAeuB,GACpDkI,EAAO9zD,KAAK6C,IAAI,EAAG7C,KAAKsrD,KAAKM,EAAciI,IACjD,IAAKtuD,EAAI,EAAGA,EAAIqmD,EAAarmD,GAAKuuD,EAAM,CACtC,MAAMvpC,EAAUx5B,KAAKo9B,WAAW5oB,GAC1BwuD,EAAchsC,EAAK2O,WAAWnM,GAC9BypC,EAAoB1rC,EAAOoO,WAAWnM,GAEtCvC,EAAY+rC,EAAY/rC,UACxBisC,EAAYF,EAAYtgD,MACxBiwB,EAAaswB,EAAkBzrC,MAAQ,GACvCob,EAAmBqwB,EAAkBxrC,WAErCJ,EAAY2rC,EAAY3rC,UACxBC,EAAY0rC,EAAY1rC,UACxB6rC,EAAiBH,EAAYG,gBAAkB,GAC/CC,EAAuBJ,EAAYI,qBAEzChI,EAAYH,GAAoBj7D,KAAMwU,EAAGmiB,QAGvB7iB,IAAdsnD,IAIJiH,EAAmBvlC,GAAYnH,EAAOylC,EAAWnkC,GAE7C2tB,EACF0d,EAAME,EAAME,EAAKE,EAAKP,EAEtBE,EAAME,EAAME,EAAKE,EAAKR,EAGxB70C,EAAMxG,KAAK,CACTs7C,MACAC,MACAC,MACAC,MACAC,KACAC,KACAC,KACAC,KACA5iE,MAAOg3B,EACPvU,MAAOwgD,EACPvwB,aACAC,mBACAvb,YACAC,YACA6rC,iBACAC,yBAEJ,CAKA,OAHApjE,KAAK+8D,aAAelC,EACpB76D,KAAKg9D,aAAeoF,EAEb50C,CACT,CAKAiwC,kBAAAA,CAAmBzqB,GACjB,MAAMxjB,EAAOxvB,KAAKwvB,KACZ1hB,EAAU9N,KAAK8N,SACf,SAACyhD,EAAU75B,MAAOksC,GAAe9zD,EACjC82C,EAAe5kD,KAAK4kD,eACpBlvB,EAAQ11B,KAAK01B,OACb,MAACpH,EAAA,WAAO+J,EAAA,QAAY/D,EAAO,OAAEuD,GAAU+pC,EACvCG,EAAKzG,GAAkBxtD,EAAQkpB,MAC/BqsC,EAAiBtB,EAAKztC,EACtBgvC,EAAkBzrC,GAAUvD,EAAU+uC,EACtCrlC,GAAYlU,GAAU9pB,KAAKq8D,eAC3B7uC,EAAQ,GACd,IAAIhZ,EAAG8Q,EAAMkvB,EAAMlnC,EAAOoI,EAAGiR,EAAGwZ,EAAWpD,EAAOlD,EAAME,EAAYwpC,EAAWC,EAC3EpjC,EAAe,SAEnB,GAAiB,QAAbmvB,EACF5oC,EAAI3mB,KAAKw0B,OAAS8uC,EAClBnjC,EAAYngC,KAAKyjE,+BACZ,GAAiB,WAAblU,EACT5oC,EAAI3mB,KAAKu0B,IAAM+uC,EACfnjC,EAAYngC,KAAKyjE,+BACZ,GAAiB,SAAblU,EAAqB,CAC9B,MAAM77C,EAAM1T,KAAK0jE,wBAAwB3B,GACzC5hC,EAAYzsB,EAAIysB,UAChBzqB,EAAIhC,EAAIgC,C,MACH,GAAiB,UAAb65C,EAAsB,CAC/B,MAAM77C,EAAM1T,KAAK0jE,wBAAwB3B,GACzC5hC,EAAYzsB,EAAIysB,UAChBzqB,EAAIhC,EAAIgC,C,MACH,GAAa,MAAT8Z,EAAc,CACvB,GAAiB,WAAb+/B,EACF5oC,GAAMqsB,EAAUze,IAAMye,EAAUxe,QAAU,EAAK6uC,OAC1C,GAAIp/C,GAASsrC,GAAW,CAC7B,MAAMuM,EAAiB9tD,OAAOC,KAAKshD,GAAU,GACvCzqD,EAAQyqD,EAASuM,GACvBn1C,EAAI3mB,KAAK21B,MAAMqF,OAAO8gC,GAAgBlsC,iBAAiB9qB,GAASu+D,C,CAElEljC,EAAYngC,KAAKyjE,yB,MACZ,GAAa,MAATj0C,EAAc,CACvB,GAAiB,WAAb+/B,EACF75C,GAAMs9B,EAAUvkB,KAAOukB,EAAUtkB,OAAS,EAAK20C,OAC1C,GAAIp/C,GAASsrC,GAAW,CAC7B,MAAMuM,EAAiB9tD,OAAOC,KAAKshD,GAAU,GACvCzqD,EAAQyqD,EAASuM,GACvBpmD,EAAI1V,KAAK21B,MAAMqF,OAAO8gC,GAAgBlsC,iBAAiB9qB,E,CAEzDq7B,EAAYngC,KAAK0jE,wBAAwB3B,GAAI5hC,S,CAGlC,MAAT3Q,IACY,UAAVlB,EACF8R,EAAe,MACI,QAAV9R,IACT8R,EAAe,WAInB,MAAMq/B,EAAaz/D,KAAK0/D,iBACxB,IAAKlrD,EAAI,EAAG8Q,EAAOoQ,EAAMhvB,OAAQ8N,EAAI8Q,IAAQ9Q,EAAG,CAC9CggC,EAAO9e,EAAMlhB,GACblH,EAAQknC,EAAKlnC,MAEb,MAAM01D,EAAcpB,EAAYj8B,WAAW3lC,KAAKo9B,WAAW5oB,IAC3DuoB,EAAQ/8B,KAAKmjD,gBAAgB3uC,GAAKotD,EAAY1pC,YAC9C2B,EAAO75B,KAAKshE,wBAAwB9sD,GACpCulB,EAAaF,EAAKE,WAClBwpC,EAAY3uD,GAAQtH,GAASA,EAAM5G,OAAS,EAC5C,MAAMi9D,EAAYJ,EAAY,EACxB7gD,EAAQsgD,EAAYtgD,MACpB6e,EAAcyhC,EAAYjrC,gBAC1BuJ,EAAc0hC,EAAYlrC,gBAChC,IA4CI0J,EA5CAoiC,EAAgBzjC,EA8CpB,GA5CIykB,GACFlvC,EAAIqnB,EAEc,UAAdoD,IAEAyjC,EADEpvD,IAAM8Q,EAAO,EACEtlB,KAAK8N,QAAQoX,QAAoB,OAAV,QACzB,IAAN1Q,EACQxU,KAAK8N,QAAQoX,QAAmB,QAAT,OAExB,UAMhBs+C,EAFa,QAAbjU,EACiB,SAAfl3B,GAAsC,IAAb2F,GACbulC,EAAYxpC,EAAaA,EAAa,EAC5B,WAAf1B,GACKonC,EAAWK,QAAQviC,OAAS,EAAIomC,EAAY5pC,EAAaA,GAEzD0lC,EAAWK,QAAQviC,OAASxD,EAAa,EAItC,SAAf1B,GAAsC,IAAb2F,EACdjE,EAAa,EACF,WAAf1B,EACIonC,EAAWK,QAAQviC,OAAS,EAAIomC,EAAY5pC,EAE5C0lC,EAAWK,QAAQviC,OAASgmC,EAAYxpC,EAGrDlC,IACF2rC,IAAe,GAEA,IAAbxlC,GAAmBglC,EAAY1qC,oBACjC5iB,GAAKqkB,EAAc,EAAK9qB,KAAK4hB,IAAImN,MAGnCrX,EAAIoW,EACJymC,GAAc,EAAID,GAAaxpC,EAAa,GAK1CipC,EAAY1qC,kBAAmB,CACjC,MAAMurC,EAAejhC,GAAUogC,EAAYxqC,iBACrC+E,EAASkiC,EAAWuB,QAAQxsD,GAC5BvU,EAAQw/D,EAAWsB,OAAOvsD,GAEhC,IAAI+f,EAAMivC,EAAaK,EAAatvC,IAChC9F,EAAO,EAAIo1C,EAAap1C,KAE5B,OAAQ2R,GACR,IAAK,SACH7L,GAAOgJ,EAAS,EAChB,MACF,IAAK,SACHhJ,GAAOgJ,EACP,MAKF,OAAQ4C,GACR,IAAK,SACH1R,GAAQxuB,EAAQ,EAChB,MACF,IAAK,QACHwuB,GAAQxuB,EACR,MACF,IAAK,QACCuU,IAAM8Q,EAAO,EACfmJ,GAAQxuB,EACCuU,EAAI,IACbia,GAAQxuB,EAAQ,GAElB,MAKFuhC,EAAW,CACT/S,OACA8F,MACAt0B,MAAOA,EAAQ4jE,EAAa5jE,MAC5Bs9B,OAAQA,EAASsmC,EAAatmC,OAE9B7a,MAAOsgD,EAAYzqC,c,CAIvB/K,EAAMxG,KAAK,CACT1Z,QACAusB,OACA2pC,aACA11D,QAAS,CACPkwB,WACAtb,QACA6e,cACAD,cACAnB,UAAWyjC,EACXxjC,eACAH,YAAa,CAACvqB,EAAGiR,GACjB6a,aAGN,CAEA,OAAOhU,CACT,CAEAi2C,uBAAAA,GACE,MAAM,SAAClU,EAAA,MAAU75B,GAAS11B,KAAK8N,QACzBkwB,GAAYlU,GAAU9pB,KAAKq8D,eAEjC,GAAIr+B,EACF,MAAoB,QAAbuxB,EAAqB,OAAS,QAGvC,IAAIjhC,EAAQ,SAUZ,MARoB,UAAhBoH,EAAMpH,MACRA,EAAQ,OACiB,QAAhBoH,EAAMpH,MACfA,EAAQ,QACiB,UAAhBoH,EAAMpH,QACfA,EAAQ,SAGHA,CACT,CAEAo1C,uBAAAA,CAAwB3B,GACtB,MAAM,SAACxS,EAAU75B,OAAO,WAAC2C,EAAA,OAAYR,EAAA,QAAQvD,IAAYt0B,KAAK8N,QACxD2xD,EAAaz/D,KAAK0/D,iBAClB2D,EAAiBtB,EAAKztC,EACtBsrC,EAASH,EAAWG,OAAO3/D,MAEjC,IAAIkgC,EACAzqB,EA0DJ,MAxDiB,SAAb65C,EACE13B,GACFniB,EAAI1V,KAAK0uB,MAAQ4F,EAEE,SAAf+D,EACF8H,EAAY,OACY,WAAf9H,GACT8H,EAAY,SACZzqB,GAAMkqD,EAAS,IAEfz/B,EAAY,QACZzqB,GAAKkqD,KAGPlqD,EAAI1V,KAAK0uB,MAAQ20C,EAEE,SAAfhrC,EACF8H,EAAY,QACY,WAAf9H,GACT8H,EAAY,SACZzqB,GAAMkqD,EAAS,IAEfz/B,EAAY,OACZzqB,EAAI1V,KAAKyuB,OAGS,UAAb8gC,EACL13B,GACFniB,EAAI1V,KAAKyuB,KAAO6F,EAEG,SAAf+D,EACF8H,EAAY,QACY,WAAf9H,GACT8H,EAAY,SACZzqB,GAAMkqD,EAAS,IAEfz/B,EAAY,OACZzqB,GAAKkqD,KAGPlqD,EAAI1V,KAAKyuB,KAAO40C,EAEG,SAAfhrC,EACF8H,EAAY,OACY,WAAf9H,GACT8H,EAAY,SACZzqB,GAAKkqD,EAAS,IAEdz/B,EAAY,QACZzqB,EAAI1V,KAAK0uB,QAIbyR,EAAY,QAGP,CAACA,YAAWzqB,IACrB,CAKAouD,iBAAAA,GACE,GAAI9jE,KAAK8N,QAAQ4nB,MAAMmC,OACrB,OAGF,MAAMlC,EAAQ31B,KAAK21B,MACb45B,EAAWvvD,KAAK8N,QAAQyhD,SAE9B,MAAiB,SAAbA,GAAoC,UAAbA,EAClB,CAACh7B,IAAK,EAAG9F,KAAMzuB,KAAKyuB,KAAM+F,OAAQmB,EAAM4H,OAAQ7O,MAAO1uB,KAAK0uB,OAClD,QAAb6gC,GAAmC,WAAbA,EACnB,CAACh7B,IAAKv0B,KAAKu0B,IAAK9F,KAAM,EAAG+F,OAAQx0B,KAAKw0B,OAAQ9F,MAAOiH,EAAM11B,YADlE,CAGJ,CAKA8jE,cAAAA,GACE,MAAM,IAAC7pC,EAAKpsB,SAAS,gBAACsrB,GAAgB,KAAE3K,EAAI,IAAE8F,EAAA,MAAKt0B,EAAA,OAAOs9B,GAAUv9B,KAChEo5B,IACFc,EAAIsC,OACJtC,EAAIgG,UAAY9G,EAChBc,EAAIiH,SAAS1S,EAAM8F,EAAKt0B,EAAOs9B,GAC/BrD,EAAI0C,UAER,CAEAkrB,oBAAAA,CAAqBhjD,GACnB,MAAMkyB,EAAOh3B,KAAK8N,QAAQkpB,KAC1B,IAAKh3B,KAAKw/D,eAAiBxoC,EAAKN,QAC9B,OAAO,EAET,MAAMhB,EAAQ11B,KAAK01B,MACbh3B,EAAQg3B,EAAM5F,UAAUtO,GAAKA,EAAE1c,QAAUA,GAC/C,GAAIpG,GAAS,EAAG,CACd,MAAMshC,EAAOhJ,EAAK2O,WAAW3lC,KAAKo9B,WAAW1+B,IAC7C,OAAOshC,EAAK/I,S,CAEd,OAAO,CACT,CAKA+sC,QAAAA,CAAShxB,GACP,MAAMhc,EAAOh3B,KAAK8N,QAAQkpB,KACpBkD,EAAMl6B,KAAKk6B,IACX1M,EAAQxtB,KAAKu8D,iBAAmBv8D,KAAKu8D,eAAiBv8D,KAAK8hE,sBAAsB9uB,IACvF,IAAIx+B,EAAG8Q,EAEP,MAAM2+C,EAAWA,CAAC5uD,EAAIC,EAAIjX,KACnBA,EAAM4B,OAAU5B,EAAMqkB,QAG3BwX,EAAIsC,OACJtC,EAAIjD,UAAY54B,EAAM4B,MACtBi6B,EAAI6G,YAAc1iC,EAAMqkB,MACxBwX,EAAIgqC,YAAY7lE,EAAMs0C,YAAc,IACpCzY,EAAI8xB,eAAiB3tD,EAAMu0C,iBAE3B1Y,EAAImE,YACJnE,EAAIuE,OAAOppB,EAAGK,EAAGL,EAAGsR,GACpBuT,EAAIwE,OAAOppB,EAAGI,EAAGJ,EAAGqR,GACpBuT,EAAI6E,SACJ7E,EAAI0C,YAGN,GAAI5F,EAAKN,QACP,IAAKliB,EAAI,EAAG8Q,EAAOkI,EAAM9mB,OAAQ8N,EAAI8Q,IAAQ9Q,EAAG,CAC9C,MAAMhW,EAAOgvB,EAAMhZ,GAEfwiB,EAAKE,iBACP+sC,EACE,CAACvuD,EAAGlX,EAAKkkE,GAAI/7C,EAAGnoB,EAAKmkE,IACrB,CAACjtD,EAAGlX,EAAKokE,GAAIj8C,EAAGnoB,EAAKqkE,IACrBrkE,GAIAw4B,EAAKG,WACP8sC,EACE,CAACvuD,EAAGlX,EAAK8jE,IAAK37C,EAAGnoB,EAAK+jE,KACtB,CAAC7sD,EAAGlX,EAAKgkE,IAAK77C,EAAGnoB,EAAKikE,KACtB,CACE//C,MAAOlkB,EAAK84B,UACZr3B,MAAOzB,EAAK64B,UACZsb,WAAYn0C,EAAK2kE,eACjBvwB,iBAAkBp0C,EAAK4kE,sBAI/B,CAEJ,CAKAe,UAAAA,GACE,MAAM,MAACxuC,EAAA,IAAOuE,EAAKpsB,SAAS,OAACypB,EAAM,KAAEP,IAASh3B,KACxCgiE,EAAazqC,EAAOoO,WAAW3lC,KAAKo9B,cACpC6kC,EAAY1qC,EAAOb,QAAUsrC,EAAW/hE,MAAQ,EACtD,IAAKgiE,EACH,OAEF,MAAMmC,EAAgBptC,EAAK2O,WAAW3lC,KAAKo9B,WAAW,IAAInG,UACpDmrC,EAAcpiE,KAAKg9D,aACzB,IAAI0F,EAAIE,EAAID,EAAIE,EAEZ7iE,KAAK4kD,gBACP8d,EAAK5lC,GAAYnH,EAAO31B,KAAKyuB,KAAMwzC,GAAaA,EAAY,EAC5DW,EAAK9lC,GAAYnH,EAAO31B,KAAK0uB,MAAO01C,GAAiBA,EAAgB,EACrEzB,EAAKE,EAAKT,IAEVO,EAAK7lC,GAAYnH,EAAO31B,KAAKu0B,IAAK0tC,GAAaA,EAAY,EAC3DY,EAAK/lC,GAAYnH,EAAO31B,KAAKw0B,OAAQ4vC,GAAiBA,EAAgB,EACtE1B,EAAKE,EAAKR,GAEZloC,EAAIsC,OACJtC,EAAIjD,UAAY+qC,EAAW/hE,MAC3Bi6B,EAAI6G,YAAcihC,EAAWt/C,MAE7BwX,EAAImE,YACJnE,EAAIuE,OAAOikC,EAAIC,GACfzoC,EAAIwE,OAAOkkC,EAAIC,GACf3oC,EAAI6E,SAEJ7E,EAAI0C,SACN,CAKAynC,UAAAA,CAAWrxB,GACT,MAAM4uB,EAAc5hE,KAAK8N,QAAQ4nB,MAEjC,IAAKksC,EAAYlrC,QACf,OAGF,MAAMwD,EAAMl6B,KAAKk6B,IAEX+E,EAAOj/B,KAAK8jE,oBACd7kC,GACFE,GAASjF,EAAK+E,GAGhB,MAAMzR,EAAQxtB,KAAKw9D,cAAcxqB,GACjC,IAAK,MAAMx0C,KAAQgvB,EAAO,CACxB,MAAM82C,EAAoB9lE,EAAKsP,QACzBmzD,EAAWziE,EAAKq7B,KAChBvsB,EAAQ9O,EAAK8O,MACbqZ,EAAInoB,EAAKglE,WACfpiC,GAAWlH,EAAK5sB,EAAO,EAAGqZ,EAAGs6C,EAAUqD,EACzC,CAEIrlC,GACFG,GAAWlF,EAEf,CAKAqqC,SAAAA,GACE,MAAM,IAACrqC,EAAKpsB,SAAS,SAACyhD,EAAQ,MAAE/hD,EAAK,QAAE0X,IAAYllB,KAEnD,IAAKwN,EAAMkpB,QACT,OAGF,MAAMmD,EAAOgJ,GAAOr1B,EAAMqsB,MACpBvF,EAAUsO,GAAUp1B,EAAM8mB,SAC1BhG,EAAQ9gB,EAAM8gB,MACpB,IAAIqI,EAASkD,EAAKE,WAAa,EAEd,WAAbw1B,GAAsC,WAAbA,GAAyBtrC,GAASsrC,IAC7D54B,GAAUrC,EAAQE,OACd5f,GAAQpH,EAAMkqB,QAChBf,GAAUkD,EAAKE,YAAcvsB,EAAMkqB,KAAKhxB,OAAS,KAGnDiwB,GAAUrC,EAAQC,IAGpB,MAAM,OAACqnC,EAAA,OAAQC,EAAA,SAAQn6B,EAAQ,SAAE1D,GAAY29B,GAAU37D,KAAM22B,EAAQ44B,EAAUjhC,GAE/E8S,GAAWlH,EAAK1sB,EAAMkqB,KAAM,EAAG,EAAGmC,EAAM,CACtCnX,MAAOlV,EAAMkV,MACbgf,WACA1D,WACAmC,UAAWu7B,GAAWptC,EAAOihC,EAAUrqC,GACvCkb,aAAc,SACdH,YAAa,CAAC27B,EAAQC,IAE1B,CAEAxnB,IAAAA,CAAKrB,GACEhzC,KAAKw/D,eAIVx/D,KAAK+jE,iBACL/jE,KAAKgkE,SAAShxB,GACdhzC,KAAKmkE,aACLnkE,KAAKukE,YACLvkE,KAAKqkE,WAAWrxB,GAClB,CAMAohB,OAAAA,GACE,MAAMp0B,EAAOhgC,KAAK8N,QACZ02D,EAAKxkC,EAAKtK,OAASsK,EAAKtK,MAAM2+B,GAAK,EACnCoQ,EAAKngD,GAAe0b,EAAKhJ,MAAQgJ,EAAKhJ,KAAKq9B,GAAI,GAC/CqQ,EAAKpgD,GAAe0b,EAAKzI,QAAUyI,EAAKzI,OAAO88B,EAAG,GAExD,OAAKr0D,KAAKw/D,cAAgBx/D,KAAKq0C,OAAS0nB,GAAMl4C,UAAUwwB,KAUjD,CAAC,CACNggB,EAAGoQ,EACHpwB,KAAOrB,IACLhzC,KAAK+jE,iBACL/jE,KAAKgkE,SAAShxB,GACdhzC,KAAKukE,cAEN,CACDlQ,EAAGqQ,EACHrwB,KAAMA,KACJr0C,KAAKmkE,eAEN,CACD9P,EAAGmQ,EACHnwB,KAAOrB,IACLhzC,KAAKqkE,WAAWrxB,MAvBX,CAAC,CACNqhB,EAAGmQ,EACHnwB,KAAOrB,IACLhzC,KAAKq0C,KAAKrB,KAuBlB,CAOA4G,uBAAAA,CAAwBt6C,GACtB,MAAM89D,EAAQp9D,KAAK21B,MAAM65B,+BACnBtH,EAASloD,KAAKwvB,KAAO,SACrBxG,EAAS,GACf,IAAIxU,EAAG8Q,EAEP,IAAK9Q,EAAI,EAAG8Q,EAAO83C,EAAM12D,OAAQ8N,EAAI8Q,IAAQ9Q,EAAG,CAC9C,MAAMsa,EAAOsuC,EAAM5oD,GACfsa,EAAKo5B,KAAYloD,KAAK+Q,IAAQzR,GAAQwvB,EAAKxvB,OAASA,GACtD0pB,EAAOhC,KAAK8H,EAEhB,CACA,OAAO9F,CACT,CAOAs4C,uBAAAA,CAAwB5iE,GACtB,MAAMshC,EAAOhgC,KAAK8N,QAAQ4nB,MAAMiQ,WAAW3lC,KAAKo9B,WAAW1+B,IAC3D,OAAOmkC,GAAO7C,EAAKnG,KACrB,CAKA8qC,UAAAA,GACE,MAAMC,EAAW5kE,KAAKshE,wBAAwB,GAAGvnC,WACjD,OAAQ/5B,KAAK4kD,eAAiB5kD,KAAKC,MAAQD,KAAKu9B,QAAUqnC,CAC5D,ECrqDa,MAAMC,GACnBziD,WAAAA,CAAY9iB,EAAM05B,EAAOmC,GACvBn7B,KAAKV,KAAOA,EACZU,KAAKg5B,MAAQA,EACbh5B,KAAKm7B,SAAWA,EAChBn7B,KAAKwtB,MAAQxf,OAAO4X,OAAO,KAC7B,CAEAk/C,SAAAA,CAAUxlE,GACR,OAAO0O,OAAO6V,UAAUkhD,cAAchhD,KAAK/jB,KAAKV,KAAKukB,UAAWvkB,EAAKukB,UACvE,CAMAmhD,QAAAA,CAASxmE,GACP,MAAMqjB,EAAQ7T,OAAO82B,eAAetmC,GACpC,IAAIymE,EAEAC,GAAkBrjD,KAEpBojD,EAAcjlE,KAAKglE,SAASnjD,IAG9B,MAAM2L,EAAQxtB,KAAKwtB,MACbzc,EAAKvS,EAAKuS,GACVioB,EAAQh5B,KAAKg5B,MAAQ,IAAMjoB,EAEjC,IAAKA,EACH,MAAM,IAAI21B,MAAM,2BAA6BloC,GAG/C,OAAIuS,KAAMyc,IAKVA,EAAMzc,GAAMvS,EACZ2mE,GAAiB3mE,EAAMw6B,EAAOisC,GAC1BjlE,KAAKm7B,UACP9H,GAAS8H,SAAS38B,EAAKuS,GAAIvS,EAAKm6B,YANzBK,CAUX,CAMA/D,GAAAA,CAAIlkB,GACF,OAAO/Q,KAAKwtB,MAAMzc,EACpB,CAKAq0D,UAAAA,CAAW5mE,GACT,MAAMgvB,EAAQxtB,KAAKwtB,MACbzc,EAAKvS,EAAKuS,GACVioB,EAAQh5B,KAAKg5B,MAEfjoB,KAAMyc,UACDA,EAAMzc,GAGXioB,GAASjoB,KAAMsiB,GAAS2F,YACnB3F,GAAS2F,GAAOjoB,GACnB/Q,KAAKm7B,iBACAxC,GAAU5nB,GAGvB,EAGF,SAASo0D,GAAiB3mE,EAAMw6B,EAAOisC,GAErC,MAAMI,EAAel/C,GAAMnY,OAAO4X,OAAO,MAAO,CAC9Cq/C,EAAc5xC,GAAS4B,IAAIgwC,GAAe,CAAC,EAC3C5xC,GAAS4B,IAAI+D,GACbx6B,EAAK60B,WAGPA,GAAS5F,IAAIuL,EAAOqsC,GAEhB7mE,EAAK8mE,eACPC,GAAcvsC,EAAOx6B,EAAK8mE,eAGxB9mE,EAAKo6B,aACPvF,GAASG,SAASwF,EAAOx6B,EAAKo6B,YAElC,CAEA,SAAS2sC,GAAcvsC,EAAOwsC,GAC5Bx3D,OAAOC,KAAKu3D,GAAQz4C,QAAQlD,IAC1B,MAAM47C,EAAgB57C,EAAS/C,MAAM,KAC/B4+C,EAAaD,EAAct8C,MAC3Bw8C,EAAc,CAAC3sC,GAAO8pB,OAAO2iB,GAAe9+B,KAAK,KACjD9f,EAAQ2+C,EAAO37C,GAAU/C,MAAM,KAC/BuU,EAAaxU,EAAMsC,MACnBiS,EAAcvU,EAAM8f,KAAK,KAC/BtT,GAASoF,MAAMktC,EAAaD,EAAYtqC,EAAaC,IAEzD,CAEA,SAAS6pC,GAAkBrjD,GACzB,MAAO,OAAQA,GAAS,aAAcA,CACxC,CC1GO,MAAM+jD,GACXxjD,WAAAA,GACEpiB,KAAK6lE,YAAc,IAAIhB,GAActpB,GAAmB,YAAY,GACpEv7C,KAAK25B,SAAW,IAAIkrC,GAAc/L,GAAS,YAC3C94D,KAAK66B,QAAU,IAAIgqC,GAAc72D,OAAQ,WACzChO,KAAKg7B,OAAS,IAAI6pC,GAAc9I,GAAO,UAGvC/7D,KAAK8lE,iBAAmB,CAAC9lE,KAAK6lE,YAAa7lE,KAAKg7B,OAAQh7B,KAAK25B,SAC/D,CAKAr4B,GAAAA,IAAOpC,GACLc,KAAK+lE,MAAM,WAAY7mE,EACzB,CAEAgC,MAAAA,IAAUhC,GACRc,KAAK+lE,MAAM,aAAc7mE,EAC3B,CAKA8mE,cAAAA,IAAkB9mE,GAChBc,KAAK+lE,MAAM,WAAY7mE,EAAMc,KAAK6lE,YACpC,CAKArpB,WAAAA,IAAet9C,GACbc,KAAK+lE,MAAM,WAAY7mE,EAAMc,KAAK25B,SACpC,CAKAssC,UAAAA,IAAc/mE,GACZc,KAAK+lE,MAAM,WAAY7mE,EAAMc,KAAK66B,QACpC,CAKAqrC,SAAAA,IAAahnE,GACXc,KAAK+lE,MAAM,WAAY7mE,EAAMc,KAAKg7B,OACpC,CAMAmrC,aAAAA,CAAcp1D,GACZ,OAAO/Q,KAAKomE,KAAKr1D,EAAI/Q,KAAK6lE,YAAa,aACzC,CAMAvX,UAAAA,CAAWv9C,GACT,OAAO/Q,KAAKomE,KAAKr1D,EAAI/Q,KAAK25B,SAAU,UACtC,CAMA0sC,SAAAA,CAAUt1D,GACR,OAAO/Q,KAAKomE,KAAKr1D,EAAI/Q,KAAK66B,QAAS,SACrC,CAMAyrC,QAAAA,CAASv1D,GACP,OAAO/Q,KAAKomE,KAAKr1D,EAAI/Q,KAAKg7B,OAAQ,QACpC,CAKAurC,iBAAAA,IAAqBrnE,GACnBc,KAAK+lE,MAAM,aAAc7mE,EAAMc,KAAK6lE,YACtC,CAKAW,cAAAA,IAAkBtnE,GAChBc,KAAK+lE,MAAM,aAAc7mE,EAAMc,KAAK25B,SACtC,CAKA8sC,aAAAA,IAAiBvnE,GACfc,KAAK+lE,MAAM,aAAc7mE,EAAMc,KAAK66B,QACtC,CAKA6rC,YAAAA,IAAgBxnE,GACdc,KAAK+lE,MAAM,aAAc7mE,EAAMc,KAAKg7B,OACtC,CAKA+qC,KAAAA,CAAM/4C,EAAQ9tB,EAAMynE,GAClB,IAAIznE,GAAM6tB,QAAQ65C,IAChB,MAAMC,EAAMF,GAAiB3mE,KAAK8mE,oBAAoBF,GAClDD,GAAiBE,EAAI/B,UAAU8B,IAASC,IAAQ7mE,KAAK66B,SAAW+rC,EAAI71D,GACtE/Q,KAAK+mE,MAAM/5C,EAAQ65C,EAAKD,GAMxB5hD,GAAK4hD,EAAKpoE,IAOR,MAAMwoE,EAAUL,GAAiB3mE,KAAK8mE,oBAAoBtoE,GAC1DwB,KAAK+mE,MAAM/5C,EAAQg6C,EAASxoE,MAIpC,CAKAuoE,KAAAA,CAAM/5C,EAAQqhC,EAAU4Y,GACtB,MAAMC,EAAc9/C,GAAY4F,GAChCpI,GAAKqiD,EAAU,SAAWC,GAAc,GAAID,GAC5C5Y,EAASrhC,GAAQi6C,GACjBriD,GAAKqiD,EAAU,QAAUC,GAAc,GAAID,EAC7C,CAKAH,mBAAAA,CAAoBxnE,GAClB,IAAK,IAAIkV,EAAI,EAAGA,EAAIxU,KAAK8lE,iBAAiBp/D,OAAQ8N,IAAK,CACrD,MAAMqyD,EAAM7mE,KAAK8lE,iBAAiBtxD,GAClC,GAAIqyD,EAAI/B,UAAUxlE,GAChB,OAAOunE,CAEX,CAEA,OAAO7mE,KAAK66B,OACd,CAKAurC,IAAAA,CAAKr1D,EAAI41D,EAAernE,GACtB,MAAMd,EAAOmoE,EAAc1xC,IAAIlkB,GAC/B,QAAa+C,IAATtV,EACF,MAAM,IAAIkoC,MAAM,IAAM31B,EAAK,yBAA2BzR,EAAO,KAE/D,OAAOd,CACT,EAKF,IAAA6vD,GAA+B,IAAIuX,GCtKpB,MAAMuB,GACnB/kD,WAAAA,GACEpiB,KAAKonE,WAAQtzD,CACf,CAYAuzD,MAAAA,CAAO1xC,EAAO2xC,EAAMpoE,EAAM6nC,GAMxB,GALa,eAATugC,IACFtnE,KAAKonE,MAAQpnE,KAAKunE,mBAAmB5xC,GAAO,GAC5C31B,KAAK0zC,QAAQ1zC,KAAKonE,MAAOzxC,EAAO,iBAGf7hB,IAAf9T,KAAKonE,MACP,OAGF,MAAMxuC,EAAcmO,EAAS/mC,KAAKk5B,aAAavD,GAAOoR,OAAOA,GAAU/mC,KAAKk5B,aAAavD,GACnF3M,EAAShpB,KAAK0zC,QAAQ9a,EAAajD,EAAO2xC,EAAMpoE,GAOtD,MALa,iBAATooE,IACFtnE,KAAK0zC,QAAQ9a,EAAajD,EAAO,QACjC31B,KAAK0zC,QAAQ1zC,KAAKonE,MAAOzxC,EAAO,aAChC31B,KAAKonE,WAAQtzD,GAERkV,CACT,CAKA0qB,OAAAA,CAAQ9a,EAAajD,EAAO2xC,EAAMpoE,GAChCA,EAAOA,GAAQ,CAAC,EAChB,IAAK,MAAMsoE,KAAc5uC,EAAa,CACpC,MAAM6uC,EAASD,EAAWC,OACpBz6C,EAASy6C,EAAOH,GAChBxV,EAAS,CAACn8B,EAAOz2B,EAAMsoE,EAAW15D,SACxC,IAA6C,IAAzC8W,GAAaoI,EAAQ8kC,EAAQ2V,IAAqBvoE,EAAKwoE,WACzD,OAAO,CAEX,CAEA,OAAO,CACT,CAEAC,UAAAA,GAMO/jD,GAAc5jB,KAAKnC,UACtBmC,KAAK4nE,UAAY5nE,KAAKnC,OACtBmC,KAAKnC,YAASiW,EAElB,CAMAolB,YAAAA,CAAavD,GACX,GAAI31B,KAAKnC,OACP,OAAOmC,KAAKnC,OAGd,MAAM+6B,EAAc54B,KAAKnC,OAASmC,KAAKunE,mBAAmB5xC,GAI1D,OAFA31B,KAAK6nE,oBAAoBlyC,GAElBiD,CACT,CAEA2uC,kBAAAA,CAAmB5xC,EAAOiiB,GACxB,MAAMhB,EAASjhB,GAASA,EAAMihB,OACxB9oC,EAAUwW,GAAesyB,EAAO9oC,SAAW8oC,EAAO9oC,QAAQ+sB,QAAS,CAAC,GACpEA,EAAUitC,GAAWlxB,GAE3B,OAAmB,IAAZ9oC,GAAsB8pC,EAAWmwB,GAAkBpyC,EAAOkF,EAAS/sB,EAAS8pC,GAAhD,EACrC,CAMAiwB,mBAAAA,CAAoBlyC,GAClB,MAAMqyC,EAAsBhoE,KAAK4nE,WAAa,GACxChvC,EAAc54B,KAAKnC,OACnB+wD,EAAOA,CAACj8C,EAAGC,IAAMD,EAAEo0B,OAAOrxB,IAAM9C,EAAEq1D,KAAKthD,GAAKjR,EAAE+xD,OAAO12D,KAAO4V,EAAE8gD,OAAO12D,KAC3E/Q,KAAK0zC,QAAQkb,EAAKoZ,EAAqBpvC,GAAcjD,EAAO,QAC5D31B,KAAK0zC,QAAQkb,EAAKh2B,EAAaovC,GAAsBryC,EAAO,QAC9D,EAMF,SAASmyC,GAAWlxB,GAClB,MAAMsxB,EAAW,CAAC,EACZrtC,EAAU,GACV5sB,EAAOD,OAAOC,KAAKogD,GAASxzB,QAAQrN,OAC1C,IAAK,IAAIhZ,EAAI,EAAGA,EAAIvG,EAAKvH,OAAQ8N,IAC/BqmB,EAAQ7T,KAAKqnC,GAASgY,UAAUp4D,EAAKuG,KAGvC,MAAMmnB,EAAQib,EAAO/b,SAAW,GAChC,IAAK,IAAIrmB,EAAI,EAAGA,EAAImnB,EAAMj1B,OAAQ8N,IAAK,CACrC,MAAMizD,EAAS9rC,EAAMnnB,IAEY,IAA7BqmB,EAAQ9U,QAAQ0hD,KAClB5sC,EAAQ7T,KAAKygD,GACbS,EAAST,EAAO12D,KAAM,EAE1B,CAEA,MAAO,CAAC8pB,UAASqtC,WACnB,CAEA,SAASC,GAAQr6D,EAAS8pC,GACxB,OAAKA,IAAmB,IAAZ9pC,GAGI,IAAZA,EACK,CAAC,EAEHA,EALE,IAMX,CAEA,SAASi6D,GAAkBpyC,GAAO,QAACkF,EAAO,SAAEqtC,GAAWp6D,EAAS8pC,GAC9D,MAAM5uB,EAAS,GACTwQ,EAAU7D,EAAMyH,aAEtB,IAAK,MAAMqqC,KAAU5sC,EAAS,CAC5B,MAAM9pB,EAAK02D,EAAO12D,GACZivB,EAAOmoC,GAAQr6D,EAAQiD,GAAK6mC,GACrB,OAAT5X,GAGJhX,EAAOhC,KAAK,CACVygD,SACA35D,QAASs6D,GAAWzyC,EAAMihB,OAAQ,CAAC6wB,SAAQ9rC,MAAOusC,EAASn3D,IAAMivB,EAAMxG,IAE3E,CAEA,OAAOxQ,CACT,CAEA,SAASo/C,GAAWxxB,GAAQ,OAAC6wB,EAAM,MAAE9rC,GAAQqE,EAAMxG,GACjD,MAAMvrB,EAAO2oC,EAAOyxB,gBAAgBZ,GAC9B7jC,EAASgT,EAAO2H,gBAAgBve,EAAM/xB,GAK5C,OAJI0tB,GAAS8rC,EAAOp0C,UAElBuQ,EAAO5c,KAAKygD,EAAOp0C,UAEdujB,EAAO4H,eAAe5a,EAAQpK,EAAS,CAAC,IAAK,CAElDuM,YAAY,EACZC,WAAW,EACXF,SAAS,GAEb,CCvLO,SAASwiC,GAAahpE,EAAMwO,GACjC,MAAMy6D,EAAkBl1C,GAASiG,SAASh6B,IAAS,CAAC,EAC9CkpE,GAAkB16D,EAAQwrB,UAAY,CAAC,GAAGh6B,IAAS,CAAC,EAC1D,OAAOkpE,EAAenuC,WAAavsB,EAAQusB,WAAakuC,EAAgBluC,WAAa,GACvF,CAEA,SAASouC,GAA0B13D,EAAIspB,GACrC,IAAI7K,EAAOze,EAMX,MALW,YAAPA,EACFye,EAAO6K,EACS,YAAPtpB,IACTye,EAAqB,MAAd6K,EAAoB,IAAM,KAE5B7K,CACT,CAEA,SAASk5C,GAA0Bl5C,EAAM6K,GACvC,OAAO7K,IAAS6K,EAAY,UAAY,SAC1C,CAEA,SAASsuC,GAAc53D,GACrB,GAAW,MAAPA,GAAqB,MAAPA,GAAqB,MAAPA,EAC9B,OAAOA,CAEX,CAEA,SAAS63D,GAAiBrZ,GACxB,MAAiB,QAAbA,GAAmC,WAAbA,EACjB,IAEQ,SAAbA,GAAoC,UAAbA,EAClB,SADT,CAGF,CAEO,SAASsZ,GAAc93D,KAAO+3D,GACnC,GAAIH,GAAc53D,GAChB,OAAOA,EAET,IAAK,MAAMivB,KAAQ8oC,EAAc,CAC/B,MAAMt5C,EAAOwQ,EAAKxQ,MACbo5C,GAAiB5oC,EAAKuvB,WACtBx+C,EAAGrK,OAAS,GAAKiiE,GAAc53D,EAAG,GAAGgQ,eAC1C,GAAIyO,EACF,OAAOA,CAEX,CACA,MAAM,IAAIkX,MAAM,6BAA6B31B,uDAC/C,CAEA,SAASg4D,GAAmBh4D,EAAIye,EAAMD,GACpC,GAAIA,EAAQC,EAAO,YAAcze,EAC/B,MAAO,CAACye,OAEZ,CAEA,SAASw5C,GAAyBj4D,EAAI6lC,GACpC,GAAIA,EAAOl3C,MAAQk3C,EAAOl3C,KAAK45B,SAAU,CACvC,MAAM2vC,EAAUryB,EAAOl3C,KAAK45B,SAASyN,OAAQj0B,GAAMA,EAAEgqC,UAAY/rC,GAAM+B,EAAEkqC,UAAYjsC,GACrF,GAAIk4D,EAAQviE,OACV,OAAOqiE,GAAmBh4D,EAAI,IAAKk4D,EAAQ,KAAOF,GAAmBh4D,EAAI,IAAKk4D,EAAQ,G,CAG1F,MAAO,CAAC,CACV,CAEA,SAASC,GAAiBtyB,EAAQ9oC,GAChC,MAAMq7D,EAAgBxwC,GAAUie,EAAOt3C,OAAS,CAAC07B,OAAQ,CAAC,GACpDouC,EAAet7D,EAAQktB,QAAU,CAAC,EAClCquC,EAAiBf,GAAa1xB,EAAOt3C,KAAMwO,GAC3CktB,EAAShtB,OAAO4X,OAAO,MAqC7B,OAlCA5X,OAAOC,KAAKm7D,GAAcr8C,QAAQhc,IAChC,MAAMu4D,EAAYF,EAAar4D,GAC/B,IAAKkT,GAASqlD,GACZ,OAAOvmC,QAAQwmC,MAAM,0CAA0Cx4D,KAEjE,GAAIu4D,EAAU/jC,OACZ,OAAOxC,QAAQC,KAAK,kDAAkDjyB,KAExE,MAAMye,EAAOq5C,GAAc93D,EAAIu4D,EAAWN,GAAyBj4D,EAAI6lC,GAASvjB,GAAS2H,OAAOsuC,EAAUhqE,OACpGkqE,EAAYd,GAA0Bl5C,EAAM65C,GAC5CI,EAAsBN,EAAcnuC,QAAU,CAAC,EACrDA,EAAOjqB,GAAMuV,GAAQtY,OAAO4X,OAAO,MAAO,CAAC,CAAC4J,QAAO85C,EAAWG,EAAoBj6C,GAAOi6C,EAAoBD,OAI/G5yB,EAAOl3C,KAAK45B,SAASvM,QAAQwC,IAC3B,MAAMjwB,EAAOiwB,EAAQjwB,MAAQs3C,EAAOt3C,KAC9B+6B,EAAY9K,EAAQ8K,WAAaiuC,GAAahpE,EAAMwO,GACpDy6D,EAAkB5vC,GAAUr5B,IAAS,CAAC,EACtCmqE,EAAsBlB,EAAgBvtC,QAAU,CAAC,EACvDhtB,OAAOC,KAAKw7D,GAAqB18C,QAAQ28C,IACvC,MAAMl6C,EAAOi5C,GAA0BiB,EAAWrvC,GAC5CtpB,EAAKwe,EAAQC,EAAO,WAAaA,EACvCwL,EAAOjqB,GAAMiqB,EAAOjqB,IAAO/C,OAAO4X,OAAO,MACzCU,GAAQ0U,EAAOjqB,GAAK,CAAC,CAACye,QAAO45C,EAAar4D,GAAK04D,EAAoBC,SAKvE17D,OAAOC,KAAK+sB,GAAQjO,QAAQtuB,IAC1B,MAAMs8B,EAAQC,EAAOv8B,GACrB6nB,GAAQyU,EAAO,CAAC1H,GAAS2H,OAAOD,EAAMz7B,MAAO+zB,GAAS0H,UAGjDC,CACT,CAEA,SAAS2uC,GAAY/yB,GACnB,MAAM9oC,EAAU8oC,EAAO9oC,UAAY8oC,EAAO9oC,QAAU,CAAC,GAErDA,EAAQ+sB,QAAUvW,GAAexW,EAAQ+sB,QAAS,CAAC,GACnD/sB,EAAQktB,OAASkuC,GAAiBtyB,EAAQ9oC,EAC5C,CAEA,SAAS87D,GAASlqE,GAIhB,OAHAA,EAAOA,GAAQ,CAAC,EAChBA,EAAK45B,SAAW55B,EAAK45B,UAAY,GACjC55B,EAAKo/C,OAASp/C,EAAKo/C,QAAU,GACtBp/C,CACT,CAEA,SAASmqE,GAAWjzB,GAMlB,OALAA,EAASA,GAAU,CAAC,EACpBA,EAAOl3C,KAAOkqE,GAAShzB,EAAOl3C,MAE9BiqE,GAAY/yB,GAELA,CACT,CAEA,MAAMkzB,GAAW,IAAIp1C,IACfq1C,GAAa,IAAIr8C,IAEvB,SAASs8C,GAAWn1C,EAAUo1C,GAC5B,IAAIh8D,EAAO67D,GAAS70C,IAAIJ,GAMxB,OALK5mB,IACHA,EAAOg8D,IACPH,GAASr8C,IAAIoH,EAAU5mB,GACvB87D,GAAWzoE,IAAI2M,IAEVA,CACT,CAEA,MAAMi8D,GAAaA,CAACz8C,EAAKjL,EAAK/jB,KAC5B,MAAMuhC,EAAO9Y,GAAiB1E,EAAK/jB,QACtBqV,IAATksB,GACFvS,EAAInsB,IAAI0+B,IAIG,MAAMmqC,GACnB/nD,WAAAA,CAAYw0B,GACV52C,KAAKoqE,QAAUP,GAAWjzB,GAC1B52C,KAAKqqE,YAAc,IAAI31C,IACvB10B,KAAKsqE,eAAiB,IAAI51C,GAC5B,CAEA,YAAI+E,GACF,OAAOz5B,KAAKoqE,QAAQ3wC,QACtB,CAEA,QAAIn6B,GACF,OAAOU,KAAKoqE,QAAQ9qE,IACtB,CAEA,QAAIA,CAAKA,GACPU,KAAKoqE,QAAQ9qE,KAAOA,CACtB,CAEA,QAAII,GACF,OAAOM,KAAKoqE,QAAQ1qE,IACtB,CAEA,QAAIA,CAAKA,GACPM,KAAKoqE,QAAQ1qE,KAAOkqE,GAASlqE,EAC/B,CAEA,WAAIoO,GACF,OAAO9N,KAAKoqE,QAAQt8D,OACtB,CAEA,WAAIA,CAAQA,GACV9N,KAAKoqE,QAAQt8D,QAAUA,CACzB,CAEA,WAAI+sB,GACF,OAAO76B,KAAKoqE,QAAQvvC,OACtB,CAEAub,MAAAA,GACE,MAAMQ,EAAS52C,KAAKoqE,QACpBpqE,KAAKuqE,aACLZ,GAAY/yB,EACd,CAEA2zB,UAAAA,GACEvqE,KAAKqqE,YAAYG,QACjBxqE,KAAKsqE,eAAeE,OACtB,CAQAlsB,gBAAAA,CAAiBmsB,GACf,OAAOT,GAAWS,EAChB,IAAM,CAAC,CACL,YAAYA,IACZ,KAEN,CASA/pB,yBAAAA,CAA0B+pB,EAAa3pE,GACrC,OAAOkpE,GAAW,GAAGS,gBAA0B3pE,IAC7C,IAAM,CACJ,CACE,YAAY2pE,iBAA2B3pE,IACvC,eAAeA,KAGjB,CACE,YAAY2pE,IACZ,KAGR,CAUAnqB,uBAAAA,CAAwBmqB,EAAarqB,GACnC,OAAO4pB,GAAW,GAAGS,KAAerqB,IAClC,IAAM,CAAC,CACL,YAAYqqB,cAAwBrqB,IACpC,YAAYqqB,IACZ,YAAYrqB,IACZ,KAEN,CAOAioB,eAAAA,CAAgBZ,GACd,MAAM12D,EAAK02D,EAAO12D,GACZzR,EAAOU,KAAKV,KAClB,OAAO0qE,GAAW,GAAG1qE,YAAeyR,IAClC,IAAM,CAAC,CACL,WAAWA,OACR02D,EAAOiD,wBAA0B,KAE1C,CAKAC,aAAAA,CAAcC,EAAWC,GACvB,MAAMR,EAAcrqE,KAAKqqE,YACzB,IAAI/tC,EAAQ+tC,EAAYp1C,IAAI21C,GAK5B,OAJKtuC,IAASuuC,IACZvuC,EAAQ,IAAI5H,IACZ21C,EAAY58C,IAAIm9C,EAAWtuC,IAEtBA,CACT,CAQAiiB,eAAAA,CAAgBqsB,EAAWE,EAAUD,GACnC,MAAM,QAAC/8D,EAAO,KAAExO,GAAQU,KAClBs8B,EAAQt8B,KAAK2qE,cAAcC,EAAWC,GACtC5vB,EAAS3e,EAAMrH,IAAI61C,GACzB,GAAI7vB,EACF,OAAOA,EAGT,MAAMrX,EAAS,IAAIlW,IAEnBo9C,EAAS/9C,QAAQ9e,IACX28D,IACFhnC,EAAOtiC,IAAIspE,GACX38D,EAAK8e,QAAQtuB,GAAOyrE,GAAWtmC,EAAQgnC,EAAWnsE,KAEpDwP,EAAK8e,QAAQtuB,GAAOyrE,GAAWtmC,EAAQ91B,EAASrP,IAChDwP,EAAK8e,QAAQtuB,GAAOyrE,GAAWtmC,EAAQjL,GAAUr5B,IAAS,CAAC,EAAGb,IAC9DwP,EAAK8e,QAAQtuB,GAAOyrE,GAAWtmC,EAAQvQ,GAAU50B,IACjDwP,EAAK8e,QAAQtuB,GAAOyrE,GAAWtmC,EAAQhL,GAAan6B,MAGtD,MAAMmrB,EAAQ7jB,MAAMU,KAAKm9B,GAOzB,OANqB,IAAjBha,EAAMljB,QACRkjB,EAAM5C,KAAKhZ,OAAO4X,OAAO,OAEvBmkD,GAAWtiD,IAAIqjD,IACjBxuC,EAAM7O,IAAIq9C,EAAUlhD,GAEfA,CACT,CAMAmhD,iBAAAA,GACE,MAAM,QAACj9D,EAAO,KAAExO,GAAQU,KAExB,MAAO,CACL8N,EACA6qB,GAAUr5B,IAAS,CAAC,EACpB+zB,GAASiG,SAASh6B,IAAS,CAAC,EAC5B,CAACA,QACD+zB,GACAuF,GAEJ,CASA2nB,mBAAAA,CAAoB3c,EAAQhjB,EAAO4Y,EAASqK,EAAW,CAAC,KACtD,MAAM7a,EAAS,CAACuuB,SAAS,IACnB,SAACpwB,EAAQ,YAAE6jD,GAAeC,GAAYjrE,KAAKsqE,eAAgB1mC,EAAQC,GACzE,IAAI/1B,EAAUqZ,EACd,GAAI+jD,GAAY/jD,EAAUvG,GAAQ,CAChCoI,EAAOuuB,SAAU,EACjB/d,EAAUjS,GAAWiS,GAAWA,IAAYA,EAE5C,MAAM2xC,EAAcnrE,KAAKw+C,eAAe5a,EAAQpK,EAASwxC,GACzDl9D,EAAUq3B,GAAehe,EAAUqS,EAAS2xC,E,CAG9C,IAAK,MAAM1oC,KAAQ7hB,EACjBoI,EAAOyZ,GAAQ30B,EAAQ20B,GAEzB,OAAOzZ,CACT,CAQAw1B,cAAAA,CAAe5a,EAAQpK,EAASqK,EAAW,CAAC,IAAKyB,GAC/C,MAAM,SAACne,GAAY8jD,GAAYjrE,KAAKsqE,eAAgB1mC,EAAQC,GAC5D,OAAO5f,GAASuV,GACZ2L,GAAehe,EAAUqS,OAAS1lB,EAAWwxB,GAC7Cne,CACN,EAGF,SAAS8jD,GAAYG,EAAexnC,EAAQC,GAC1C,IAAIvH,EAAQ8uC,EAAcn2C,IAAI2O,GACzBtH,IACHA,EAAQ,IAAI5H,IACZ02C,EAAc39C,IAAImW,EAAQtH,IAE5B,MAAMzH,EAAWgP,EAAS8C,OAC1B,IAAIsU,EAAS3e,EAAMrH,IAAIJ,GACvB,IAAKomB,EAAQ,CACX,MAAM9zB,EAAWwc,GAAgBC,EAAQC,GACzCoX,EAAS,CACP9zB,WACA6jD,YAAannC,EAASkD,OAAOhkB,IAAMA,EAAEhC,cAAcwV,SAAS,WAE9D+F,EAAM7O,IAAIoH,EAAUomB,E,CAEtB,OAAOA,CACT,CAEA,MAAMowB,GAAcvmE,GAASmf,GAASnf,IACjCkJ,OAAOipC,oBAAoBnyC,GAAOmjE,KAAMxpE,GAAQ8oB,GAAWziB,EAAMrG,KAEtE,SAASysE,GAAY9lC,EAAOxkB,GAC1B,MAAM,aAACslB,EAAY,YAAEC,GAAejN,GAAakM,GAEjD,IAAK,MAAM3C,KAAQ7hB,EAAO,CACxB,MAAMmlB,EAAaG,EAAazD,GAC1BuD,EAAYG,EAAY1D,GACxB39B,GAASkhC,GAAaD,IAAeX,EAAM3C,GACjD,GAAKsD,IAAexe,GAAWziB,IAAUumE,GAAYvmE,KAC/CkhC,GAAapxB,GAAQ9P,GACzB,OAAO,CAEX,CACA,OAAO,CACT,C,eC9YA,MAAMwmE,GAAkB,CAAC,MAAO,SAAU,OAAQ,QAAS,aAC3D,SAASC,GAAqBhc,EAAU//B,GACtC,MAAoB,QAAb+/B,GAAmC,WAAbA,IAAiE,IAAvC+b,GAAgBvlD,QAAQwpC,IAA6B,MAAT//B,CACrG,CAEA,SAASg8C,GAAcC,EAAIC,GACzB,OAAO,SAAS/4D,EAAGC,GACjB,OAAOD,EAAE84D,KAAQ74D,EAAE64D,GACf94D,EAAE+4D,GAAM94D,EAAE84D,GACV/4D,EAAE84D,GAAM74D,EAAE64D,EAChB,CACF,CAEA,SAASE,GAAqBnyC,GAC5B,MAAM7D,EAAQ6D,EAAQ7D,MAChBohB,EAAmBphB,EAAM7nB,QAAQgmB,UAEvC6B,EAAMupC,cAAc,eACpBt6C,GAAamyB,GAAoBA,EAAiB60B,WAAY,CAACpyC,GAAU7D,EAC3E,CAEA,SAASk2C,GAAoBryC,GAC3B,MAAM7D,EAAQ6D,EAAQ7D,MAChBohB,EAAmBphB,EAAM7nB,QAAQgmB,UACvClP,GAAamyB,GAAoBA,EAAiB+0B,WAAY,CAACtyC,GAAU7D,EAC3E,CAMA,SAASo2C,GAAUvtE,GAYjB,OAXIisC,MAAqC,kBAATjsC,EAC9BA,EAAOksC,SAASshC,eAAextE,GACtBA,GAAQA,EAAKkI,SAEtBlI,EAAOA,EAAK,IAGVA,GAAQA,EAAK2+B,SAEf3+B,EAAOA,EAAK2+B,QAEP3+B,CACT,CAEA,MAAMytE,GAAY,CAAC,EACbC,GAAYztE,IAChB,MAAM0+B,EAAS4uC,GAAUttE,GACzB,OAAOuP,OAAOse,OAAO2/C,IAAWllC,OAAQl0B,GAAMA,EAAEsqB,SAAWA,GAAQhU,OAGrE,SAASgjD,GAAgB3pD,EAAKlc,EAAOy7C,GACnC,MAAM9zC,EAAOD,OAAOC,KAAKuU,GACzB,IAAK,MAAM/jB,KAAOwP,EAAM,CACtB,MAAMm+D,GAAU3tE,EAChB,GAAI2tE,GAAU9lE,EAAO,CACnB,MAAMxB,EAAQ0d,EAAI/jB,UACX+jB,EAAI/jB,IACPsjD,EAAO,GAAKqqB,EAAS9lE,KACvBkc,EAAI4pD,EAASrqB,GAAQj9C,E,CAG3B,CACF,CASA,SAASunE,GAAmBt5D,EAAGu5D,EAAWC,EAAaC,GACrD,OAAKD,GAA0B,aAAXx5D,EAAEzT,KAGlBktE,EACKF,EAEFv5D,EALE,IAMX,CAEA,MAAM05D,GASJ,eAAOzH,IAAYx3C,GACjB6gC,GAAS/sD,OAAOksB,GAChBk/C,IACF,CAEA,iBAAOtH,IAAc53C,GACnB6gC,GAASntD,UAAUssB,GACnBk/C,IACF,CAGAtqD,WAAAA,CAAY5jB,EAAMmuE,GAChB,MAAM/1B,EAAS52C,KAAK42C,OAAS,IAAIuzB,GAAOwC,GAClCC,EAAgBb,GAAUvtE,GAC1BquE,EAAgBX,GAASU,GAC/B,GAAIC,EACF,MAAM,IAAInmC,MACR,4CAA+CmmC,EAAc97D,GAA7D,kDACgD87D,EAAc1vC,OAAOpsB,GAAK,oBAI9E,MAAMjD,EAAU8oC,EAAO4H,eAAe5H,EAAOm0B,oBAAqB/qE,KAAKo9B,cAEvEp9B,KAAKy5B,SAAW,IAAKmd,EAAOnd,UAAYm/B,GAAgBgU,IACxD5sE,KAAKy5B,SAASw7B,aAAare,GAE3B,MAAMpd,EAAUx5B,KAAKy5B,SAASq7B,eAAe8X,EAAe9+D,EAAQ4/B,aAC9DvQ,EAAS3D,GAAWA,EAAQ2D,OAC5BI,EAASJ,GAAUA,EAAOI,OAC1Bt9B,EAAQk9B,GAAUA,EAAOl9B,MAE/BD,KAAK+Q,GAAK4S,KACV3jB,KAAKk6B,IAAMV,EACXx5B,KAAKm9B,OAASA,EACdn9B,KAAKC,MAAQA,EACbD,KAAKu9B,OAASA,EACdv9B,KAAK8sE,SAAWh/D,EAIhB9N,KAAK+sE,aAAe/sE,KAAK0tC,YACzB1tC,KAAKo0D,QAAU,GACfp0D,KAAKgtE,UAAY,GACjBhtE,KAAKg6C,aAAUlmC,EACf9T,KAAKsxD,MAAQ,GACbtxD,KAAKg9B,6BAA0BlpB,EAC/B9T,KAAKgzC,eAAYl/B,EACjB9T,KAAKs0C,QAAU,GACft0C,KAAKitE,gBAAan5D,EAClB9T,KAAKktE,WAAa,CAAC,EAEnBltE,KAAKmtE,0BAAuBr5D,EAC5B9T,KAAKotE,gBAAkB,GACvBptE,KAAKg7B,OAAS,CAAC,EACfh7B,KAAKqtE,SAAW,IAAIlG,GACpBnnE,KAAKu4D,SAAW,CAAC,EACjBv4D,KAAKstE,eAAiB,CAAC,EACvBttE,KAAKutE,UAAW,EAChBvtE,KAAK8gD,yBAAsBhtC,EAC3B9T,KAAKk8C,cAAWpoC,EAChB9T,KAAKwtE,UAAYx/C,GAASuM,GAAQv6B,KAAKo2C,OAAO7b,GAAOzsB,EAAQ2/D,aAAe,GAC5EztE,KAAKmiD,aAAe,GAGpB8pB,GAAUjsE,KAAK+Q,IAAM/Q,KAEhBw5B,GAAY2D,GASjBgY,GAASN,OAAO70C,KAAM,WAAY2rE,IAClCx2B,GAASN,OAAO70C,KAAM,WAAY6rE,IAElC7rE,KAAK0tE,cACD1tE,KAAKutE,UACPvtE,KAAKo2C,UATLrT,QAAQwmC,MAAM,oEAWlB,CAEA,eAAI77B,GACF,MAAO5/B,SAAS,YAAC4/B,EAAW,oBAAEhT,GAAoB,MAAEz6B,EAAA,OAAOs9B,EAAM,aAAEwvC,GAAgB/sE,KACnF,OAAK4jB,GAAc8pB,GAKfhT,GAAuBqyC,EAElBA,EAIFxvC,EAASt9B,EAAQs9B,EAAS,KATxBmQ,CAUX,CAEA,QAAIhuC,GACF,OAAOM,KAAK42C,OAAOl3C,IACrB,CAEA,QAAIA,CAAKA,GACPM,KAAK42C,OAAOl3C,KAAOA,CACrB,CAEA,WAAIoO,GACF,OAAO9N,KAAK8sE,QACd,CAEA,WAAIh/D,CAAQA,GACV9N,KAAK42C,OAAO9oC,QAAUA,CACxB,CAEA,YAAIugD,GACF,OAAOA,EACT,CAKAqf,WAAAA,GAeE,OAbA1tE,KAAKk/D,cAAc,cAEfl/D,KAAK8N,QAAQgtB,WACf96B,KAAK+zB,SAEL+Z,GAAY9tC,KAAMA,KAAK8N,QAAQyrB,kBAGjCv5B,KAAK2tE,aAGL3tE,KAAKk/D,cAAc,aAEZl/D,IACT,CAEAwqE,KAAAA,GAEE,OADAttC,GAAYl9B,KAAKm9B,OAAQn9B,KAAKk6B,KACvBl6B,IACT,CAEAqxC,IAAAA,GAEE,OADA8D,GAAS9D,KAAKrxC,MACPA,IACT,CAOA+zB,MAAAA,CAAO9zB,EAAOs9B,GACP4X,GAASf,QAAQp0C,MAGpBA,KAAK4tE,kBAAoB,CAAC3tE,QAAOs9B,UAFjCv9B,KAAK6tE,QAAQ5tE,EAAOs9B,EAIxB,CAEAswC,OAAAA,CAAQ5tE,EAAOs9B,GACb,MAAMzvB,EAAU9N,KAAK8N,QACfqvB,EAASn9B,KAAKm9B,OACduQ,EAAc5/B,EAAQ4sB,qBAAuB16B,KAAK0tC,YAClDogC,EAAU9tE,KAAKy5B,SAAS8T,eAAepQ,EAAQl9B,EAAOs9B,EAAQmQ,GAC9DqgC,EAAWjgE,EAAQyrB,kBAAoBv5B,KAAKy5B,SAASC,sBACrDa,EAAOv6B,KAAKC,MAAQ,SAAW,SAErCD,KAAKC,MAAQ6tE,EAAQ7tE,MACrBD,KAAKu9B,OAASuwC,EAAQvwC,OACtBv9B,KAAK+sE,aAAe/sE,KAAK0tC,YACpBI,GAAY9tC,KAAM+tE,GAAU,KAIjC/tE,KAAKk/D,cAAc,SAAU,CAAC7xD,KAAMygE,IAEpClpD,GAAa9W,EAAQkgE,SAAU,CAAChuE,KAAM8tE,GAAU9tE,MAE5CA,KAAKutE,UACHvtE,KAAKwtE,UAAUjzC,IAEjBv6B,KAAKrC,SAGX,CAEAswE,mBAAAA,GACE,MAAMngE,EAAU9N,KAAK8N,QACfogE,EAAgBpgE,EAAQktB,QAAU,CAAC,EAEzChW,GAAKkpD,EAAe,CAACC,EAAajmB,KAChCimB,EAAYp9D,GAAKm3C,GAErB,CAKAkmB,mBAAAA,GACE,MAAMtgE,EAAU9N,KAAK8N,QACfugE,EAAYvgE,EAAQktB,OACpBA,EAASh7B,KAAKg7B,OACdszC,EAAUtgE,OAAOC,KAAK+sB,GAAQ+Z,OAAO,CAACvyB,EAAKzR,KAC/CyR,EAAIzR,IAAM,EACHyR,GACN,CAAC,GACJ,IAAIgL,EAAQ,GAER6gD,IACF7gD,EAAQA,EAAMs1B,OACZ90C,OAAOC,KAAKogE,GAAWx5D,IAAK9D,IAC1B,MAAM+3D,EAAeuF,EAAUt9D,GACzBye,EAAOq5C,GAAc93D,EAAI+3D,GACzByF,EAAoB,MAAT/+C,EACXo1B,EAAwB,MAATp1B,EACrB,MAAO,CACL1hB,QAASg7D,EACT0F,UAAWD,EAAW,YAAc3pB,EAAe,SAAW,OAC9D6pB,MAAOF,EAAW,eAAiB3pB,EAAe,WAAa,cAMvE5/B,GAAKwI,EAAQhvB,IACX,MAAMsqE,EAAetqE,EAAKsP,QACpBiD,EAAK+3D,EAAa/3D,GAClBye,EAAOq5C,GAAc93D,EAAI+3D,GACzB4F,EAAYpqD,GAAewkD,EAAaxpE,KAAMd,EAAKiwE,YAE3B36D,IAA1Bg1D,EAAavZ,UAA0Bgc,GAAqBzC,EAAavZ,SAAU//B,KAAU+7C,GAAqB/sE,EAAKgwE,aACzH1F,EAAavZ,SAAW/wD,EAAKgwE,WAG/BF,EAAQv9D,IAAM,EACd,IAAIgqB,EAAQ,KACZ,GAAIhqB,KAAMiqB,GAAUA,EAAOjqB,GAAIzR,OAASovE,EACtC3zC,EAAQC,EAAOjqB,OACV,CACL,MAAM49D,EAAatgB,GAASiY,SAASoI,GACrC3zC,EAAQ,IAAI4zC,EAAW,CACrB59D,KACAzR,KAAMovE,EACNx0C,IAAKl6B,KAAKk6B,IACVvE,MAAO31B,OAETg7B,EAAOD,EAAMhqB,IAAMgqB,C,CAGrBA,EAAM2zB,KAAKoa,EAAch7D,KAG3BkX,GAAKspD,EAAS,CAACM,EAAY79D,KACpB69D,UACI5zC,EAAOjqB,KAIlBiU,GAAKgW,EAASD,IACZ22B,GAAQ5a,UAAU92C,KAAM+6B,EAAOA,EAAMjtB,SACrC4jD,GAAQyC,OAAOn0D,KAAM+6B,IAEzB,CAKA8zC,eAAAA,GACE,MAAM12B,EAAWn4C,KAAKgtE,UAChBprB,EAAU5hD,KAAKN,KAAK45B,SAAS5yB,OAC7Bi7C,EAAUxJ,EAASzxC,OAGzB,GADAyxC,EAASjvB,KAAK,CAACvW,EAAGC,IAAMD,EAAEjU,MAAQkU,EAAElU,OAChCijD,EAAUC,EAAS,CACrB,IAAK,IAAIptC,EAAIotC,EAASptC,EAAImtC,IAAWntC,EACnCxU,KAAK8uE,oBAAoBt6D,GAE3B2jC,EAAS7qB,OAAOs0B,EAASD,EAAUC,E,CAErC5hD,KAAKotE,gBAAkBj1B,EAASn0B,MAAM,GAAGkF,KAAKsiD,GAAc,QAAS,SACvE,CAKAuD,2BAAAA,GACE,MAAO/B,UAAW70B,EAAUz4C,MAAM,SAAC45B,IAAat5B,KAC5Cm4C,EAASzxC,OAAS4yB,EAAS5yB,eACtB1G,KAAKg6C,QAEd7B,EAASprB,QAAQ,CAAC+B,EAAMpwB,KACmC,IAArD46B,EAASyN,OAAOrxB,GAAKA,IAAMoZ,EAAKu9B,UAAU3lD,QAC5C1G,KAAK8uE,oBAAoBpwE,IAG/B,CAEAswE,wBAAAA,GACE,MAAMC,EAAiB,GACjB31C,EAAWt5B,KAAKN,KAAK45B,SAC3B,IAAI9kB,EAAG8Q,EAIP,IAFAtlB,KAAK+uE,8BAEAv6D,EAAI,EAAG8Q,EAAOgU,EAAS5yB,OAAQ8N,EAAI8Q,EAAM9Q,IAAK,CACjD,MAAM+a,EAAU+J,EAAS9kB,GACzB,IAAIsa,EAAO9uB,KAAKy9C,eAAejpC,GAC/B,MAAMlV,EAAOiwB,EAAQjwB,MAAQU,KAAK42C,OAAOt3C,KAazC,GAXIwvB,EAAKxvB,MAAQwvB,EAAKxvB,OAASA,IAC7BU,KAAK8uE,oBAAoBt6D,GACzBsa,EAAO9uB,KAAKy9C,eAAejpC,IAE7Bsa,EAAKxvB,KAAOA,EACZwvB,EAAKuL,UAAY9K,EAAQ8K,WAAaiuC,GAAahpE,EAAMU,KAAK8N,SAC9DghB,EAAKogD,MAAQ3/C,EAAQ2/C,OAAS,EAC9BpgD,EAAKpwB,MAAQ8V,EACbsa,EAAKxhB,MAAQ,GAAKiiB,EAAQjiB,MAC1BwhB,EAAKoF,QAAUl0B,KAAKiqD,iBAAiBz1C,GAEjCsa,EAAKgrB,WACPhrB,EAAKgrB,WAAW4C,YAAYloC,GAC5Bsa,EAAKgrB,WAAWyC,iBACX,CACL,MAAM4yB,EAAkB9gB,GAAS8X,cAAc7mE,IACzC,mBAAC88C,EAAA,gBAAoBC,GAAmBhpB,GAASiG,SAASh6B,GAChE0O,OAAO8T,OAAOqtD,EAAiB,CAC7B9yB,gBAAiBgS,GAASC,WAAWjS,GACrCD,mBAAoBA,GAAsBiS,GAASC,WAAWlS,KAEhEttB,EAAKgrB,WAAa,IAAIq1B,EAAgBnvE,KAAMwU,GAC5Cy6D,EAAejoD,KAAK8H,EAAKgrB,W,CAE7B,CAGA,OADA95C,KAAK6uE,kBACEI,CACT,CAMAG,cAAAA,GACEpqD,GAAKhlB,KAAKN,KAAK45B,SAAU,CAAC/J,EAAS9J,KACjCzlB,KAAKy9C,eAAeh4B,GAAcq0B,WAAW8D,SAC5C59C,KACL,CAKA49C,KAAAA,GACE59C,KAAKovE,iBACLpvE,KAAKk/D,cAAc,QACrB,CAEA9oB,MAAAA,CAAO7b,GACL,MAAMqc,EAAS52C,KAAK42C,OAEpBA,EAAOR,SACP,MAAMtoC,EAAU9N,KAAK8sE,SAAWl2B,EAAO4H,eAAe5H,EAAOm0B,oBAAqB/qE,KAAKo9B,cACjFiyC,EAAgBrvE,KAAK8gD,qBAAuBhzC,EAAQgmB,UAU1D,GARA9zB,KAAKsvE,gBACLtvE,KAAKuvE,sBACLvvE,KAAKwvE,uBAILxvE,KAAKqtE,SAAS1F,cAEuD,IAAjE3nE,KAAKk/D,cAAc,eAAgB,CAAC3kC,OAAMmtC,YAAY,IACxD,OAIF,MAAMuH,EAAiBjvE,KAAKgvE,2BAE5BhvE,KAAKk/D,cAAc,wBAGnB,IAAI1K,EAAa,EACjB,IAAK,IAAIhgD,EAAI,EAAG8Q,EAAOtlB,KAAKN,KAAK45B,SAAS5yB,OAAQ8N,EAAI8Q,EAAM9Q,IAAK,CAC/D,MAAM,WAACslC,GAAc95C,KAAKy9C,eAAejpC,GACnCopC,GAASyxB,IAAyD,IAAxCJ,EAAelpD,QAAQ+zB,GAGvDA,EAAWkE,sBAAsBJ,GACjC4W,EAAavlD,KAAK6C,KAAKgoC,EAAWgG,iBAAkB0U,EACtD,CACAA,EAAax0D,KAAKyvE,YAAc3hE,EAAQmkD,OAAO59B,YAAcmgC,EAAa,EAC1Ex0D,KAAK0vE,cAAclb,GAGd6a,GAGHrqD,GAAKiqD,EAAiBn1B,IACpBA,EAAW8D,UAIf59C,KAAK2vE,gBAAgBp1C,GAGrBv6B,KAAKk/D,cAAc,cAAe,CAAC3kC,SAEnCv6B,KAAKo0D,QAAQlrC,KAAKsiD,GAAc,IAAK,SAGrC,MAAM,QAACl3B,EAAO,WAAE24B,GAAcjtE,KAC1BitE,EACFjtE,KAAK4vE,cAAc3C,GAAY,GACtB34B,EAAQ5tC,QACjB1G,KAAK6vE,mBAAmBv7B,EAASA,GAAS,GAG5Ct0C,KAAKrC,QACP,CAKA2xE,aAAAA,GACEtqD,GAAKhlB,KAAKg7B,OAASD,IACjB22B,GAAQ4C,UAAUt0D,KAAM+6B,KAG1B/6B,KAAKiuE,sBACLjuE,KAAKouE,qBACP,CAKAmB,mBAAAA,GACE,MAAMzhE,EAAU9N,KAAK8N,QACfgiE,EAAiB,IAAIpiD,IAAI1f,OAAOC,KAAKjO,KAAKktE,aAC1C6C,EAAY,IAAIriD,IAAI5f,EAAQ8rB,QAE7BpS,GAAUsoD,EAAgBC,MAAgB/vE,KAAKmtE,uBAAyBr/D,EAAQgtB,aAEnF96B,KAAKgwE,eACLhwE,KAAK2tE,aAET,CAKA6B,oBAAAA,GACE,MAAM,eAAClC,GAAkBttE,KACnBiwE,EAAUjwE,KAAKkwE,0BAA4B,GACjD,IAAK,MAAM,OAACljD,EAAM,MAAE1mB,EAAA,MAAO+H,KAAU4hE,EAAS,CAC5C,MAAMluB,EAAkB,oBAAX/0B,GAAgC3e,EAAQA,EACrD89D,GAAgBmB,EAAgBhnE,EAAOy7C,EACzC,CACF,CAKAmuB,sBAAAA,GACE,MAAM/tB,EAAeniD,KAAKmiD,aAC1B,IAAKA,IAAiBA,EAAaz7C,OACjC,OAGF1G,KAAKmiD,aAAe,GACpB,MAAMguB,EAAenwE,KAAKN,KAAK45B,SAAS5yB,OAClC0pE,EAAW5O,GAAQ,IAAI9zC,IAC3By0B,EACGpb,OAAOl0B,GAAKA,EAAE,KAAO2uD,GACrB3sD,IAAI,CAAChC,EAAG2B,IAAMA,EAAI,IAAM3B,EAAEya,OAAO,GAAGqZ,KAAK,OAGxC0pC,EAAYD,EAAQ,GAC1B,IAAK,IAAI57D,EAAI,EAAGA,EAAI27D,EAAc37D,IAChC,IAAKgT,GAAU6oD,EAAWD,EAAQ57D,IAChC,OAGJ,OAAOzO,MAAMU,KAAK4pE,GACfx7D,IAAIhC,GAAKA,EAAEiU,MAAM,MACjBjS,IAAIlC,IAAA,CAAOqa,OAAQra,EAAE,GAAIrM,OAAQqM,EAAE,GAAItE,OAAQsE,EAAE,KACtD,CAOA+8D,aAAAA,CAAclb,GACZ,IAA+D,IAA3Dx0D,KAAKk/D,cAAc,eAAgB,CAACwI,YAAY,IAClD,OAGFhW,GAAQtb,OAAOp2C,KAAMA,KAAKC,MAAOD,KAAKu9B,OAAQi3B,GAE9C,MAAMv1B,EAAOj/B,KAAKgzC,UACZs9B,EAASrxC,EAAKh/B,OAAS,GAAKg/B,EAAK1B,QAAU,EAEjDv9B,KAAKo0D,QAAU,GACfpvC,GAAKhlB,KAAKsxD,MAAQllB,IACZkkC,GAA2B,cAAjBlkC,EAAImjB,WAOdnjB,EAAI0K,WACN1K,EAAI0K,YAEN92C,KAAKo0D,QAAQptC,QAAQolB,EAAIgoB,aACxBp0D,MAEHA,KAAKo0D,QAAQrnC,QAAQ,CAACvuB,EAAME,KAC1BF,EAAK+xE,KAAO7xE,IAGdsB,KAAKk/D,cAAc,cACrB,CAOAyQ,eAAAA,CAAgBp1C,GACd,IAA6E,IAAzEv6B,KAAKk/D,cAAc,uBAAwB,CAAC3kC,OAAMmtC,YAAY,IAAlE,CAIA,IAAK,IAAIlzD,EAAI,EAAG8Q,EAAOtlB,KAAKN,KAAK45B,SAAS5yB,OAAQ8N,EAAI8Q,IAAQ9Q,EAC5DxU,KAAKy9C,eAAejpC,GAAGslC,WAAWhD,YAGpC,IAAK,IAAItiC,EAAI,EAAG8Q,EAAOtlB,KAAKN,KAAK45B,SAAS5yB,OAAQ8N,EAAI8Q,IAAQ9Q,EAC5DxU,KAAKwwE,eAAeh8D,EAAG+S,GAAWgT,GAAQA,EAAK,CAAC9U,aAAcjR,IAAM+lB,GAGtEv6B,KAAKk/D,cAAc,sBAAuB,CAAC3kC,Q,CAC7C,CAOAi2C,cAAAA,CAAe9xE,EAAO67B,GACpB,MAAMzL,EAAO9uB,KAAKy9C,eAAe/+C,GAC3BQ,EAAO,CAAC4vB,OAAMpwB,QAAO67B,OAAMmtC,YAAY,IAEW,IAApD1nE,KAAKk/D,cAAc,sBAAuBhgE,KAI9C4vB,EAAKgrB,WAAW7F,QAAQ1Z,GAExBr7B,EAAKwoE,YAAa,EAClB1nE,KAAKk/D,cAAc,qBAAsBhgE,GAC3C,CAEAvB,MAAAA,IACiE,IAA3DqC,KAAKk/D,cAAc,eAAgB,CAACwI,YAAY,MAIhDvyB,GAAS1tB,IAAIznB,MACXA,KAAKutE,WAAap4B,GAASf,QAAQp0C,OACrCm1C,GAAS7uC,MAAMtG,OAGjBA,KAAKq0C,OACLs3B,GAAqB,CAACh2C,MAAO31B,QAEjC,CAEAq0C,IAAAA,GACE,IAAI7/B,EACJ,GAAIxU,KAAK4tE,kBAAmB,CAC1B,MAAM,MAAC3tE,EAAA,OAAOs9B,GAAUv9B,KAAK4tE,kBAE7B5tE,KAAK4tE,kBAAoB,KACzB5tE,KAAK6tE,QAAQ5tE,EAAOs9B,E,CAItB,GAFAv9B,KAAKwqE,QAEDxqE,KAAKC,OAAS,GAAKD,KAAKu9B,QAAU,EACpC,OAGF,IAA6D,IAAzDv9B,KAAKk/D,cAAc,aAAc,CAACwI,YAAY,IAChD,OAMF,MAAM+I,EAASzwE,KAAKo0D,QACpB,IAAK5/C,EAAI,EAAGA,EAAIi8D,EAAO/pE,QAAU+pE,EAAOj8D,GAAG6/C,GAAK,IAAK7/C,EACnDi8D,EAAOj8D,GAAG6/B,KAAKr0C,KAAKgzC,WAMtB,IAHAhzC,KAAK0wE,gBAGEl8D,EAAIi8D,EAAO/pE,SAAU8N,EAC1Bi8D,EAAOj8D,GAAG6/B,KAAKr0C,KAAKgzC,WAGtBhzC,KAAKk/D,cAAc,YACrB,CAKA9mB,sBAAAA,CAAuBF,GACrB,MAAMC,EAAWn4C,KAAKotE,gBAChBpkD,EAAS,GACf,IAAIxU,EAAG8Q,EAEP,IAAK9Q,EAAI,EAAG8Q,EAAO6yB,EAASzxC,OAAQ8N,EAAI8Q,IAAQ9Q,EAAG,CACjD,MAAMsa,EAAOqpB,EAAS3jC,GACjB0jC,IAAiBppB,EAAKoF,SACzBlL,EAAOhC,KAAK8H,EAEhB,CAEA,OAAO9F,CACT,CAMAwmC,4BAAAA,GACE,OAAOxvD,KAAKo4C,wBAAuB,EACrC,CAOAs4B,aAAAA,GACE,IAAqE,IAAjE1wE,KAAKk/D,cAAc,qBAAsB,CAACwI,YAAY,IACxD,OAGF,MAAMvvB,EAAWn4C,KAAKwvD,+BACtB,IAAK,IAAIh7C,EAAI2jC,EAASzxC,OAAS,EAAG8N,GAAK,IAAKA,EAC1CxU,KAAK2wE,aAAax4B,EAAS3jC,IAG7BxU,KAAKk/D,cAAc,oBACrB,CAOAyR,YAAAA,CAAa7hD,GACX,MAAMoL,EAAMl6B,KAAKk6B,IACXh7B,EAAO,CACX4vB,OACApwB,MAAOowB,EAAKpwB,MACZgpE,YAAY,GAGR5wC,EAAOqc,GAAmBnzC,KAAM8uB,IAEgB,IAAlD9uB,KAAKk/D,cAAc,oBAAqBhgE,KAIxC43B,GACFqI,GAASjF,EAAKpD,GAGhBhI,EAAKgrB,WAAWzF,OAEZvd,GACFsI,GAAWlF,GAGbh7B,EAAKwoE,YAAa,EAClB1nE,KAAKk/D,cAAc,mBAAoBhgE,GACzC,CAOA8wD,aAAAA,CAAcjgC,GACZ,OAAOiP,GAAejP,EAAO/vB,KAAKgzC,UAAWhzC,KAAKyvE,YACpD,CAEAmB,yBAAAA,CAA0B79D,EAAGwnB,EAAMzsB,EAASiiD,GAC1C,MAAM/iC,EAAS8jC,GAAYC,MAAMx2B,GACjC,MAAsB,oBAAXvN,EACFA,EAAOhtB,KAAM+S,EAAGjF,EAASiiD,GAG3B,EACT,CAEAtS,cAAAA,CAAeh4B,GACb,MAAM8J,EAAUvvB,KAAKN,KAAK45B,SAAS7T,GAC7B0yB,EAAWn4C,KAAKgtE,UACtB,IAAIl+C,EAAOqpB,EAASpR,OAAOrxB,GAAKA,GAAKA,EAAE22C,WAAa98B,GAASpG,MAoB7D,OAlBK2F,IACHA,EAAO,CACLxvB,KAAM,KACNI,KAAM,GACN6vB,QAAS,KACTuqB,WAAY,KACZuB,OAAQ,KACRyB,QAAS,KACTE,QAAS,KACTkyB,MAAO3/C,GAAWA,EAAQ2/C,OAAS,EACnCxwE,MAAO+mB,EACP4mC,SAAU98B,EACVF,QAAS,GACTH,SAAS,GAEXipB,EAASnxB,KAAK8H,IAGTA,CACT,CAEAsO,UAAAA,GACE,OAAOp9B,KAAKk8C,WAAal8C,KAAKk8C,SAAWzY,GAAc,KAAM,CAAC9N,MAAO31B,KAAMV,KAAM,UACnF,CAEA8tD,sBAAAA,GACE,OAAOptD,KAAKwvD,+BAA+B9oD,MAC7C,CAEAujD,gBAAAA,CAAiBxkC,GACf,MAAM8J,EAAUvvB,KAAKN,KAAK45B,SAAS7T,GACnC,IAAK8J,EACH,OAAO,EAGT,MAAMT,EAAO9uB,KAAKy9C,eAAeh4B,GAIjC,MAA8B,mBAAhBqJ,EAAKusB,QAAwBvsB,EAAKusB,QAAU9rB,EAAQ8rB,MACpE,CAEAw1B,oBAAAA,CAAqBprD,EAAcyO,GACjC,MAAMpF,EAAO9uB,KAAKy9C,eAAeh4B,GACjCqJ,EAAKusB,QAAUnnB,CACjB,CAEAi4B,oBAAAA,CAAqBztD,GACnBsB,KAAKstE,eAAe5uE,IAAUsB,KAAKstE,eAAe5uE,EACpD,CAEA8oD,iBAAAA,CAAkB9oD,GAChB,OAAQsB,KAAKstE,eAAe5uE,EAC9B,CAKAoyE,iBAAAA,CAAkBrrD,EAAcm1B,EAAW1mB,GACzC,MAAMqG,EAAOrG,EAAU,OAAS,OAC1BpF,EAAO9uB,KAAKy9C,eAAeh4B,GAC3BkuB,EAAQ7kB,EAAKgrB,WAAW2G,wBAAmB3sC,EAAWymB,GAExDjT,GAAQszB,IACV9rB,EAAKpvB,KAAKk7C,GAAWS,QAAUnnB,EAC/Bl0B,KAAKo2C,WAELp2C,KAAK6wE,qBAAqBprD,EAAcyO,GAExCyf,EAAMyC,OAAOtnB,EAAM,CAACoF,YACpBl0B,KAAKo2C,OAAQlc,GAAQA,EAAIzU,eAAiBA,EAAe8U,OAAOzmB,GAEpE,CAEAqgB,IAAAA,CAAK1O,EAAcm1B,GACjB56C,KAAK8wE,kBAAkBrrD,EAAcm1B,GAAW,EAClD,CAEA5mB,IAAAA,CAAKvO,EAAcm1B,GACjB56C,KAAK8wE,kBAAkBrrD,EAAcm1B,GAAW,EAClD,CAKAk0B,mBAAAA,CAAoBrpD,GAClB,MAAMqJ,EAAO9uB,KAAKgtE,UAAUvnD,GACxBqJ,GAAQA,EAAKgrB,YACfhrB,EAAKgrB,WAAW+D,kBAEX79C,KAAKgtE,UAAUvnD,EACxB,CAEAsrD,KAAAA,GACE,IAAIv8D,EAAG8Q,EAIP,IAHAtlB,KAAKqxC,OACL8D,GAASj0C,OAAOlB,MAEXwU,EAAI,EAAG8Q,EAAOtlB,KAAKN,KAAK45B,SAAS5yB,OAAQ8N,EAAI8Q,IAAQ9Q,EACxDxU,KAAK8uE,oBAAoBt6D,EAE7B,CAEAw8D,OAAAA,GACEhxE,KAAKk/D,cAAc,iBACnB,MAAM,OAAC/hC,EAAM,IAAEjD,GAAOl6B,KAEtBA,KAAK+wE,QACL/wE,KAAK42C,OAAO2zB,aAERptC,IACFn9B,KAAKgwE,eACL9yC,GAAYC,EAAQjD,GACpBl6B,KAAKy5B,SAASs7B,eAAe76B,GAC7Bl6B,KAAKm9B,OAAS,KACdn9B,KAAKk6B,IAAM,aAGN+xC,GAAUjsE,KAAK+Q,IAEtB/Q,KAAKk/D,cAAc,eACrB,CAEA+R,aAAAA,IAAiB/xE,GACf,OAAOc,KAAKm9B,OAAO+zC,aAAahyE,EAClC,CAKAyuE,UAAAA,GACE3tE,KAAKmxE,iBACDnxE,KAAK8N,QAAQgtB,WACf96B,KAAKoxE,uBAELpxE,KAAKutE,UAAW,CAEpB,CAKA4D,cAAAA,GACE,MAAMxkD,EAAY3sB,KAAKktE,WACjBzzC,EAAWz5B,KAAKy5B,SAEhB43C,EAAOA,CAAC/xE,EAAMmtB,KAClBgN,EAASj4B,iBAAiBxB,KAAMV,EAAMmtB,GACtCE,EAAUrtB,GAAQmtB,GAGdA,EAAWA,CAAC1Z,EAAG2C,EAAGiR,KACtB5T,EAAEm5B,QAAUx2B,EACZ3C,EAAEo5B,QAAUxlB,EACZ3mB,KAAK4vE,cAAc78D,IAGrBiS,GAAKhlB,KAAK8N,QAAQ8rB,OAASt6B,GAAS+xE,EAAK/xE,EAAMmtB,GACjD,CAKA2kD,oBAAAA,GACOpxE,KAAKmtE,uBACRntE,KAAKmtE,qBAAuB,CAAC,GAE/B,MAAMxgD,EAAY3sB,KAAKmtE,qBACjB1zC,EAAWz5B,KAAKy5B,SAEhB43C,EAAOA,CAAC/xE,EAAMmtB,KAClBgN,EAASj4B,iBAAiBxB,KAAMV,EAAMmtB,GACtCE,EAAUrtB,GAAQmtB,GAEd6kD,EAAUA,CAAChyE,EAAMmtB,KACjBE,EAAUrtB,KACZm6B,EAAS/3B,oBAAoB1B,KAAMV,EAAMmtB,UAClCE,EAAUrtB,KAIfmtB,EAAWA,CAACxsB,EAAOs9B,KACnBv9B,KAAKm9B,QACPn9B,KAAK+zB,OAAO9zB,EAAOs9B,IAIvB,IAAIg0C,EACJ,MAAMhE,EAAWA,KACf+D,EAAQ,SAAU/D,GAElBvtE,KAAKutE,UAAW,EAChBvtE,KAAK+zB,SAELs9C,EAAK,SAAU5kD,GACf4kD,EAAK,SAAUE,IAGjBA,EAAWA,KACTvxE,KAAKutE,UAAW,EAEhB+D,EAAQ,SAAU7kD,GAGlBzsB,KAAK+wE,QACL/wE,KAAK6tE,QAAQ,EAAG,GAEhBwD,EAAK,SAAU9D,IAGb9zC,EAASu7B,WAAWh1D,KAAKm9B,QAC3BowC,IAEAgE,GAEJ,CAKAvB,YAAAA,GACEhrD,GAAKhlB,KAAKktE,WAAY,CAACzgD,EAAUntB,KAC/BU,KAAKy5B,SAAS/3B,oBAAoB1B,KAAMV,EAAMmtB,KAEhDzsB,KAAKktE,WAAa,CAAC,EAEnBloD,GAAKhlB,KAAKmtE,qBAAsB,CAAC1gD,EAAUntB,KACzCU,KAAKy5B,SAAS/3B,oBAAoB1B,KAAMV,EAAMmtB,KAEhDzsB,KAAKmtE,0BAAuBr5D,CAC9B,CAEA09D,gBAAAA,CAAiBhkD,EAAO+M,EAAMi/B,GAC5B,MAAMnzB,EAASmzB,EAAU,MAAQ,SACjC,IAAI1qC,EAAMtwB,EAAMgW,EAAG8Q,EAOnB,IALa,YAATiV,IACFzL,EAAO9uB,KAAKy9C,eAAejwB,EAAM,GAAG/H,cACpCqJ,EAAKgrB,WAAW,IAAMzT,EAAS,wBAG5B7xB,EAAI,EAAG8Q,EAAOkI,EAAM9mB,OAAQ8N,EAAI8Q,IAAQ9Q,EAAG,CAC9ChW,EAAOgvB,EAAMhZ,GACb,MAAMslC,EAAat7C,GAAQwB,KAAKy9C,eAAej/C,EAAKinB,cAAcq0B,WAC9DA,GACFA,EAAWzT,EAAS,cAAc7nC,EAAK4sC,QAAS5sC,EAAKinB,aAAcjnB,EAAKE,MAE5E,CACF,CAMA+yE,iBAAAA,GACE,OAAOzxE,KAAKs0C,SAAW,EACzB,CAMAo9B,iBAAAA,CAAkBC,GAChB,MAAMC,EAAa5xE,KAAKs0C,SAAW,GAC7BzgB,EAAS89C,EAAe98D,IAAI,EAAE4Q,eAAc/mB,YAChD,MAAMowB,EAAO9uB,KAAKy9C,eAAeh4B,GACjC,IAAKqJ,EACH,MAAM,IAAI4X,MAAM,6BAA+BjhB,GAGjD,MAAO,CACLA,eACA2lB,QAAStc,EAAKpvB,KAAKhB,GACnBA,WAGEgyB,GAAWvL,GAAe0O,EAAQ+9C,GAEpClhD,IACF1wB,KAAKs0C,QAAUzgB,EAEf7zB,KAAKitE,WAAa,KAClBjtE,KAAK6vE,mBAAmBh8C,EAAQ+9C,GAEpC,CAWA1S,aAAAA,CAAcoI,EAAMpoE,EAAM6nC,GACxB,OAAO/mC,KAAKqtE,SAAShG,OAAOrnE,KAAMsnE,EAAMpoE,EAAM6nC,EAChD,CAOA0V,eAAAA,CAAgBo1B,GACd,OAA6E,IAAtE7xE,KAAKqtE,SAASxvE,OAAOkpC,OAAOhkB,GAAKA,EAAE0kD,OAAO12D,KAAO8gE,GAAUnrE,MACpE,CAKAmpE,kBAAAA,CAAmBh8C,EAAQ+9C,EAAYE,GACrC,MAAMC,EAAe/xE,KAAK8N,QAAQksB,MAC5B40B,EAAOA,CAACj8C,EAAGC,IAAMD,EAAEo0B,OAAOrxB,IAAM9C,EAAEq1D,KAAKthD,GAAKjR,EAAE+P,eAAiBkB,EAAElB,cAAgB/P,EAAEhX,QAAUioB,EAAEjoB,QAC/FszE,EAAcpjB,EAAKgjB,EAAY/9C,GAC/Bo+C,EAAYH,EAASj+C,EAAS+6B,EAAK/6B,EAAQ+9C,GAE7CI,EAAYtrE,QACd1G,KAAKwxE,iBAAiBQ,EAAaD,EAAax3C,MAAM,GAGpD03C,EAAUvrE,QAAUqrE,EAAax3C,MACnCv6B,KAAKwxE,iBAAiBS,EAAWF,EAAax3C,MAAM,EAExD,CAKAq1C,aAAAA,CAAc78D,EAAG++D,GACf,MAAM5yE,EAAO,CACXutC,MAAO15B,EACP++D,SACApK,YAAY,EACZ6E,YAAavsE,KAAKgwD,cAAcj9C,IAE5Bm/D,EAAezK,IAAYA,EAAO35D,QAAQ8rB,QAAU55B,KAAK8N,QAAQ8rB,QAAQrD,SAASxjB,EAAE0jD,OAAOn3D,MAEjG,IAA6D,IAAzDU,KAAKk/D,cAAc,cAAehgE,EAAMgzE,GAC1C,OAGF,MAAMxhD,EAAU1wB,KAAKmyE,aAAap/D,EAAG++D,EAAQ5yE,EAAKqtE,aASlD,OAPArtE,EAAKwoE,YAAa,EAClB1nE,KAAKk/D,cAAc,aAAchgE,EAAMgzE,IAEnCxhD,GAAWxxB,EAAKwxB,UAClB1wB,KAAKrC,SAGAqC,IACT,CAUAmyE,YAAAA,CAAap/D,EAAG++D,EAAQvF,GACtB,MAAOj4B,QAASs9B,EAAa,GAAE,QAAE9jE,GAAW9N,KAetC+vD,EAAmB+hB,EACnBj+C,EAAS7zB,KAAKoyE,mBAAmBr/D,EAAG6+D,EAAYrF,EAAaxc,GAC7Dyc,EAAU9kD,GAAc3U,GACxBu5D,EAAYD,GAAmBt5D,EAAG/S,KAAKitE,WAAYV,EAAaC,GAElED,IAGFvsE,KAAKitE,WAAa,KAGlBroD,GAAa9W,EAAQ6sB,QAAS,CAAC5nB,EAAG8gB,EAAQ7zB,MAAOA,MAE7CwsE,GACF5nD,GAAa9W,EAAQlP,QAAS,CAACmU,EAAG8gB,EAAQ7zB,MAAOA,OAIrD,MAAM0wB,GAAWvL,GAAe0O,EAAQ+9C,GAQxC,OAPIlhD,GAAWohD,KACb9xE,KAAKs0C,QAAUzgB,EACf7zB,KAAK6vE,mBAAmBh8C,EAAQ+9C,EAAYE,IAG9C9xE,KAAKitE,WAAaX,EAEX57C,CACT,CAUA0hD,kBAAAA,CAAmBr/D,EAAG6+D,EAAYrF,EAAaxc,GAC7C,GAAe,aAAXh9C,EAAEzT,KACJ,MAAO,GAGT,IAAKitE,EAEH,OAAOqF,EAGT,MAAMG,EAAe/xE,KAAK8N,QAAQksB,MAClC,OAAOh6B,KAAK4wE,0BAA0B79D,EAAGg/D,EAAax3C,KAAMw3C,EAAchiB,EAC5E,EAIF,SAAS2c,KACP,OAAO1nD,GAAKynD,GAAMR,UAAYt2C,GAAUA,EAAM03C,SAAS1F,aACzD,CC5uCA,SAAS0K,GAASn4C,EAA+BkR,EAAqB2d,GACpE,MAAM,WAACD,EAAA,EAAYpzC,EAAA,EAAGiR,EAAA,YAAGijC,EAAA,YAAaD,EAAA,QAAa77C,GAAWs9B,GACxD,YAACtM,EAAA,gBAAa+T,GAAmB/kC,EACjCwkE,EAAiBrjE,KAAK8C,IAAI+sB,EAAc8qB,EAAa5+B,GAAgB89B,EAAaC,IAIxF,GAHA7uB,EAAImE,YACJnE,EAAIqE,IAAI7oB,EAAGiR,EAAGijC,EAAc9qB,EAAc,EAAGgqB,EAAawpB,EAAiB,EAAGvpB,EAAWupB,EAAiB,GAEtG3oB,EAAc,EAAG,CACnB,MAAM4oB,EAAiBtjE,KAAK8C,IAAI+sB,EAAc6qB,EAAa3+B,GAAgB89B,EAAaC,IACxF7uB,EAAIqE,IAAI7oB,EAAGiR,EAAGgjC,EAAc7qB,EAAc,EAAGiqB,EAAWwpB,EAAiB,EAAGzpB,EAAaypB,EAAiB,GAAG,E,KACxG,CACL,MAAMC,EAAYvjE,KAAK8C,IAAI+sB,EAAc,EAAG8qB,EAAc5+B,GAAgB89B,EAAaC,IAEvF,GAAwB,UAApBlW,EACF3Y,EAAIqE,IAAI7oB,EAAGiR,EAAG6rD,EAAWzpB,EAAWphC,GAAK,EAAGmhC,EAAanhC,GAAK,GAAG,QAC5D,GAAwB,UAApBkrB,EAA6B,CACtC,MAAMv/B,EAAI,EAAIk/D,EAAYA,EACpBtpB,GAAQ51C,EAAIrE,KAAK6iB,IAAIi3B,EAAWphC,GAAK,GAAKjS,EAC1CyzC,GAAQ71C,EAAIrE,KAAK4hB,IAAIk4B,EAAWphC,GAAK,GAAKhB,EAC1CqiC,EAAS11C,EAAIrE,KAAK6iB,IAAIg3B,EAAanhC,GAAK,GAAKjS,EAC7CuzC,EAAS31C,EAAIrE,KAAK4hB,IAAIi4B,EAAanhC,GAAK,GAAKhB,EACnDuT,EAAIwE,OAAOwqB,EAAMC,GACjBjvB,EAAIwE,OAAOsqB,EAAQC,E,EAGvB/uB,EAAIsE,YAEJtE,EAAIuE,OAAO,EAAG,GACdvE,EAAI0E,KAAK,EAAG,EAAG1E,EAAIiD,OAAOl9B,MAAOi6B,EAAIiD,OAAOI,QAE5CrD,EAAIpD,KAAK,UACX,CAGA,SAAS27C,GAAQv4C,EAA+BkR,EAAqB2d,GACnE,MAAM,WAACD,EAAA,YAAY4pB,EAAA,EAAah9D,EAAA,EAAGiR,EAAA,YAAGijC,EAAA,YAAaD,GAAeve,EAClE,IAAIunC,EAAcD,EAAc9oB,EAIhC1vB,EAAImE,YACJnE,EAAIqE,IAAI7oB,EAAGiR,EAAGijC,EAAad,EAAa6pB,EAAa5pB,EAAW4pB,GAC5DhpB,EAAc+oB,GAChBC,EAAcD,EAAc/oB,EAC5BzvB,EAAIqE,IAAI7oB,EAAGiR,EAAGgjC,EAAaZ,EAAW4pB,EAAa7pB,EAAa6pB,GAAa,IAE7Ez4C,EAAIqE,IAAI7oB,EAAGiR,EAAG+rD,EAAa3pB,EAAW9gC,GAAS6gC,EAAa7gC,IAE9DiS,EAAIsE,YACJtE,EAAIpD,MACN,CAEA,SAAS87C,GAAgB9tE,GACvB,OAAOw9B,GAAkBx9B,EAAO,CAAC,aAAc,WAAY,aAAc,YAC3E,CAKA,SAAS+tE,GAAkBt0C,EAAiBorB,EAAqBC,EAAqBkpB,GACpF,MAAMpsD,EAAIksD,GAAgBr0C,EAAIzwB,QAAQ+9C,cAChCknB,GAAiBnpB,EAAcD,GAAe,EAC9CqpB,EAAa/jE,KAAK8C,IAAIghE,EAAeD,EAAanpB,EAAc,GAShEspB,EAAqB9vD,IACzB,MAAM+vD,GAAiBtpB,EAAc36C,KAAK8C,IAAIghE,EAAe5vD,IAAQ2vD,EAAa,EAClF,OAAOtnD,GAAYrI,EAAK,EAAGlU,KAAK8C,IAAIghE,EAAeG,KAGrD,MAAO,CACLC,WAAYF,EAAkBvsD,EAAEysD,YAChCC,SAAUH,EAAkBvsD,EAAE0sD,UAC9BC,WAAY7nD,GAAY9E,EAAE2sD,WAAY,EAAGL,GACzCM,SAAU9nD,GAAY9E,EAAE4sD,SAAU,EAAGN,GAEzC,CAKA,SAASO,GAAWjgE,EAAWkgE,EAAe99D,EAAWiR,GACvD,MAAO,CACLjR,EAAGA,EAAIpC,EAAIrE,KAAK6iB,IAAI0hD,GACpB7sD,EAAGA,EAAIrT,EAAIrE,KAAK4hB,IAAI2iD,GAExB,CAiBA,SAASC,GACPv5C,EACAkR,EACAzU,EACAwzB,EACAj/B,EACA4iC,GAEA,MAAM,EAACp4C,EAAA,EAAGiR,EAAGmiC,WAAYxiD,EAAK,YAAEosE,EAAa/oB,YAAa+pB,GAAUtoC,EAE9Dwe,EAAc36C,KAAK6C,IAAIs5B,EAAQwe,YAAcO,EAAUxzB,EAAS+7C,EAAa,GAC7E/oB,EAAc+pB,EAAS,EAAIA,EAASvpB,EAAUxzB,EAAS+7C,EAAc,EAE3E,IAAIiB,EAAgB,EACpB,MAAM//D,EAAQsX,EAAM5kB,EAEpB,GAAI6jD,EAAS,CAIX,MAAMypB,EAAuBF,EAAS,EAAIA,EAASvpB,EAAU,EACvD0pB,EAAuBjqB,EAAc,EAAIA,EAAcO,EAAU,EACjE2pB,GAAsBF,EAAuBC,GAAwB,EACrEE,EAAuC,IAAvBD,EAA2BlgE,EAASkgE,GAAuBA,EAAqB3pB,GAAWv2C,EACjH+/D,GAAiB//D,EAAQmgE,GAAiB,C,CAG5C,MAAMC,EAAO/kE,KAAK6C,IAAI,KAAO8B,EAAQg2C,EAAcjzB,EAAShP,IAAMiiC,EAC5DqqB,GAAergE,EAAQogE,GAAQ,EAC/BlrB,EAAaxiD,EAAQ2tE,EAAcN,EACnC5qB,EAAW79B,EAAM+oD,EAAcN,GAC/B,WAACR,EAAA,SAAYC,EAAA,WAAUC,EAAU,SAAEC,GAAYT,GAAkBznC,EAASue,EAAaC,EAAab,EAAWD,GAE/GorB,EAA2BtqB,EAAcupB,EACzCgB,EAAyBvqB,EAAcwpB,EACvCgB,EAA0BtrB,EAAaqqB,EAAae,EACpDG,EAAwBtrB,EAAWqqB,EAAWe,EAE9CG,EAA2B3qB,EAAc0pB,EACzCkB,EAAyB5qB,EAAc2pB,EACvCkB,EAA0B1rB,EAAauqB,EAAaiB,EACpDG,EAAwB1rB,EAAWuqB,EAAWiB,EAIpD,GAFAr6C,EAAImE,YAEAyvB,EAAU,CAEZ,MAAM4mB,GAAyBN,EAA0BC,GAAyB,EAKlF,GAJAn6C,EAAIqE,IAAI7oB,EAAGiR,EAAGijC,EAAawqB,EAAyBM,GACpDx6C,EAAIqE,IAAI7oB,EAAGiR,EAAGijC,EAAa8qB,EAAuBL,GAG9CjB,EAAW,EAAG,CAChB,MAAMuB,EAAUpB,GAAWY,EAAwBE,EAAuB3+D,EAAGiR,GAC7EuT,EAAIqE,IAAIo2C,EAAQj/D,EAAGi/D,EAAQhuD,EAAGysD,EAAUiB,EAAuBtrB,EAAW9gC,G,CAI5E,MAAM2sD,EAAKrB,GAAWgB,EAAwBxrB,EAAUrzC,EAAGiR,GAI3D,GAHAuT,EAAIwE,OAAOk2C,EAAGl/D,EAAGk/D,EAAGjuD,GAGhB2sD,EAAW,EAAG,CAChB,MAAMqB,EAAUpB,GAAWgB,EAAwBE,EAAuB/+D,EAAGiR,GAC7EuT,EAAIqE,IAAIo2C,EAAQj/D,EAAGi/D,EAAQhuD,EAAG2sD,EAAUvqB,EAAW9gC,GAASwsD,EAAwBxlE,KAAK0Y,G,CAI3F,MAAMktD,GAA0B9rB,EAAYuqB,EAAW3pB,GAAiBb,EAAcuqB,EAAa1pB,IAAiB,EAKpH,GAJAzvB,EAAIqE,IAAI7oB,EAAGiR,EAAGgjC,EAAaZ,EAAYuqB,EAAW3pB,EAAckrB,GAAuB,GACvF36C,EAAIqE,IAAI7oB,EAAGiR,EAAGgjC,EAAakrB,EAAuB/rB,EAAcuqB,EAAa1pB,GAAc,GAGvF0pB,EAAa,EAAG,CAClB,MAAMsB,EAAUpB,GAAWe,EAA0BE,EAAyB9+D,EAAGiR,GACjFuT,EAAIqE,IAAIo2C,EAAQj/D,EAAGi/D,EAAQhuD,EAAG0sD,EAAYmB,EAA0BvlE,KAAK0Y,GAAImhC,EAAa7gC,G,CAI5F,MAAM6sD,EAAKvB,GAAWW,EAA0BprB,EAAYpzC,EAAGiR,GAI/D,GAHAuT,EAAIwE,OAAOo2C,EAAGp/D,EAAGo/D,EAAGnuD,GAGhBwsD,EAAa,EAAG,CAClB,MAAMwB,EAAUpB,GAAWW,EAA0BE,EAAyB1+D,EAAGiR,GACjFuT,EAAIqE,IAAIo2C,EAAQj/D,EAAGi/D,EAAQhuD,EAAGwsD,EAAYrqB,EAAa7gC,GAASmsD,E,MAE7D,CACLl6C,EAAIuE,OAAO/oB,EAAGiR,GAEd,MAAMouD,EAAc9lE,KAAK6iB,IAAIsiD,GAA2BxqB,EAAcl0C,EAChEs/D,EAAc/lE,KAAK4hB,IAAIujD,GAA2BxqB,EAAcjjC,EACtEuT,EAAIwE,OAAOq2C,EAAaC,GAExB,MAAMC,EAAYhmE,KAAK6iB,IAAIuiD,GAAyBzqB,EAAcl0C,EAC5Dw/D,EAAYjmE,KAAK4hB,IAAIwjD,GAAyBzqB,EAAcjjC,EAClEuT,EAAIwE,OAAOu2C,EAAWC,E,CAGxBh7C,EAAIsE,WACN,CAEA,SAAS22C,GACPj7C,EACAkR,EACAzU,EACAwzB,EACA2D,GAEA,MAAM,YAACsnB,EAAW,WAAEtsB,EAAA,cAAYJ,GAAiBtd,EACjD,IAAI2d,EAAW3d,EAAQ2d,SACvB,GAAIqsB,EAAa,CACf3B,GAAQv5C,EAAKkR,EAASzU,EAAQwzB,EAASpB,EAAU+E,GACjD,IAAK,IAAIt5C,EAAI,EAAGA,EAAI4gE,IAAe5gE,EACjC0lB,EAAI2E,OAEDrV,MAAMk/B,KACTK,EAAWD,GAAcJ,EAAgB9gC,IAAOA,I,CAKpD,OAFA6rD,GAAQv5C,EAAKkR,EAASzU,EAAQwzB,EAASpB,EAAU+E,GACjD5zB,EAAI2E,OACGkqB,CACT,CAEA,SAASob,GACPjqC,EACAkR,EACAzU,EACAwzB,EACA2D,GAEA,MAAM,YAACsnB,EAAA,WAAatsB,EAAA,cAAYJ,EAAa,QAAE56C,GAAWs9B,GACpD,YAACtM,EAAW,gBAAE+T,EAAe,WAAEF,EAAU,iBAAEC,EAAgB,aAAEiZ,GAAgB/9C,EAC7EunE,EAAgC,UAAxBvnE,EAAQw9C,YAEtB,IAAKxsB,EACH,OAGF5E,EAAIgqC,YAAYvxB,GAAc,IAC9BzY,EAAI8xB,eAAiBpZ,EAEjByiC,GACFn7C,EAAIjD,UAA0B,EAAd6H,EAChB5E,EAAI+xB,SAAWpZ,GAAmB,UAElC3Y,EAAIjD,UAAY6H,EAChB5E,EAAI+xB,SAAWpZ,GAAmB,SAGpC,IAAIkW,EAAW3d,EAAQ2d,SACvB,GAAIqsB,EAAa,CACf3B,GAAQv5C,EAAKkR,EAASzU,EAAQwzB,EAASpB,EAAU+E,GACjD,IAAK,IAAIt5C,EAAI,EAAGA,EAAI4gE,IAAe5gE,EACjC0lB,EAAI6E,SAEDvV,MAAMk/B,KACTK,EAAWD,GAAcJ,EAAgB9gC,IAAOA,I,CAIhDytD,GACF5C,GAAQv4C,EAAKkR,EAAS2d,GAGpBj7C,EAAQwnE,UAAYvsB,EAAWD,GAAcnhC,IAAuB,IAAjBkkC,GAA0C,UAApBhZ,GAC3Ew/B,GAASn4C,EAAKkR,EAAS2d,GAGpBqsB,IACH3B,GAAQv5C,EAAKkR,EAASzU,EAAQwzB,EAASpB,EAAU+E,GACjD5zB,EAAI6E,SAER,ED48BA2mB,EAAAA,GAAAA,GAvoCM+mB,GAAA,WAEcp5C,KAASqyB,EAAAA,GAAAA,GAFvB+mB,GAAA,YAGeR,KAAUvmB,EAAAA,GAAAA,GAHzB+mB,GAAA,YAIe9zC,KAAU+sB,EAAAA,GAAAA,GAJzB+mB,GAAA,WAKcpe,KAAS3I,EAAAA,GAAAA,GALvB+mB,GAAA,UAMax/D,KAAQy4C,EAAAA,GAAAA,GANrB+mB,GAAA,WAOcP,IC8LL,MAAMqJ,WAAmBzc,GAoCtC12C,WAAAA,CAAYszB,GACVkQ,SAAKF,EAAAA,GAAAA,GAAC,KAAD,yBAAAA,EAAAA,GAAAA,GAAC,KAAD,oBAAAA,EAAAA,GAAAA,GAAC,KAAD,uBAAAA,EAAAA,GAAAA,GAAC,KAAD,uBAAAA,EAAAA,GAAAA,GAAC,KAAD,uBAAAA,EAAAA,GAAAA,GAAC,KAAD,uBAAAA,EAAAA,GAAAA,GAAC,KAAD,qBAEL1lD,KAAK8N,aAAUgG,EACf9T,KAAK0oD,mBAAgB50C,EACrB9T,KAAK8oD,gBAAah1C,EAClB9T,KAAK+oD,cAAWj1C,EAChB9T,KAAK2pD,iBAAc71C,EACnB9T,KAAK4pD,iBAAc91C,EACnB9T,KAAK0yE,YAAc,EACnB1yE,KAAKo1E,YAAc,EAEf1/B,GACF1nC,OAAO8T,OAAO9hB,KAAM01C,EAExB,CAEAwa,OAAAA,CAAQslB,EAAgBC,EAAgB1lB,GACtC,MAAMhgC,EAAQ/vB,KAAKowD,SAAS,CAAC,IAAK,KAAML,IAClC,MAACtlC,EAAK,SAAEE,GAAYR,GAAkB4F,EAAO,CAACra,EAAG8/D,EAAQ7uD,EAAG8uD,KAC5D,WAAC3sB,EAAA,SAAYC,EAAA,YAAUY,EAAW,YAAEC,EAAW,cAAElB,GAAiB1oD,KAAKowD,SAAS,CACpF,aACA,WACA,cACA,cACA,iBACCL,GACG2lB,GAAW11E,KAAK8N,QAAQq8C,QAAUnqD,KAAK8N,QAAQgxB,aAAe,EAC9DgsB,EAAiBxmC,GAAeokC,EAAeK,EAAWD,GAC1D6sB,EAAiB1qD,GAAcR,EAAOq+B,EAAYC,IAAaD,IAAeC,EAC9E6sB,EAAgB9qB,GAAkBljC,IAAO+tD,EACzCE,EAAenqD,GAAWf,EAAUg/B,EAAc+rB,EAAS9rB,EAAc8rB,GAE/E,OAAQE,GAAiBC,CAC3B,CAEArlB,cAAAA,CAAeT,GACb,MAAM,EAACr6C,EAAC,EAAEiR,EAAC,WAAEmiC,EAAA,SAAYC,EAAA,YAAUY,EAAA,YAAaC,GAAe5pD,KAAKowD,SAAS,CAC3E,IACA,IACA,aACA,WACA,cACA,eACCL,IACG,OAACp5B,EAAA,QAAQwzB,GAAWnqD,KAAK8N,QACzBgoE,GAAahtB,EAAaC,GAAY,EACtCgtB,GAAcpsB,EAAcC,EAAcO,EAAUxzB,GAAU,EACpE,MAAO,CACLjhB,EAAGA,EAAIzG,KAAK6iB,IAAIgkD,GAAaC,EAC7BpvD,EAAGA,EAAI1X,KAAK4hB,IAAIilD,GAAaC,EAEjC,CAEAhd,eAAAA,CAAgBhJ,GACd,OAAO/vD,KAAKwwD,eAAeT,EAC7B,CAEA1b,IAAAA,CAAKna,GACH,MAAM,QAACpsB,EAAO,cAAE46C,GAAiB1oD,KAC3B22B,GAAU7oB,EAAQ6oB,QAAU,GAAK,EACjCwzB,GAAWr8C,EAAQq8C,SAAW,GAAK,EACnC2D,EAAWhgD,EAAQggD,SAIzB,GAHA9tD,KAAK0yE,YAAuC,UAAxB5kE,EAAQw9C,YAA2B,IAAO,EAC9DtrD,KAAKo1E,YAAc1sB,EAAgB9gC,GAAM3Y,KAAK2Z,MAAM8/B,EAAgB9gC,IAAO,EAErD,IAAlB8gC,GAAuB1oD,KAAK2pD,YAAc,GAAK3pD,KAAK4pD,YAAc,EACpE,OAGF1vB,EAAIsC,OAEJ,MAAMs5C,GAAa91E,KAAK8oD,WAAa9oD,KAAK+oD,UAAY,EACtD7uB,EAAIiE,UAAUlvB,KAAK6iB,IAAIgkD,GAAan/C,EAAQ1nB,KAAK4hB,IAAIilD,GAAan/C,GAClE,MAAMq/C,EAAM,EAAI/mE,KAAK4hB,IAAI5hB,KAAK8C,IAAI4V,GAAI+gC,GAAiB,IACjDutB,EAAet/C,EAASq/C,EAE9B97C,EAAIgG,UAAYpyB,EAAQsrB,gBACxBc,EAAI6G,YAAcjzB,EAAQurB,YAE1B87C,GAAQj7C,EAAKl6B,KAAMi2E,EAAc9rB,EAAS2D,GAC1CqW,GAAWjqC,EAAKl6B,KAAMi2E,EAAc9rB,EAAS2D,GAE7C5zB,EAAI0C,SACN,ECxZF,SAASs5C,GAASh8C,EAAKpsB,EAASzP,EAAQyP,GACtCosB,EAAIi8C,QAAU7xD,GAAejmB,EAAMq0C,eAAgB5kC,EAAQ4kC,gBAC3DxY,EAAIgqC,YAAY5/C,GAAejmB,EAAMs0C,WAAY7kC,EAAQ6kC,aACzDzY,EAAI8xB,eAAiB1nC,GAAejmB,EAAMu0C,iBAAkB9kC,EAAQ8kC,kBACpE1Y,EAAI+xB,SAAW3nC,GAAejmB,EAAMw0C,gBAAiB/kC,EAAQ+kC,iBAC7D3Y,EAAIjD,UAAY3S,GAAejmB,EAAMygC,YAAahxB,EAAQgxB,aAC1D5E,EAAI6G,YAAczc,GAAejmB,EAAMg7B,YAAavrB,EAAQurB,YAC9D,CAEA,SAASqF,GAAOxE,EAAKoF,EAAU3Z,GAC7BuU,EAAIwE,OAAO/Y,EAAOjQ,EAAGiQ,EAAOgB,EAC9B,CAKA,SAASyvD,GAActoE,GACrB,OAAIA,EAAQuoE,QACHh3C,GAGLvxB,EAAQ08B,SAA8C,aAAnC18B,EAAQw8B,uBACtB7K,GAGFf,EACT,CAEA,SAAS43C,GAASvnD,EAAQqhB,EAAS0hB,EAAS,IAC1C,MAAMzjD,EAAQ0gB,EAAOroB,QACdJ,MAAOiwE,EAAc,EAAGrrD,IAAKsrD,EAAYnoE,EAAQ,GAAKyjD,GACtDxrD,MAAOmwE,EAAcvrD,IAAKwrD,GAActmC,EACzC9pC,EAAQ2I,KAAK6C,IAAIykE,EAAaE,GAC9BvrD,EAAMjc,KAAK8C,IAAIykE,EAAWE,GAC1BC,EAAUJ,EAAcE,GAAgBD,EAAYC,GAAgBF,EAAcG,GAAcF,EAAYE,EAElH,MAAO,CACLroE,QACA/H,QACA+K,KAAM++B,EAAQ/+B,KACdiU,KAAM4F,EAAM5kB,IAAUqwE,EAAUtoE,EAAQ6c,EAAM5kB,EAAQ4kB,EAAM5kB,EAEhE,CAiBA,SAASswE,GAAY18C,EAAKoG,EAAM8P,EAAS0hB,GACvC,MAAM,OAAC/iC,EAAA,QAAQjhB,GAAWwyB,GACpB,MAACjyB,EAAA,MAAO/H,EAAA,KAAO+K,EAAA,KAAMiU,GAAQgxD,GAASvnD,EAAQqhB,EAAS0hB,GACvD+kB,EAAaT,GAActoE,GAEjC,IACI0G,EAAGub,EAAOwa,GADV,KAACwX,GAAO,EAAI,QAAE78B,GAAW4sC,GAAU,CAAC,EAGxC,IAAKt9C,EAAI,EAAGA,GAAK8Q,IAAQ9Q,EACvBub,EAAQhB,GAAQzoB,GAAS4e,EAAUI,EAAO9Q,EAAIA,IAAMnG,GAEhD0hB,EAAMiY,OAGC+Z,GACT7nB,EAAIuE,OAAO1O,EAAMra,EAAGqa,EAAMpJ,GAC1Bo7B,GAAO,GAEP80B,EAAW38C,EAAKqQ,EAAMxa,EAAO7K,EAASpX,EAAQuoE,SAGhD9rC,EAAOxa,GAQT,OALI1e,IACF0e,EAAQhB,GAAQzoB,GAAS4e,EAAUI,EAAO,IAAMjX,GAChDwoE,EAAW38C,EAAKqQ,EAAMxa,EAAO7K,EAASpX,EAAQuoE,YAGvChlE,CACX,CAiBA,SAASylE,GAAgB58C,EAAKoG,EAAM8P,EAAS0hB,GAC3C,MAAM/iC,EAASuR,EAAKvR,QACd,MAAC1gB,EAAK,MAAE/H,EAAK,KAAEgf,GAAQgxD,GAASvnD,EAAQqhB,EAAS0hB,IACjD,KAAC/P,GAAO,EAAI,QAAE78B,GAAW4sC,GAAU,CAAC,EAC1C,IAEIt9C,EAAGub,EAAOgnD,EAAOttB,EAAMF,EAAMytB,EAF7BC,EAAO,EACPC,EAAS,EAGb,MAAMC,EAAcz4E,IAAW4H,GAAS4e,EAAUI,EAAO5mB,EAAQA,IAAU2P,EACrE+oE,EAAQA,KACR3tB,IAASF,IAEXrvB,EAAIwE,OAAOu4C,EAAM1tB,GACjBrvB,EAAIwE,OAAOu4C,EAAMxtB,GAGjBvvB,EAAIwE,OAAOu4C,EAAMD,KASrB,IALIj1B,IACFhyB,EAAQhB,EAAOooD,EAAW,IAC1Bj9C,EAAIuE,OAAO1O,EAAMra,EAAGqa,EAAMpJ,IAGvBnS,EAAI,EAAGA,GAAK8Q,IAAQ9Q,EAAG,CAG1B,GAFAub,EAAQhB,EAAOooD,EAAW3iE,IAEtBub,EAAMiY,KAER,SAGF,MAAMtyB,EAAIqa,EAAMra,EACViR,EAAIoJ,EAAMpJ,EACV0wD,EAAa,EAAJ3hE,EAEX2hE,IAAWN,GAETpwD,EAAI8iC,EACNA,EAAO9iC,EACEA,EAAI4iC,IACbA,EAAO5iC,GAGTswD,GAAQC,EAASD,EAAOvhE,KAAOwhE,IAE/BE,IAGAl9C,EAAIwE,OAAOhpB,EAAGiR,GAEdowD,EAAQM,EACRH,EAAS,EACTztB,EAAOF,EAAO5iC,GAGhBqwD,EAAQrwD,CACV,CACAywD,GACF,CAOA,SAASE,GAAkBh3C,GACzB,MAAMN,EAAOM,EAAKxyB,QACZ6kC,EAAa3S,EAAK2S,YAAc3S,EAAK2S,WAAWjsC,OAChD6wE,GAAej3C,EAAKgsB,aAAehsB,EAAKkR,QAAUxR,EAAKwK,SAA2C,aAAhCxK,EAAKsK,yBAA0CtK,EAAKq2C,UAAY1jC,EACxI,OAAO4kC,EAAcT,GAAkBF,EACzC,CAKA,SAASY,GAAwB1pE,GAC/B,OAAIA,EAAQuoE,QACH3nC,GAGL5gC,EAAQ08B,SAA8C,aAAnC18B,EAAQw8B,uBACtBqE,GAGFF,EACT,CAEA,SAASgpC,GAAoBv9C,EAAKoG,EAAMh6B,EAAO+H,GAC7C,IAAIqpE,EAAOp3C,EAAKq3C,MACXD,IACHA,EAAOp3C,EAAKq3C,MAAQ,IAAIC,OACpBt3C,EAAKo3C,KAAKA,EAAMpxE,EAAO+H,IACzBqpE,EAAKl5C,aAGT03C,GAASh8C,EAAKoG,EAAKxyB,SACnBosB,EAAI6E,OAAO24C,EACb,CAEA,SAASG,GAAiB39C,EAAKoG,EAAMh6B,EAAO+H,GAC1C,MAAM,SAAC2iC,EAAA,QAAUljC,GAAWwyB,EACtBw3C,EAAgBR,GAAkBh3C,GAExC,IAAK,MAAM8P,KAAWY,EACpBklC,GAASh8C,EAAKpsB,EAASsiC,EAAQ/xC,OAC/B67B,EAAImE,YACAy5C,EAAc59C,EAAKoG,EAAM8P,EAAS,CAAC9pC,QAAO4kB,IAAK5kB,EAAQ+H,EAAQ,KACjE6rB,EAAIsE,YAENtE,EAAI6E,QAER,ED8LA2mB,EAAAA,GAAAA,GAzHqB6vB,GAAmB,KAE1B,QAAM7vB,EAAAA,GAAAA,GAFC6vB,GAAmB,WAIpB,CAChBjqB,YAAa,SACbjyB,YAAa,OACbsZ,WAAY,GACZC,iBAAkB,EAClBC,qBAAiB/+B,EACjB+3C,aAAc,EACd/sB,YAAa,EACbnI,OAAQ,EACRwzB,QAAS,EACT1/B,WAAO3W,EACPg6C,UAAU,EACVwnB,UAAU,KACV5vB,EAAAA,GAAAA,GAjBiB6vB,GAAmB,gBAmBf,CACrBn8C,gBAAiB,qBACjBssB,EAAAA,GAAAA,GArBiB6vB,GAAmB,cAuBjB,CACnB5hD,aAAa,EACbD,WAAat0B,GAAkB,eAATA,IC5F1B,MAAM24E,GAA8B,oBAAXH,OAEzB,SAASvjC,GAAKna,EAAKoG,EAAMh6B,EAAO+H,GAC1B0pE,KAAcz3C,EAAKxyB,QAAQsiC,QAC7BqnC,GAAoBv9C,EAAKoG,EAAMh6B,EAAO+H,GAEtCwpE,GAAiB39C,EAAKoG,EAAMh6B,EAAO+H,EAEvC,CAEe,MAAM2pE,WAAoBlf,GAoCvC12C,WAAAA,CAAYszB,GACVkQ,QAEA5lD,KAAKusD,UAAW,EAChBvsD,KAAK8N,aAAUgG,EACf9T,KAAK8xC,YAASh+B,EACd9T,KAAKwxC,WAAQ19B,EACb9T,KAAK2xC,eAAY79B,EACjB9T,KAAK23E,WAAQ7jE,EACb9T,KAAKi4E,aAAUnkE,EACf9T,KAAKk4E,eAAYpkE,EACjB9T,KAAKssD,YAAa,EAClBtsD,KAAKm4E,gBAAiB,EACtBn4E,KAAKiyC,mBAAgBn+B,EAEjB4hC,GACF1nC,OAAO8T,OAAO9hB,KAAM01C,EAExB,CAEAoX,mBAAAA,CAAoB9Z,EAAW3Y,GAC7B,MAAMvsB,EAAU9N,KAAK8N,QACrB,IAAKA,EAAQ08B,SAA8C,aAAnC18B,EAAQw8B,0BAA2Cx8B,EAAQuoE,UAAYr2E,KAAKm4E,eAAgB,CAClH,MAAM9mE,EAAOvD,EAAQwhB,SAAWtvB,KAAKwxC,MAAQxxC,KAAK2xC,UAClDvH,GAA2BpqC,KAAKi4E,QAASnqE,EAASklC,EAAW3hC,EAAMgpB,GACnEr6B,KAAKm4E,gBAAiB,C,CAE1B,CAEA,UAAIppD,CAAOA,GACT/uB,KAAKi4E,QAAUlpD,SACR/uB,KAAKk4E,iBACLl4E,KAAK23E,MACZ33E,KAAKm4E,gBAAiB,CACxB,CAEA,UAAIppD,GACF,OAAO/uB,KAAKi4E,OACd,CAEA,YAAIjnC,GACF,OAAOhxC,KAAKk4E,YAAcl4E,KAAKk4E,UAAY5mC,GAAiBtxC,KAAMA,KAAK8N,QAAQsiC,SACjF,CAMAupB,KAAAA,GACE,MAAM3oB,EAAWhxC,KAAKgxC,SAChBjiB,EAAS/uB,KAAK+uB,OACpB,OAAOiiB,EAAStqC,QAAUqoB,EAAOiiB,EAAS,GAAG1qC,MAC/C,CAMA4lB,IAAAA,GACE,MAAM8kB,EAAWhxC,KAAKgxC,SAChBjiB,EAAS/uB,KAAK+uB,OACd1gB,EAAQ2iC,EAAStqC,OACvB,OAAO2H,GAAS0gB,EAAOiiB,EAAS3iC,EAAQ,GAAG6c,IAC7C,CASA7J,WAAAA,CAAY0O,EAAOlG,GACjB,MAAM/b,EAAU9N,KAAK8N,QACfhJ,EAAQirB,EAAMlG,GACdkF,EAAS/uB,KAAK+uB,OACdiiB,EAAWD,GAAe/wC,KAAM,CAAC6pB,WAAUvjB,MAAOxB,EAAOomB,IAAKpmB,IAEpE,IAAKksC,EAAStqC,OACZ,OAGF,MAAMsiB,EAAS,GACTovD,EAAeZ,GAAwB1pE,GAC7C,IAAI0G,EAAG8Q,EACP,IAAK9Q,EAAI,EAAG8Q,EAAO0rB,EAAStqC,OAAQ8N,EAAI8Q,IAAQ9Q,EAAG,CACjD,MAAM,MAAClO,EAAA,IAAO4kB,GAAO8lB,EAASx8B,GACxBa,EAAK0Z,EAAOzoB,GACZgP,EAAKyZ,EAAO7D,GAClB,GAAI7V,IAAOC,EAAI,CACb0T,EAAOhC,KAAK3R,GACZ,Q,CAEF,MAAMmM,EAAIvS,KAAKuZ,KAAK1jB,EAAQuQ,EAAGwU,KAAcvU,EAAGuU,GAAYxU,EAAGwU,KACzDwuD,EAAeD,EAAa/iE,EAAIC,EAAIkM,EAAG1T,EAAQuoE,SACrDgC,EAAaxuD,GAAYkG,EAAMlG,GAC/Bb,EAAOhC,KAAKqxD,EACd,CACA,OAAyB,IAAlBrvD,EAAOtiB,OAAesiB,EAAO,GAAKA,CAC3C,CAgBA4tD,WAAAA,CAAY18C,EAAKkW,EAAS0hB,GACxB,MAAMgmB,EAAgBR,GAAkBt3E,MACxC,OAAO83E,EAAc59C,EAAKl6B,KAAMowC,EAAS0hB,EAC3C,CASA4lB,IAAAA,CAAKx9C,EAAK5zB,EAAO+H,GACf,MAAM2iC,EAAWhxC,KAAKgxC,SAChB8mC,EAAgBR,GAAkBt3E,MACxC,IAAIqR,EAAOrR,KAAKwxC,MAEhBlrC,EAAQA,GAAS,EACjB+H,EAAQA,GAAUrO,KAAK+uB,OAAOroB,OAASJ,EAEvC,IAAK,MAAM8pC,KAAWY,EACpB3/B,GAAQymE,EAAc59C,EAAKl6B,KAAMowC,EAAS,CAAC9pC,QAAO4kB,IAAK5kB,EAAQ+H,EAAQ,IAEzE,QAASgD,CACX,CASAgjC,IAAAA,CAAKna,EAAK8Y,EAAW1sC,EAAO+H,GAC1B,MAAMP,EAAU9N,KAAK8N,SAAW,CAAC,EAC3BihB,EAAS/uB,KAAK+uB,QAAU,GAE1BA,EAAOroB,QAAUoH,EAAQgxB,cAC3B5E,EAAIsC,OAEJ6X,GAAKna,EAAKl6B,KAAMsG,EAAO+H,GAEvB6rB,EAAI0C,WAGF58B,KAAKusD,WAEPvsD,KAAKm4E,gBAAiB,EACtBn4E,KAAK23E,WAAQ7jE,EAEjB,ECjbF,SAASwkE,GAAQ73E,EAAkBorC,EAAarc,EAAiBugC,GAC/D,MAAMjiD,EAAUrN,EAAGqN,SACZ,CAAC0hB,GAAO1qB,GAASrE,EAAG2vD,SAAS,CAAC5gC,GAAOugC,GAE5C,OAAQ9gD,KAAKuZ,IAAIqjB,EAAM/mC,GAASgJ,EAAQmwB,OAASnwB,EAAQyqE,SAC3D,ED6aA7yB,EAAAA,GAAAA,GA1MqBsyB,GAAoB,KAE3B,SAAOtyB,EAAAA,GAAAA,GAFAsyB,GAAoB,WAOrB,CAChBtlC,eAAgB,OAChBC,WAAY,GACZC,iBAAkB,EAClBC,gBAAiB,QACjB/T,YAAa,EACbkL,iBAAiB,EACjBM,uBAAwB,UACxBzL,MAAM,EACNvP,UAAU,EACV+mD,SAAS,EACT7rC,QAAS,KACTkb,EAAAA,GAAAA,GAnBiBsyB,GAAoB,gBAwBhB,CACrB5+C,gBAAiB,kBACjBC,YAAa,iBACbqsB,EAAAA,GAAAA,GA3BiBsyB,GAAoB,cA8BlB,CACnBrkD,aAAa,EACbD,WAAat0B,GAAkB,eAATA,GAAkC,SAATA,IC/PpC,MAAMo5E,WAAqB1f,GA6BxC12C,WAAAA,CAAYszB,GACVkQ,SAAKF,EAAAA,GAAAA,GAAC,KAAD,kBAAAA,EAAAA,GAAAA,GAAC,KAAD,gBAAAA,EAAAA,GAAAA,GAAC,KAAD,eAEL1lD,KAAK8N,aAAUgG,EACf9T,KAAK4nC,YAAS9zB,EACd9T,KAAKgoC,UAAOl0B,EACZ9T,KAAKqxC,UAAOv9B,EAER4hC,GACF1nC,OAAO8T,OAAO9hB,KAAM01C,EAExB,CAEAwa,OAAAA,CAAQuoB,EAAgBC,EAAgB3oB,GACtC,MAAMjiD,EAAU9N,KAAK8N,SACf,EAAC4H,EAAA,EAAGiR,GAAK3mB,KAAKowD,SAAS,CAAC,IAAK,KAAML,GACzC,OAAS9gD,KAAKmS,IAAIq3D,EAAS/iE,EAAG,GAAKzG,KAAKmS,IAAIs3D,EAAS/xD,EAAG,GAAM1X,KAAKmS,IAAItT,EAAQyqE,UAAYzqE,EAAQmwB,OAAQ,EAC7G,CAEA06C,QAAAA,CAASF,EAAgB1oB,GACvB,OAAOuoB,GAAQt4E,KAAMy4E,EAAQ,IAAK1oB,EACpC,CAEA6oB,QAAAA,CAASF,EAAgB3oB,GACvB,OAAOuoB,GAAQt4E,KAAM04E,EAAQ,IAAK3oB,EACpC,CAEAS,cAAAA,CAAeT,GACb,MAAM,EAACr6C,EAAA,EAAGiR,GAAK3mB,KAAKowD,SAAS,CAAC,IAAK,KAAML,GACzC,MAAO,CAACr6C,IAAGiR,IACb,CAEAtZ,IAAAA,CAAKS,GACHA,EAAUA,GAAW9N,KAAK8N,SAAW,CAAC,EACtC,IAAImwB,EAASnwB,EAAQmwB,QAAU,EAC/BA,EAAShvB,KAAK6C,IAAImsB,EAAQA,GAAUnwB,EAAQ+qE,aAAe,GAC3D,MAAM/5C,EAAcb,GAAUnwB,EAAQgxB,aAAe,EACrD,OAAgC,GAAxBb,EAASa,EACnB,CAEAuV,IAAAA,CAAKna,EAA+B+E,GAClC,MAAMnxB,EAAU9N,KAAK8N,QAEjB9N,KAAKgoC,MAAQl6B,EAAQmwB,OAAS,KAAQe,GAAeh/B,KAAMi/B,EAAMj/B,KAAKqN,KAAKS,GAAW,KAI1FosB,EAAI6G,YAAcjzB,EAAQurB,YAC1Ba,EAAIjD,UAAYnpB,EAAQgxB,YACxB5E,EAAIgG,UAAYpyB,EAAQsrB,gBACxBoE,GAAUtD,EAAKpsB,EAAS9N,KAAK0V,EAAG1V,KAAK2mB,GACvC,CAEA0oC,QAAAA,GACE,MAAMvhD,EAAU9N,KAAK8N,SAAW,CAAC,EAEjC,OAAOA,EAAQmwB,OAASnwB,EAAQyqE,SAClC,EC3FF,SAASO,GAAaC,EAAKhpB,GACzB,MAAM,EAACr6C,EAAC,EAAEiR,EAAC,KAAEsG,EAAA,MAAMhtB,EAAA,OAAOs9B,GAAmCw7C,EAAI3oB,SAAS,CAAC,IAAK,IAAK,OAAQ,QAAS,UAAWL,GAEjH,IAAIthC,EAAMC,EAAO6F,EAAKC,EAAQwkD,EAgB9B,OAdID,EAAIj0B,YACNk0B,EAAOz7C,EAAS,EAChB9O,EAAOxf,KAAK8C,IAAI2D,EAAGuX,GACnByB,EAAQzf,KAAK6C,IAAI4D,EAAGuX,GACpBsH,EAAM5N,EAAIqyD,EACVxkD,EAAS7N,EAAIqyD,IAEbA,EAAO/4E,EAAQ,EACfwuB,EAAO/Y,EAAIsjE,EACXtqD,EAAQhZ,EAAIsjE,EACZzkD,EAAMtlB,KAAK8C,IAAI4U,EAAGsG,GAClBuH,EAASvlB,KAAK6C,IAAI6U,EAAGsG,IAGhB,CAACwB,OAAM8F,MAAK7F,QAAO8F,SAC5B,CAEA,SAASykD,GAAYjxC,EAAMljC,EAAOiN,EAAKD,GACrC,OAAOk2B,EAAO,EAAIxc,GAAY1mB,EAAOiN,EAAKD,EAC5C,CAEA,SAASonE,GAAiBH,EAAKI,EAAMC,GACnC,MAAMt0E,EAAQi0E,EAAIjrE,QAAQgxB,YACpBkJ,EAAO+wC,EAAI9zB,cACXv+B,EAAIgc,GAAO59B,GAEjB,MAAO,CACL0c,EAAGy3D,GAAYjxC,EAAKzT,IAAK7N,EAAE6N,IAAK,EAAG6kD,GACnC9lE,EAAG2lE,GAAYjxC,EAAKtZ,MAAOhI,EAAEgI,MAAO,EAAGyqD,GACvCvmE,EAAGqmE,GAAYjxC,EAAKxT,OAAQ9N,EAAE8N,OAAQ,EAAG4kD,GACzCxnE,EAAGqnE,GAAYjxC,EAAKvZ,KAAM/H,EAAE+H,KAAM,EAAG0qD,GAEzC,CAEA,SAASE,GAAkBN,EAAKI,EAAMC,GACpC,MAAM,mBAACl0B,GAAsB6zB,EAAI3oB,SAAS,CAAC,uBACrCtrD,EAAQi0E,EAAIjrE,QAAQ+9C,aACpBnlC,EAAIic,GAAc79B,GAClBw0E,EAAOrqE,KAAK8C,IAAIonE,EAAMC,GACtBpxC,EAAO+wC,EAAI9zB,cAIXs0B,EAAer0B,GAAsBjhC,GAASnf,GAEpD,MAAO,CACL+8B,QAASo3C,IAAaM,GAAgBvxC,EAAKzT,KAAOyT,EAAKvZ,KAAM/H,EAAEmb,QAAS,EAAGy3C,GAC3Et3C,SAAUi3C,IAAaM,GAAgBvxC,EAAKzT,KAAOyT,EAAKtZ,MAAOhI,EAAEsb,SAAU,EAAGs3C,GAC9Ex3C,WAAYm3C,IAAaM,GAAgBvxC,EAAKxT,QAAUwT,EAAKvZ,KAAM/H,EAAEob,WAAY,EAAGw3C,GACpFv3C,YAAak3C,IAAaM,GAAgBvxC,EAAKxT,QAAUwT,EAAKtZ,MAAOhI,EAAEqb,YAAa,EAAGu3C,GAE3F,CAEA,SAASE,GAAcT,GACrB,MAAMliD,EAASiiD,GAAaC,GACtB94E,EAAQ42B,EAAOnI,MAAQmI,EAAOpI,KAC9B8O,EAAS1G,EAAOrC,OAASqC,EAAOtC,IAChCgD,EAAS2hD,GAAiBH,EAAK94E,EAAQ,EAAGs9B,EAAS,GACnDU,EAASo7C,GAAkBN,EAAK94E,EAAQ,EAAGs9B,EAAS,GAE1D,MAAO,CACLk8C,MAAO,CACL/jE,EAAGmhB,EAAOpI,KACV9H,EAAGkQ,EAAOtC,IACVjgB,EAAGrU,EACH4R,EAAG0rB,EACHU,UAEFo3C,MAAO,CACL3/D,EAAGmhB,EAAOpI,KAAO8I,EAAO3lB,EACxB+U,EAAGkQ,EAAOtC,IAAMgD,EAAO/V,EACvBlN,EAAGrU,EAAQs3B,EAAO3lB,EAAI2lB,EAAOjkB,EAC7BzB,EAAG0rB,EAAShG,EAAO/V,EAAI+V,EAAO3kB,EAC9BqrB,OAAQ,CACN4D,QAAS5yB,KAAK6C,IAAI,EAAGmsB,EAAO4D,QAAU5yB,KAAK6C,IAAIylB,EAAO/V,EAAG+V,EAAO3lB,IAChEowB,SAAU/yB,KAAK6C,IAAI,EAAGmsB,EAAO+D,SAAW/yB,KAAK6C,IAAIylB,EAAO/V,EAAG+V,EAAOjkB,IAClEwuB,WAAY7yB,KAAK6C,IAAI,EAAGmsB,EAAO6D,WAAa7yB,KAAK6C,IAAIylB,EAAO3kB,EAAG2kB,EAAO3lB,IACtEmwB,YAAa9yB,KAAK6C,IAAI,EAAGmsB,EAAO8D,YAAc9yB,KAAK6C,IAAIylB,EAAO3kB,EAAG2kB,EAAOjkB,MAIhF,CAEA,SAAS48C,GAAQ6oB,EAAKrjE,EAAGiR,EAAGopC,GAC1B,MAAM2pB,EAAc,OAANhkE,EACRikE,EAAc,OAANhzD,EACRizD,EAAWF,GAASC,EACpB9iD,EAASkiD,IAAQa,GAAYd,GAAaC,EAAKhpB,GAErD,OAAOl5B,IACH6iD,GAAShuD,GAAWhW,EAAGmhB,EAAOpI,KAAMoI,EAAOnI,UAC3CirD,GAASjuD,GAAW/E,EAAGkQ,EAAOtC,IAAKsC,EAAOrC,QAChD,CAEA,SAASqlD,GAAU57C,GACjB,OAAOA,EAAO4D,SAAW5D,EAAO+D,UAAY/D,EAAO6D,YAAc7D,EAAO8D,WAC1E,CAOA,SAAS+3C,GAAkB5/C,EAAK0E,GAC9B1E,EAAI0E,KAAKA,EAAKlpB,EAAGkpB,EAAKjY,EAAGiY,EAAKtqB,EAAGsqB,EAAK/sB,EACxC,CAEA,SAASkoE,GAAYn7C,EAAM/4B,EAAQm0E,EAAU,IAC3C,MAAMtkE,EAAIkpB,EAAKlpB,IAAMskE,EAAQtkE,GAAK7P,EAAS,EACrC8gB,EAAIiY,EAAKjY,IAAMqzD,EAAQrzD,GAAK9gB,EAAS,EACrCyO,GAAKsqB,EAAKlpB,EAAIkpB,EAAKtqB,IAAM0lE,EAAQtkE,EAAIskE,EAAQ1lE,EAAIzO,EAAS,GAAK6P,EAC/D7D,GAAK+sB,EAAKjY,EAAIiY,EAAK/sB,IAAMmoE,EAAQrzD,EAAIqzD,EAAQnoE,EAAIhM,EAAS,GAAK8gB,EACrE,MAAO,CACLjR,EAAGkpB,EAAKlpB,EAAIA,EACZiR,EAAGiY,EAAKjY,EAAIA,EACZrS,EAAGsqB,EAAKtqB,EAAIA,EACZzC,EAAG+sB,EAAK/sB,EAAIA,EACZosB,OAAQW,EAAKX,OAEjB,EDhCAynB,EAAAA,GAAAA,GAvFqB8yB,GAAqB,KAE5B,UAMZ9yB,EAAAA,GAAAA,GARmB8yB,GAAqB,WAWtB,CAChB15C,YAAa,EACby5C,UAAW,EACXhtB,iBAAkB,EAClBstB,YAAa,EACb96C,WAAY,SACZE,OAAQ,EACRD,SAAU,KAGZ0nB,EAAAA,GAAAA,GArBmB8yB,GAAqB,gBAwBjB,CACrBp/C,gBAAiB,kBACjBC,YAAa,gBC+FF,MAAM4gD,WAAmBnhB,GAuBtC12C,WAAAA,CAAYszB,GACVkQ,QAEA5lD,KAAK8N,aAAUgG,EACf9T,KAAK8kD,gBAAahxC,EAClB9T,KAAKitB,UAAOnZ,EACZ9T,KAAKC,WAAQ6T,EACb9T,KAAKu9B,YAASzpB,EACd9T,KAAKylD,mBAAgB3xC,EAEjB4hC,GACF1nC,OAAO8T,OAAO9hB,KAAM01C,EAExB,CAEArB,IAAAA,CAAKna,GACH,MAAM,cAACurB,EAAe33C,SAAS,YAACurB,EAAA,gBAAaD,IAAoBp5B,MAC3D,MAACq1E,EAAK,MAAEoE,GAASD,GAAcx5E,MAC/Bk6E,EAAcL,GAAUJ,EAAMx7C,QAAU2D,GAAqBk4C,GAEnE5/C,EAAIsC,OAEAi9C,EAAMnlE,IAAM+gE,EAAM/gE,GAAKmlE,EAAM5nE,IAAMwjE,EAAMxjE,IAC3CqoB,EAAImE,YACJ67C,EAAYhgD,EAAK6/C,GAAYN,EAAOh0B,EAAe4vB,IACnDn7C,EAAIpD,OACJojD,EAAYhgD,EAAK6/C,GAAY1E,GAAQ5vB,EAAeg0B,IACpDv/C,EAAIgG,UAAY7G,EAChBa,EAAI2E,KAAK,YAGX3E,EAAImE,YACJ67C,EAAYhgD,EAAK6/C,GAAY1E,EAAO5vB,IACpCvrB,EAAIgG,UAAY9G,EAChBc,EAAI2E,OAEJ3E,EAAI0C,SACN,CAEAszB,OAAAA,CAAQuoB,EAAQC,EAAQ3oB,GACtB,OAAOG,GAAQlwD,KAAMy4E,EAAQC,EAAQ3oB,EACvC,CAEA4oB,QAAAA,CAASF,EAAQ1oB,GACf,OAAOG,GAAQlwD,KAAMy4E,EAAQ,KAAM1oB,EACrC,CAEA6oB,QAAAA,CAASF,EAAQ3oB,GACf,OAAOG,GAAQlwD,KAAM,KAAM04E,EAAQ3oB,EACrC,CAEAS,cAAAA,CAAeT,GACb,MAAM,EAACr6C,EAAA,EAAGiR,EAAA,KAAGsG,EAAI,WAAE63B,GAAuC9kD,KAAKowD,SAAS,CAAC,IAAK,IAAK,OAAQ,cAAeL,GAC1G,MAAO,CACLr6C,EAAGovC,GAAcpvC,EAAIuX,GAAQ,EAAIvX,EACjCiR,EAAGm+B,EAAan+B,GAAKA,EAAIsG,GAAQ,EAErC,CAEAoiC,QAAAA,CAAS7/B,GACP,MAAgB,MAATA,EAAexvB,KAAKC,MAAQ,EAAID,KAAKu9B,OAAS,CACvD,GACFmoB,EAAAA,GAAAA,GArFqBu0B,GAAmB,KAE1B,QAAMv0B,EAAAA,GAAAA,GAFCu0B,GAAmB,WAOpB,CAChBh1B,cAAe,QACfnmB,YAAa,EACb+sB,aAAc,EACdpG,cAAe,OACf1nB,gBAAYjqB,KACZ4xC,EAAAA,GAAAA,GAbiBu0B,GAAmB,gBAkBf,CACrB7gD,gBAAiB,kBACjBC,YAAa,gBC9JV,SAAS6+C,GAAU53C,EAAM3a,EAAQkE,GACtC,MAAMmnB,EAAW1Q,EAAK0Q,SAChBjiB,EAASuR,EAAKvR,OACdorD,EAAUx0D,EAAOoJ,OACjBlI,EAAQ,GAEd,IAAK,MAAMupB,KAAWY,EAAU,CAC9B,IAAI,MAAC1qC,EAAA,IAAO4kB,GAAOklB,EACnBllB,EAAMkvD,GAAgB9zE,EAAO4kB,EAAK6D,GAElC,MAAM8H,EAASwjD,GAAWxwD,EAAUkF,EAAOzoB,GAAQyoB,EAAO7D,GAAMklB,EAAQ/+B,MAExE,IAAKsU,EAAOqrB,SAAU,CAGpBnqB,EAAMG,KAAK,CACTtB,OAAQ0qB,EACRzqB,OAAQkR,EACRvwB,MAAOyoB,EAAOzoB,GACd4kB,IAAK6D,EAAO7D,KAEd,Q,CAIF,MAAMovD,EAAiBvpC,GAAeprB,EAAQkR,GAE9C,IAAK,MAAM0jD,KAAOD,EAAgB,CAChC,MAAME,EAAYH,GAAWxwD,EAAUswD,EAAQI,EAAIj0E,OAAQ6zE,EAAQI,EAAIrvD,KAAMqvD,EAAIlpE,MAC3EopE,EAAclqC,GAAcH,EAASrhB,EAAQyrD,GAEnD,IAAK,MAAME,KAAcD,EACvB5zD,EAAMG,KAAK,CACTtB,OAAQg1D,EACR/0D,OAAQ40D,EACRj0E,MAAO,CACL,CAACujB,GAAW8wD,GAAS9jD,EAAQ2jD,EAAW,QAASvrE,KAAK6C,MAExDoZ,IAAK,CACH,CAACrB,GAAW8wD,GAAS9jD,EAAQ2jD,EAAW,MAAOvrE,KAAK8C,OAI5D,CACF,CACA,OAAO8U,CACT,CAEO,SAASwzD,GAAWxwD,EAAU8vC,EAAOztC,EAAM7a,GAChD,GAAIA,EACF,OAEF,IAAI/K,EAAQqzD,EAAM9vC,GACdqB,EAAMgB,EAAKrC,GAMf,MAJiB,UAAbA,IACFvjB,EAAQ0kB,GAAgB1kB,GACxB4kB,EAAMF,GAAgBE,IAEjB,CAACrB,WAAUvjB,QAAO4kB,MAC3B,CAEO,SAAS0vD,GAAoBC,EAAUv6C,GAC5C,MAAM,EAAC5qB,EAAI,KAAI,EAAEiR,EAAI,MAAQk0D,GAAY,CAAC,EACpCC,EAAax6C,EAAKvR,OAClBA,EAAS,GAaf,OAZAuR,EAAK0Q,SAASjkB,QAAQ,EAAEzmB,QAAO4kB,UAC7BA,EAAMkvD,GAAgB9zE,EAAO4kB,EAAK4vD,GAClC,MAAMnhB,EAAQmhB,EAAWx0E,GACnB4lB,EAAO4uD,EAAW5vD,GACd,OAANvE,GACFoI,EAAO/H,KAAK,CAACtR,EAAGikD,EAAMjkD,EAAGiR,MACzBoI,EAAO/H,KAAK,CAACtR,EAAGwW,EAAKxW,EAAGiR,OACT,OAANjR,IACTqZ,EAAO/H,KAAK,CAACtR,IAAGiR,EAAGgzC,EAAMhzC,IACzBoI,EAAO/H,KAAK,CAACtR,IAAGiR,EAAGuF,EAAKvF,OAGrBoI,CACT,CAEO,SAASqrD,GAAgB9zE,EAAO4kB,EAAK6D,GAC1C,KAAM7D,EAAM5kB,EAAO4kB,IAAO,CACxB,MAAM6E,EAAQhB,EAAO7D,GACrB,IAAK1B,MAAMuG,EAAMra,KAAO8T,MAAMuG,EAAMpJ,GAClC,KAEJ,CACA,OAAOuE,CACT,CAEA,SAASyvD,GAAShoE,EAAGC,EAAG6vB,EAAM5d,GAC5B,OAAIlS,GAAKC,EACAiS,EAAGlS,EAAE8vB,GAAO7vB,EAAE6vB,IAEhB9vB,EAAIA,EAAE8vB,GAAQ7vB,EAAIA,EAAE6vB,GAAQ,CACrC,CCnFO,SAASs4C,GAAoBF,EAAUv6C,GAC5C,IAAIvR,EAAS,GACTyiB,GAAQ,EAUZ,OARI58B,GAAQimE,IACVrpC,GAAQ,EAERziB,EAAS8rD,GAET9rD,EAAS6rD,GAAoBC,EAAUv6C,GAGlCvR,EAAOroB,OAAS,IAAIsxE,GAAY,CACrCjpD,SACAjhB,QAAS,CAAC08B,QAAS,GACnBgH,QACAG,UAAWH,IACR,IACP,CAEO,SAASwpC,GAAiBt1D,GAC/B,OAAOA,IAA0B,IAAhBA,EAAOmZ,IAC1B,CC5BO,SAASo8C,GAAe70D,EAAS1nB,EAAOw8E,GAC7C,MAAMx1D,EAASU,EAAQ1nB,GACvB,IAAImgC,EAAOnZ,EAAOmZ,KAClB,MAAMs8C,EAAU,CAACz8E,GACjB,IAAIinB,EAEJ,IAAKu1D,EACH,OAAOr8C,EAGT,OAAgB,IAATA,IAA6C,IAA3Bs8C,EAAQp1D,QAAQ8Y,GAAc,CACrD,IAAK3a,GAAS2a,GACZ,OAAOA,EAIT,GADAlZ,EAASS,EAAQyY,IACZlZ,EACH,OAAO,EAGT,GAAIA,EAAOuO,QACT,OAAO2K,EAGTs8C,EAAQn0D,KAAK6X,GACbA,EAAOlZ,EAAOkZ,IAChB,CAEA,OAAO,CACT,CAOO,SAASu8C,GAAY96C,EAAM5hC,EAAO2P,GAEvC,MAAMwwB,EAAOw8C,GAAgB/6C,GAE7B,GAAIrc,GAAS4a,GACX,OAAOrV,MAAMqV,EAAK/5B,QAAiB+5B,EAGrC,IAAIlZ,EAASjB,WAAWma,GAExB,OAAI3a,GAASyB,IAAW1W,KAAK2Z,MAAMjD,KAAYA,EACtC21D,GAAkBz8C,EAAK,GAAIngC,EAAOinB,EAAQtX,GAG5C,CAAC,SAAU,QAAS,MAAO,QAAS,SAAS0X,QAAQ8Y,IAAS,GAAKA,CAC5E,CAEA,SAASy8C,GAAkBC,EAAS78E,EAAOinB,EAAQtX,GAKjD,MAJgB,MAAZktE,GAA+B,MAAZA,IACrB51D,EAASjnB,EAAQinB,KAGfA,IAAWjnB,GAASinB,EAAS,GAAKA,GAAUtX,IAIzCsX,CACT,CAOO,SAAS61D,GAAgB38C,EAAM9D,GACpC,IAAIgC,EAAQ,KAWZ,MAVa,UAAT8B,EACF9B,EAAQhC,EAAMvG,OACI,QAATqK,EACT9B,EAAQhC,EAAMxG,IACLtQ,GAAS4a,GAElB9B,EAAQhC,EAAMnL,iBAAiBiP,EAAK/5B,OAC3Bi2B,EAAM+qB,eACf/oB,EAAQhC,EAAM+qB,gBAET/oB,CACT,CAQO,SAAS0+C,GAAgB58C,EAAM9D,EAAOkpB,GAC3C,IAAIn/C,EAYJ,OATEA,EADW,UAAT+5B,EACMolB,EACU,QAATplB,EACD9D,EAAMjtB,QAAQoX,QAAU6V,EAAMhpB,IAAMgpB,EAAMjpB,IACzCmS,GAAS4a,GAEVA,EAAK/5B,MAELi2B,EAAM4mC,eAET78D,CACT,CAKA,SAASu2E,GAAgB/6C,GACvB,MAAMxyB,EAAUwyB,EAAKxyB,QACf4tE,EAAa5tE,EAAQ+wB,KAC3B,IAAIA,EAAOva,GAAeo3D,GAAcA,EAAW/1D,OAAQ+1D,GAM3D,YAJa5nE,IAAT+qB,IACFA,IAAS/wB,EAAQsrB,kBAGN,IAATyF,GAA2B,OAATA,KAIT,IAATA,EACK,SAEFA,EACT,CC1HO,SAAS88C,GAAgBj2D,GAC9B,MAAM,MAACqV,EAAK,MAAEr8B,EAAA,KAAO4hC,GAAQ5a,EACvBqJ,EAAS,GACTiiB,EAAW1Q,EAAK0Q,SAChB4qC,EAAet7C,EAAKvR,OACpB8sD,EAAaC,GAAc/gD,EAAOr8B,GACxCm9E,EAAW70D,KAAK+zD,GAAoB,CAACrlE,EAAG,KAAMiR,EAAGoU,EAAMvG,QAAS8L,IAEhE,IAAK,IAAI9rB,EAAI,EAAGA,EAAIw8B,EAAStqC,OAAQ8N,IAAK,CACxC,MAAM47B,EAAUY,EAASx8B,GACzB,IAAK,IAAI+L,EAAI6vB,EAAQ9pC,MAAOia,GAAK6vB,EAAQllB,IAAK3K,IAC5Cw7D,GAAehtD,EAAQ6sD,EAAar7D,GAAIs7D,EAE5C,CACA,OAAO,IAAI7D,GAAY,CAACjpD,SAAQjhB,QAAS,CAAC,GAC5C,CAOA,SAASguE,GAAc/gD,EAAOr8B,GAC5B,MAAMs9E,EAAQ,GACR5e,EAAQriC,EAAM6e,wBAAwB,QAE5C,IAAK,IAAIplC,EAAI,EAAGA,EAAI4oD,EAAM12D,OAAQ8N,IAAK,CACrC,MAAMsa,EAAOsuC,EAAM5oD,GACnB,GAAIsa,EAAKpwB,QAAUA,EACjB,MAEGowB,EAAKusB,QACR2gC,EAAMC,QAAQntD,EAAKS,QAEvB,CACA,OAAOysD,CACT,CAOA,SAASD,GAAehtD,EAAQmtD,EAAaL,GAC3C,MAAMM,EAAY,GAClB,IAAK,IAAI57D,EAAI,EAAGA,EAAIs7D,EAAWn1E,OAAQ6Z,IAAK,CAC1C,MAAM+f,EAAOu7C,EAAWt7D,IAClB,MAACo5C,EAAK,KAAEztC,EAAI,MAAE6D,GAASqsD,GAAU97C,EAAM47C,EAAa,KAE1D,MAAKnsD,GAAU4pC,GAASztC,GAGxB,GAAIytC,EAEFwiB,EAAUF,QAAQlsD,QAGlB,GADAhB,EAAO/H,KAAK+I,IACP7D,EAEH,KAGN,CACA6C,EAAO/H,QAAQm1D,EACjB,CAQA,SAASC,GAAU97C,EAAM47C,EAAaryD,GACpC,MAAMkG,EAAQuQ,EAAKjf,YAAY66D,EAAaryD,GAC5C,IAAKkG,EACH,MAAO,CAAC,EAGV,MAAMssD,EAAatsD,EAAMlG,GACnBmnB,EAAW1Q,EAAK0Q,SAChB8pC,EAAax6C,EAAKvR,OACxB,IAAI4qC,GAAQ,EACRztC,GAAO,EACX,IAAK,IAAI1X,EAAI,EAAGA,EAAIw8B,EAAStqC,OAAQ8N,IAAK,CACxC,MAAM47B,EAAUY,EAASx8B,GACnB8nE,EAAaxB,EAAW1qC,EAAQ9pC,OAAOujB,GACvC0yD,EAAYzB,EAAW1qC,EAAQllB,KAAKrB,GAC1C,GAAI6B,GAAW2wD,EAAYC,EAAYC,GAAY,CACjD5iB,EAAQ0iB,IAAeC,EACvBpwD,EAAOmwD,IAAeE,EACtB,K,CAEJ,CACA,MAAO,CAAC5iB,QAAOztC,OAAM6D,QACvB,CCzGO,MAAMysD,GACXp6D,WAAAA,CAAY4d,GACVhgC,KAAK0V,EAAIsqB,EAAKtqB,EACd1V,KAAK2mB,EAAIqZ,EAAKrZ,EACd3mB,KAAKi+B,OAAS+B,EAAK/B,MACrB,CAEA24C,WAAAA,CAAY18C,EAAKrD,EAAQmJ,GACvB,MAAM,EAACtqB,EAAA,EAAGiR,EAAA,OAAGsX,GAAUj+B,KAGvB,OAFA62B,EAASA,GAAU,CAACvwB,MAAO,EAAG4kB,IAAKtD,IACnCsS,EAAIqE,IAAI7oB,EAAGiR,EAAGsX,EAAQpH,EAAO3L,IAAK2L,EAAOvwB,OAAO,IACxC05B,EAAKnJ,MACf,CAEAxV,WAAAA,CAAY0O,GACV,MAAM,EAACra,EAAA,EAAGiR,EAAA,OAAGsX,GAAUj+B,KACjByqB,EAAQsF,EAAMtF,MACpB,MAAO,CACL/U,EAAGA,EAAIzG,KAAK6iB,IAAIrH,GAASwT,EACzBtX,EAAGA,EAAI1X,KAAK4hB,IAAIpG,GAASwT,EACzBxT,QAEJ,ECbK,SAAS6Z,GAAW5e,GACzB,MAAM,MAACiQ,EAAK,KAAEkJ,EAAA,KAAMyB,GAAQ5a,EAE5B,GAAIxB,GAAS2a,GACX,OAAO49C,GAAe9mD,EAAOkJ,GAG/B,GAAa,UAATA,EACF,OAAO88C,GAAgBj2D,GAGzB,GAAa,UAATmZ,EACF,OAAO,EAGT,MAAMg8C,EAAW6B,GAAgBh3D,GAEjC,OAAIm1D,aAAoB2B,GACf3B,EAGFE,GAAoBF,EAAUv6C,EACvC,CAMA,SAASm8C,GAAe9mD,EAAOj3B,GAC7B,MAAMowB,EAAO6G,EAAM8nB,eAAe/+C,GAC5Bw1B,EAAUpF,GAAQ6G,EAAMs0B,iBAAiBvrD,GAC/C,OAAOw1B,EAAUpF,EAAKS,QAAU,IAClC,CAEA,SAASmtD,GAAgBh3D,GACvB,MAAMqV,EAAQrV,EAAOqV,OAAS,CAAC,EAE/B,OAAIA,EAAMozB,yBACDwuB,GAAwBj3D,GAE1Bk3D,GAAsBl3D,EAC/B,CAGA,SAASk3D,GAAsBl3D,GAC7B,MAAM,MAACqV,EAAQ,QAAI8D,GAAQnZ,EACrBqX,EAAQy+C,GAAgB38C,EAAM9D,GAEpC,GAAI7W,GAAS6Y,GAAQ,CACnB,MAAM+nB,EAAa/pB,EAAM6pB,eAEzB,MAAO,CACLlvC,EAAGovC,EAAa/nB,EAAQ,KACxBpW,EAAGm+B,EAAa,KAAO/nB,E,CAI3B,OAAO,IACT,CAEA,SAAS4/C,GAAwBj3D,GAC/B,MAAM,MAACqV,EAAA,KAAO8D,GAAQnZ,EAChB5X,EAAUitB,EAAMjtB,QAChBpH,EAASq0B,EAAMgkB,YAAYr4C,OAC3BJ,EAAQwH,EAAQoX,QAAU6V,EAAMjpB,IAAMipB,EAAMhpB,IAC5CjN,EAAQ22E,GAAgB58C,EAAM9D,EAAOz0B,GACrCqf,EAAS,GAEf,GAAI7X,EAAQkpB,KAAK82B,SAAU,CACzB,MAAMzH,EAAStrB,EAAMozB,yBAAyB,EAAG7nD,GACjD,OAAO,IAAIk2E,GAAU,CACnB9mE,EAAG2wC,EAAO3wC,EACViR,EAAG0/B,EAAO1/B,EACVsX,OAAQlD,EAAM6yB,8BAA8B9oD,I,CAIhD,IAAK,IAAI0P,EAAI,EAAGA,EAAI9N,IAAU8N,EAC5BmR,EAAOqB,KAAK+T,EAAMozB,yBAAyB35C,EAAG1P,IAEhD,OAAO6gB,CACT,CCzFO,SAASk3D,GAAU3iD,EAAKxU,EAAQuZ,GACrC,MAAMtZ,EAAS2e,GAAW5e,IACpB,MAACiQ,EAAK,MAAEj3B,EAAK,KAAE4hC,EAAI,MAAEvF,EAAK,KAAEvL,GAAQ9J,EACpCo3D,EAAWx8C,EAAKxyB,QAChB4tE,EAAaoB,EAASj+C,KACtBnc,EAAQo6D,EAAS1jD,iBACjB,MAAC2jD,EAAQr6D,EAAK,MAAEs5D,EAAQt5D,GAASg5D,GAAc,CAAC,EAChD5sD,EAAO6G,EAAM8nB,eAAe/+C,GAC5Bo4B,EAAOqc,GAAmBxd,EAAO7G,GACnCnJ,GAAU2a,EAAKvR,OAAOroB,SACxBy4B,GAASjF,EAAK+E,GACd+9C,GAAO9iD,EAAK,CAACoG,OAAM3a,SAAQo3D,QAAOf,QAAO/8C,OAAMlE,QAAOvL,OAAMsH,SAC5DsI,GAAWlF,GAEf,CAEA,SAAS8iD,GAAO9iD,EAAKwb,GACnB,MAAM,KAACpV,EAAA,OAAM3a,EAAA,MAAQo3D,EAAK,MAAEf,EAAK,KAAE/8C,EAAA,MAAMlE,EAAA,KAAOjE,GAAQ4e,EAClD7rB,EAAWyW,EAAKkR,MAAQ,QAAUkE,EAAIlmB,KAE5C0K,EAAIsC,OAEJ,IAAIygD,EAAYjB,EACZA,IAAUe,IACK,MAAblzD,GACFqzD,GAAahjD,EAAKvU,EAAQsZ,EAAK1K,KAC/BsK,GAAK3E,EAAK,CAACoG,OAAM3a,SAAQjD,MAAOq6D,EAAOhiD,QAAOlR,WAAUiN,SACxDoD,EAAI0C,UACJ1C,EAAIsC,OACJ0gD,GAAahjD,EAAKvU,EAAQsZ,EAAKzK,SACT,MAAb3K,IACTszD,GAAejjD,EAAKvU,EAAQsZ,EAAKxQ,MACjCoQ,GAAK3E,EAAK,CAACoG,OAAM3a,SAAQjD,MAAOs5D,EAAOjhD,QAAOlR,WAAUiN,SACxDoD,EAAI0C,UACJ1C,EAAIsC,OACJ2gD,GAAejjD,EAAKvU,EAAQsZ,EAAKvQ,OACjCuuD,EAAYF,IAGhBl+C,GAAK3E,EAAK,CAACoG,OAAM3a,SAAQjD,MAAOu6D,EAAWliD,QAAOlR,WAAUiN,SAE5DoD,EAAI0C,SACN,CAEA,SAASsgD,GAAahjD,EAAKvU,EAAQy3D,GACjC,MAAM,SAACpsC,EAAA,OAAUjiB,GAAUpJ,EAC3B,IAAIg0C,GAAQ,EACR0jB,GAAW,EAEfnjD,EAAImE,YACJ,IAAK,MAAM+R,KAAWY,EAAU,CAC9B,MAAM,MAAC1qC,EAAA,IAAO4kB,GAAOklB,EACfjI,EAAapZ,EAAOzoB,GACpBumD,EAAY99B,EAAOqrD,GAAgB9zE,EAAO4kB,EAAK6D,IACjD4qC,GACFz/B,EAAIuE,OAAO0J,EAAWzyB,EAAGyyB,EAAWxhB,GACpCgzC,GAAQ,IAERz/B,EAAIwE,OAAOyJ,EAAWzyB,EAAG0nE,GACzBljD,EAAIwE,OAAOyJ,EAAWzyB,EAAGyyB,EAAWxhB,IAEtC02D,IAAa13D,EAAOixD,YAAY18C,EAAKkW,EAAS,CAAC2R,KAAMs7B,IACjDA,EACFnjD,EAAIsE,YAEJtE,EAAIwE,OAAOmuB,EAAUn3C,EAAG0nE,EAE5B,CAEAljD,EAAIwE,OAAO/Y,EAAOg0C,QAAQjkD,EAAG0nE,GAC7BljD,EAAIsE,YACJtE,EAAIpD,MACN,CAEA,SAASqmD,GAAejjD,EAAKvU,EAAQ23D,GACnC,MAAM,SAACtsC,EAAA,OAAUjiB,GAAUpJ,EAC3B,IAAIg0C,GAAQ,EACR0jB,GAAW,EAEfnjD,EAAImE,YACJ,IAAK,MAAM+R,KAAWY,EAAU,CAC9B,MAAM,MAAC1qC,EAAA,IAAO4kB,GAAOklB,EACfjI,EAAapZ,EAAOzoB,GACpBumD,EAAY99B,EAAOqrD,GAAgB9zE,EAAO4kB,EAAK6D,IACjD4qC,GACFz/B,EAAIuE,OAAO0J,EAAWzyB,EAAGyyB,EAAWxhB,GACpCgzC,GAAQ,IAERz/B,EAAIwE,OAAO4+C,EAAOn1C,EAAWxhB,GAC7BuT,EAAIwE,OAAOyJ,EAAWzyB,EAAGyyB,EAAWxhB,IAEtC02D,IAAa13D,EAAOixD,YAAY18C,EAAKkW,EAAS,CAAC2R,KAAMs7B,IACjDA,EACFnjD,EAAIsE,YAEJtE,EAAIwE,OAAO4+C,EAAOzwB,EAAUlmC,EAEhC,CAEAuT,EAAIwE,OAAO4+C,EAAO33D,EAAOg0C,QAAQhzC,GACjCuT,EAAIsE,YACJtE,EAAIpD,MACN,CAEA,SAAS+H,GAAK3E,EAAKwb,GACjB,MAAM,KAACpV,EAAA,OAAM3a,EAAA,SAAQkE,EAAA,MAAUnH,EAAA,MAAOqY,EAAA,KAAOjE,GAAQ4e,EAC/C1E,EAAWknC,GAAU53C,EAAM3a,EAAQkE,GAEzC,IAAK,MAAOnE,OAAQ5U,EAAK6U,OAAQ40D,EAAG,MAAEj0E,EAAK,IAAE4kB,KAAQ8lB,EAAU,CAC7D,MAAO3yC,OAAO,gBAAC+6B,EAAkB1W,GAAS,CAAC,GAAK5R,EAC1CysE,GAAsB,IAAX53D,EAEjBuU,EAAIsC,OACJtC,EAAIgG,UAAY9G,EAEhBokD,GAAWtjD,EAAKa,EAAOjE,EAAMymD,GAAYlD,GAAWxwD,EAAUvjB,EAAO4kB,IAErEgP,EAAImE,YAEJ,MAAMg/C,IAAa/8C,EAAKs2C,YAAY18C,EAAKppB,GAEzC,IAAIO,EACJ,GAAIksE,EAAU,CACRF,EACFnjD,EAAIsE,YAEJi/C,GAAmBvjD,EAAKvU,EAAQuF,EAAKrB,GAGvC,MAAM6zD,IAAe/3D,EAAOixD,YAAY18C,EAAKqgD,EAAK,CAACx4B,KAAMs7B,EAAUn4D,SAAS,IAC5E7T,EAAOgsE,GAAYK,EACdrsE,GACHosE,GAAmBvjD,EAAKvU,EAAQrf,EAAOujB,E,CAI3CqQ,EAAIsE,YACJtE,EAAI2E,KAAKxtB,EAAO,UAAY,WAE5B6oB,EAAI0C,SACN,CACF,CAEA,SAAS4gD,GAAWtjD,EAAKa,EAAOjE,EAAMD,GACpC,MAAMmc,EAAYjY,EAAMpF,MAAMqd,WACxB,SAACnpB,EAAA,MAAUvjB,EAAA,IAAO4kB,GAAO2L,GAAU,CAAC,EAE1C,GAAiB,MAAbhN,GAAiC,MAAbA,EAAkB,CACxC,IAAI4E,EAAM8F,EAAK7F,EAAO8F,EAEL,MAAb3K,GACF4E,EAAOnoB,EACPiuB,EAAMye,EAAUze,IAChB7F,EAAQxD,EACRsJ,EAASwe,EAAUxe,SAEnB/F,EAAOukB,EAAUvkB,KACjB8F,EAAMjuB,EACNooB,EAAQskB,EAAUtkB,MAClB8F,EAAStJ,GAGXgP,EAAImE,YAEAvH,IACFrI,EAAOxf,KAAK6C,IAAI2c,EAAMqI,EAAKrI,MAC3BC,EAAQzf,KAAK8C,IAAI2c,EAAOoI,EAAKpI,OAC7B6F,EAAMtlB,KAAK6C,IAAIyiB,EAAKuC,EAAKvC,KACzBC,EAASvlB,KAAK8C,IAAIyiB,EAAQsC,EAAKtC,SAGjC0F,EAAI0E,KAAKnQ,EAAM8F,EAAK7F,EAAQD,EAAM+F,EAASD,GAC3C2F,EAAIpD,M,CAER,CAEA,SAAS2mD,GAAmBvjD,EAAKvU,EAAQoK,EAAOlG,GAC9C,MAAM8zD,EAAoBh4D,EAAOtE,YAAY0O,EAAOlG,GAChD8zD,GACFzjD,EAAIwE,OAAOi/C,EAAkBjoE,EAAGioE,EAAkBh3D,EAEtD,CC9KA,IAAAjoB,GAAe,CACbqS,GAAI,SAEJ6sE,mBAAAA,CAAoBjoD,EAAOkoD,EAAO/vE,GAChC,MAAMO,GAASsnB,EAAMj2B,KAAK45B,UAAY,IAAI5yB,OACpC0f,EAAU,GAChB,IAAI0I,EAAMta,EAAG8rB,EAAM5a,EAEnB,IAAKlR,EAAI,EAAGA,EAAInG,IAASmG,EACvBsa,EAAO6G,EAAM8nB,eAAejpC,GAC5B8rB,EAAOxR,EAAKS,QACZ7J,EAAS,KAEL4a,GAAQA,EAAKxyB,SAAWwyB,aAAgB03C,KAC1CtyD,EAAS,CACPwO,QAASyB,EAAMs0B,iBAAiBz1C,GAChC9V,MAAO8V,EACPqqB,KAAMu8C,GAAY96C,EAAM9rB,EAAGnG,GAC3BsnB,QACAnG,KAAMV,EAAKgrB,WAAWhsC,QAAQusB,UAC9BU,MAAOjM,EAAKM,OACZkR,SAIJxR,EAAKgvD,QAAUp4D,EACfU,EAAQY,KAAKtB,GAGf,IAAKlR,EAAI,EAAGA,EAAInG,IAASmG,EACvBkR,EAASU,EAAQ5R,GACZkR,IAA0B,IAAhBA,EAAOmZ,OAItBnZ,EAAOmZ,KAAOo8C,GAAe70D,EAAS5R,EAAG1G,EAAQotE,WAErD,EAEA6C,UAAAA,CAAWpoD,EAAOkoD,EAAO/vE,GACvB,MAAMumC,EAA4B,eAArBvmC,EAAQkwE,SACf7lC,EAAWxiB,EAAM65B,+BACjBvwB,EAAOtJ,EAAMqd,UACnB,IAAK,IAAIx+B,EAAI2jC,EAASzxC,OAAS,EAAG8N,GAAK,IAAKA,EAAG,CAC7C,MAAMkR,EAASyyB,EAAS3jC,GAAGspE,QACtBp4D,IAILA,EAAO4a,KAAKwsB,oBAAoB7tB,EAAMvZ,EAAO8J,MACzC6kB,GAAQ3uB,EAAOmZ,MACjBg+C,GAAUlnD,EAAMuE,IAAKxU,EAAQuZ,GAEjC,CACF,EAEAg/C,kBAAAA,CAAmBtoD,EAAOkoD,EAAO/vE,GAC/B,GAAyB,uBAArBA,EAAQkwE,SACV,OAGF,MAAM7lC,EAAWxiB,EAAM65B,+BACvB,IAAK,IAAIh7C,EAAI2jC,EAASzxC,OAAS,EAAG8N,GAAK,IAAKA,EAAG,CAC7C,MAAMkR,EAASyyB,EAAS3jC,GAAGspE,QAEvB9C,GAAiBt1D,IACnBm3D,GAAUlnD,EAAMuE,IAAKxU,EAAQiQ,EAAMqd,UAEvC,CACF,EAEAkrC,iBAAAA,CAAkBvoD,EAAOz2B,EAAM4O,GAC7B,MAAM4X,EAASxmB,EAAK4vB,KAAKgvD,QAEpB9C,GAAiBt1D,IAAgC,sBAArB5X,EAAQkwE,UAIzCnB,GAAUlnD,EAAMuE,IAAKxU,EAAQiQ,EAAMqd,UACrC,EAEA3f,SAAU,CACR6nD,WAAW,EACX8C,SAAU,sBCvEd,MAAMG,GAAaA,CAACC,EAAWxZ,KAC7B,IAAI,UAACyZ,EAAYzZ,EAAA,SAAU0Z,EAAW1Z,GAAYwZ,EAOlD,OALIA,EAAUG,gBACZF,EAAYpvE,KAAK8C,IAAIssE,EAAWzZ,GAChC0Z,EAAWF,EAAUI,iBAAmBvvE,KAAK8C,IAAIusE,EAAU1Z,IAGtD,CACL0Z,WACAD,YACAI,WAAYxvE,KAAK6C,IAAI8yD,EAAUyZ,KAI7BK,GAAaA,CAAC/rE,EAAGC,IAAY,OAAND,GAAoB,OAANC,GAAcD,EAAE8S,eAAiB7S,EAAE6S,cAAgB9S,EAAEjU,QAAUkU,EAAElU,MAErG,MAAMigF,WAAe7lB,GAK1B12C,WAAAA,CAAYw0B,GACVgP,QAEA5lD,KAAK4+E,QAAS,EAGd5+E,KAAK6+E,eAAiB,GAKtB7+E,KAAK8+E,aAAe,KAGpB9+E,KAAK++E,cAAe,EAEpB/+E,KAAK21B,MAAQihB,EAAOjhB,MACpB31B,KAAK8N,QAAU8oC,EAAO9oC,QACtB9N,KAAKk6B,IAAM0c,EAAO1c,IAClBl6B,KAAKg/E,iBAAclrE,EACnB9T,KAAKi/E,iBAAcnrE,EACnB9T,KAAKk/E,gBAAaprE,EAClB9T,KAAK+sC,eAAYj5B,EACjB9T,KAAK0hC,cAAW5tB,EAChB9T,KAAKu0B,SAAMzgB,EACX9T,KAAKw0B,YAAS1gB,EACd9T,KAAKyuB,UAAO3a,EACZ9T,KAAK0uB,WAAQ5a,EACb9T,KAAKu9B,YAASzpB,EACd9T,KAAKC,WAAQ6T,EACb9T,KAAKg8D,cAAWloD,EAChB9T,KAAKuvD,cAAWz7C,EAChB9T,KAAK2iB,YAAS7O,EACd9T,KAAKkyD,cAAWp+C,CAClB,CAEAsiC,MAAAA,CAAO1U,EAAUqL,EAAWY,GAC1B3tC,KAAK0hC,SAAWA,EAChB1hC,KAAK+sC,UAAYA,EACjB/sC,KAAKg8D,SAAWruB,EAEhB3tC,KAAK69D,gBACL79D,KAAKm/E,cACLn/E,KAAKgR,KACP,CAEA6sD,aAAAA,GACM79D,KAAK4kD,gBACP5kD,KAAKC,MAAQD,KAAK0hC,SAClB1hC,KAAKyuB,KAAOzuB,KAAKg8D,SAASvtC,KAC1BzuB,KAAK0uB,MAAQ1uB,KAAKC,QAElBD,KAAKu9B,OAASv9B,KAAK+sC,UACnB/sC,KAAKu0B,IAAMv0B,KAAKg8D,SAASznC,IACzBv0B,KAAKw0B,OAASx0B,KAAKu9B,OAEvB,CAEA4hD,WAAAA,GACE,MAAMf,EAAYp+E,KAAK8N,QAAQgxC,QAAU,CAAC,EAC1C,IAAIkgC,EAAcp6D,GAAKw5D,EAAUzyB,eAAgB,CAAC3rD,KAAK21B,OAAQ31B,OAAS,GAEpEo+E,EAAUr3C,SACZi4C,EAAcA,EAAYj4C,OAAQvoC,GAAS4/E,EAAUr3C,OAAOvoC,EAAMwB,KAAK21B,MAAMj2B,QAG3E0+E,EAAUl1D,OACZ81D,EAAcA,EAAY91D,KAAK,CAACvW,EAAGC,IAAMwrE,EAAUl1D,KAAKvW,EAAGC,EAAG5S,KAAK21B,MAAMj2B,QAGvEM,KAAK8N,QAAQoX,SACf85D,EAAY95D,UAGdllB,KAAKg/E,YAAcA,CACrB,CAEAhuE,GAAAA,GACE,MAAM,QAAClD,EAAO,IAAEosB,GAAOl6B,KAMvB,IAAK8N,EAAQ4oB,QAEX,YADA12B,KAAKC,MAAQD,KAAKu9B,OAAS,GAI7B,MAAM6gD,EAAYtwE,EAAQgxC,OACpBsgC,EAAYv8C,GAAOu7C,EAAUvkD,MAC7B+qC,EAAWwa,EAAU/xE,KACrB6yD,EAAclgE,KAAKq/E,uBACnB,SAACf,EAAQ,WAAEG,GAAcN,GAAWC,EAAWxZ,GAErD,IAAI3kE,EAAOs9B,EAEXrD,EAAIL,KAAOulD,EAAUnjD,OAEjBj8B,KAAK4kD,gBACP3kD,EAAQD,KAAK0hC,SACbnE,EAASv9B,KAAKs/E,SAASpf,EAAa0E,EAAU0Z,EAAUG,GAAc,KAEtElhD,EAASv9B,KAAK+sC,UACd9sC,EAAQD,KAAKu/E,SAASrf,EAAakf,EAAWd,EAAUG,GAAc,IAGxEz+E,KAAKC,MAAQgP,KAAK8C,IAAI9R,EAAO6N,EAAQ4zB,UAAY1hC,KAAK0hC,UACtD1hC,KAAKu9B,OAAStuB,KAAK8C,IAAIwrB,EAAQzvB,EAAQi/B,WAAa/sC,KAAK+sC,UAC3D,CAKAuyC,QAAAA,CAASpf,EAAa0E,EAAU0Z,EAAUG,GACxC,MAAM,IAACvkD,EAAG,SAAEwH,EAAU5zB,SAAUgxC,QAAQ,QAACxqB,KAAat0B,KAChDw/E,EAAWx/E,KAAK6+E,eAAiB,GAEjCK,EAAal/E,KAAKk/E,WAAa,CAAC,GAChCnlD,EAAa0kD,EAAanqD,EAChC,IAAImrD,EAAcvf,EAElBhmC,EAAIiG,UAAY,OAChBjG,EAAIkG,aAAe,SAEnB,IAAIs/C,GAAO,EACPnrD,GAAOwF,EAgBX,OAfA/5B,KAAKg/E,YAAYjyD,QAAQ,CAACm/B,EAAY13C,KACpC,MAAM26B,EAAYmvC,EAAY1Z,EAAW,EAAK1qC,EAAIiC,YAAY+vB,EAAWx0B,MAAMz3B,OAErE,IAANuU,GAAW0qE,EAAWA,EAAWx4E,OAAS,GAAKyoC,EAAY,EAAI7a,EAAUoN,KAC3E+9C,GAAe1lD,EACfmlD,EAAWA,EAAWx4E,QAAU8N,EAAI,EAAI,EAAI,IAAM,EAClD+f,GAAOwF,EACP2lD,KAGFF,EAAShrE,GAAK,CAACia,KAAM,EAAG8F,MAAKmrD,MAAKz/E,MAAOkvC,EAAW5R,OAAQkhD,GAE5DS,EAAWA,EAAWx4E,OAAS,IAAMyoC,EAAY7a,IAG5CmrD,CACT,CAEAF,QAAAA,CAASrf,EAAakf,EAAWd,EAAUqB,GACzC,MAAM,IAACzlD,EAAG,UAAE6S,EAAWj/B,SAAUgxC,QAAQ,QAACxqB,KAAat0B,KACjDw/E,EAAWx/E,KAAK6+E,eAAiB,GACjCI,EAAcj/E,KAAKi/E,YAAc,GACjCW,EAAc7yC,EAAYmzB,EAEhC,IAAI2f,EAAavrD,EACbwrD,EAAkB,EAClBC,EAAmB,EAEnBtxD,EAAO,EACPuxD,EAAM,EAyBV,OAvBAhgF,KAAKg/E,YAAYjyD,QAAQ,CAACm/B,EAAY13C,KACpC,MAAM,UAAC26B,EAAS,WAAEsvC,GAAcwB,GAAkB3B,EAAUc,EAAWllD,EAAKgyB,EAAYyzB,GAGpFnrE,EAAI,GAAKurE,EAAmBtB,EAAa,EAAInqD,EAAUsrD,IACzDC,GAAcC,EAAkBxrD,EAChC2qD,EAAYj4D,KAAK,CAAC/mB,MAAO6/E,EAAiBviD,OAAQwiD,IAClDtxD,GAAQqxD,EAAkBxrD,EAC1B0rD,IACAF,EAAkBC,EAAmB,GAIvCP,EAAShrE,GAAK,CAACia,OAAM8F,IAAKwrD,EAAkBC,MAAK//E,MAAOkvC,EAAW5R,OAAQkhD,GAG3EqB,EAAkB7wE,KAAK6C,IAAIguE,EAAiB3wC,GAC5C4wC,GAAoBtB,EAAanqD,IAGnCurD,GAAcC,EACdb,EAAYj4D,KAAK,CAAC/mB,MAAO6/E,EAAiBviD,OAAQwiD,IAE3CF,CACT,CAEAK,cAAAA,GACE,IAAKlgF,KAAK8N,QAAQ4oB,QAChB,OAEF,MAAMwpC,EAAclgE,KAAKq/E,uBAClBR,eAAgBW,EAAU1xE,SAAS,MAACwgB,EAAOwwB,QAAQ,QAACxqB,GAAQ,IAAE3F,IAAQ3uB,KACvEmgF,EAAY7wC,GAAc3gB,EAAK3uB,KAAKyuB,KAAMzuB,KAAKC,OACrD,GAAID,KAAK4kD,eAAgB,CACvB,IAAI86B,EAAM,EACNjxD,EAAOF,GAAeD,EAAOtuB,KAAKyuB,KAAO6F,EAASt0B,KAAK0uB,MAAQ1uB,KAAKk/E,WAAWQ,IACnF,IAAK,MAAMU,KAAUZ,EACfE,IAAQU,EAAOV,MACjBA,EAAMU,EAAOV,IACbjxD,EAAOF,GAAeD,EAAOtuB,KAAKyuB,KAAO6F,EAASt0B,KAAK0uB,MAAQ1uB,KAAKk/E,WAAWQ,KAEjFU,EAAO7rD,KAAOv0B,KAAKu0B,IAAM2rC,EAAc5rC,EACvC8rD,EAAO3xD,KAAO0xD,EAAUjxC,WAAWixC,EAAUzqE,EAAE+Y,GAAO2xD,EAAOngF,OAC7DwuB,GAAQ2xD,EAAOngF,MAAQq0B,C,KAEpB,CACL,IAAI0rD,EAAM,EACNzrD,EAAMhG,GAAeD,EAAOtuB,KAAKu0B,IAAM2rC,EAAc5rC,EAASt0B,KAAKw0B,OAASx0B,KAAKi/E,YAAYe,GAAKziD,QACtG,IAAK,MAAM6iD,KAAUZ,EACfY,EAAOJ,MAAQA,IACjBA,EAAMI,EAAOJ,IACbzrD,EAAMhG,GAAeD,EAAOtuB,KAAKu0B,IAAM2rC,EAAc5rC,EAASt0B,KAAKw0B,OAASx0B,KAAKi/E,YAAYe,GAAKziD,SAEpG6iD,EAAO7rD,IAAMA,EACb6rD,EAAO3xD,MAAQzuB,KAAKyuB,KAAO6F,EAC3B8rD,EAAO3xD,KAAO0xD,EAAUjxC,WAAWixC,EAAUzqE,EAAE0qE,EAAO3xD,MAAO2xD,EAAOngF,OACpEs0B,GAAO6rD,EAAO7iD,OAASjJ,C,CAG7B,CAEAswB,YAAAA,GACE,MAAiC,QAA1B5kD,KAAK8N,QAAQyhD,UAAgD,WAA1BvvD,KAAK8N,QAAQyhD,QACzD,CAEAlb,IAAAA,GACE,GAAIr0C,KAAK8N,QAAQ4oB,QAAS,CACxB,MAAMwD,EAAMl6B,KAAKk6B,IACjBiF,GAASjF,EAAKl6B,MAEdA,KAAKqgF,QAELjhD,GAAWlF,E,CAEf,CAKAmmD,KAAAA,GACE,MAAOvyE,QAASkyB,EAAA,YAAMi/C,EAAA,WAAaC,EAAA,IAAYhlD,GAAOl6B,MAChD,MAACsuB,EAAOwwB,OAAQs/B,GAAap+C,EAC7BsgD,EAAejtD,GAAS3Q,MACxBy9D,EAAY7wC,GAActP,EAAKrR,IAAK3uB,KAAKyuB,KAAMzuB,KAAKC,OACpDm/E,EAAYv8C,GAAOu7C,EAAUvkD,OAC7B,QAACvF,GAAW8pD,EACZxZ,EAAWwa,EAAU/xE,KACrBkzE,EAAe3b,EAAW,EAChC,IAAI4b,EAEJxgF,KAAKukE,YAGLrqC,EAAIiG,UAAYggD,EAAUhgD,UAAU,QACpCjG,EAAIkG,aAAe,SACnBlG,EAAIjD,UAAY,GAChBiD,EAAIL,KAAOulD,EAAUnjD,OAErB,MAAM,SAACqiD,EAAA,UAAUD,EAAA,WAAWI,GAAcN,GAAWC,EAAWxZ,GAG1D6b,EAAgB,SAAS/qE,EAAGiR,EAAGulC,GACnC,GAAI1iC,MAAM80D,IAAaA,GAAY,GAAK90D,MAAM60D,IAAcA,EAAY,EACtE,OAIFnkD,EAAIsC,OAEJ,MAAMvF,EAAY3S,GAAe4nC,EAAWj1B,UAAW,GAUvD,GATAiD,EAAIgG,UAAY5b,GAAe4nC,EAAWhsB,UAAWogD,GACrDpmD,EAAIi8C,QAAU7xD,GAAe4nC,EAAWiqB,QAAS,QACjDj8C,EAAI8xB,eAAiB1nC,GAAe4nC,EAAWF,eAAgB,GAC/D9xB,EAAI+xB,SAAW3nC,GAAe4nC,EAAWD,SAAU,SACnD/xB,EAAIjD,UAAYA,EAChBiD,EAAI6G,YAAczc,GAAe4nC,EAAWnrB,YAAau/C,GAEzDpmD,EAAIgqC,YAAY5/C,GAAe4nC,EAAWH,SAAU,KAEhDqyB,EAAUG,cAAe,CAG3B,MAAMmC,EAAc,CAClBziD,OAAQogD,EAAYpvE,KAAK0xE,MAAQ,EACjC5iD,WAAYmuB,EAAWnuB,WACvBC,SAAUkuB,EAAWluB,SACrBc,YAAa7H,GAETi0B,EAAUi1B,EAAUlxC,MAAMv5B,EAAG4oE,EAAW,GACxCnzB,EAAUxkC,EAAI45D,EAGpB9iD,GAAgBvD,EAAKwmD,EAAax1B,EAASC,EAASizB,EAAUI,iBAAmBF,E,KAC5E,CAGL,MAAMsC,EAAUj6D,EAAI1X,KAAK6C,KAAK8yD,EAAWyZ,GAAa,EAAG,GACnDwC,EAAWV,EAAUjxC,WAAWx5B,EAAG4oE,GACnCzyB,EAAelpB,GAAcupB,EAAWL,cAE9C3xB,EAAImE,YAEArwB,OAAOse,OAAOu/B,GAAcoc,KAAKv2D,GAAW,IAANA,GACxCkwB,GAAmB1H,EAAK,CACtBxkB,EAAGmrE,EACHl6D,EAAGi6D,EACHtsE,EAAGgqE,EACHzsE,EAAGwsE,EACHpgD,OAAQ4tB,IAGV3xB,EAAI0E,KAAKiiD,EAAUD,EAAStC,EAAUD,GAGxCnkD,EAAI2E,OACc,IAAd5H,GACFiD,EAAI6E,Q,CAIR7E,EAAI0C,SACN,EAEM+E,EAAW,SAASjsB,EAAGiR,EAAGulC,GAC9B9qB,GAAWlH,EAAKgyB,EAAWx0B,KAAMhiB,EAAGiR,EAAK83D,EAAa,EAAIW,EAAW,CACnE7+C,cAAe2rB,EAAW7Q,OAC1Blb,UAAWggD,EAAUhgD,UAAU+rB,EAAW/rB,YAE9C,EAGMykB,EAAe5kD,KAAK4kD,eACpBsb,EAAclgE,KAAKq/E,sBAEvBmB,EADE57B,EACO,CACPlvC,EAAG6Y,GAAeD,EAAOtuB,KAAKyuB,KAAO6F,EAASt0B,KAAK0uB,MAAQwwD,EAAW,IACtEv4D,EAAG3mB,KAAKu0B,IAAMD,EAAU4rC,EACxB5/B,KAAM,GAGC,CACP5qB,EAAG1V,KAAKyuB,KAAO6F,EACf3N,EAAG4H,GAAeD,EAAOtuB,KAAKu0B,IAAM2rC,EAAc5rC,EAASt0B,KAAKw0B,OAASyqD,EAAY,GAAG1hD,QACxF+C,KAAM,GAIViP,GAAsBvvC,KAAKk6B,IAAK8F,EAAK8gD,eAErC,MAAM/mD,EAAa0kD,EAAanqD,EAChCt0B,KAAKg/E,YAAYjyD,QAAQ,CAACm/B,EAAY13C,KACpC0lB,EAAI6G,YAAcmrB,EAAWJ,UAC7B5xB,EAAIgG,UAAYgsB,EAAWJ,UAE3B,MAAM5vB,EAAYhC,EAAIiC,YAAY+vB,EAAWx0B,MAAMz3B,MAC7CkgC,EAAYggD,EAAUhgD,UAAU+rB,EAAW/rB,YAAc+rB,EAAW/rB,UAAYi+C,EAAUj+C,YAC1FlgC,EAAQq+E,EAAWiC,EAAerkD,EACxC,IAAIxmB,EAAI8qE,EAAO9qE,EACXiR,EAAI65D,EAAO75D,EAEfw5D,EAAUnxC,SAAShvC,KAAKC,OAEpB2kD,EACEpwC,EAAI,GAAKkB,EAAIzV,EAAQq0B,EAAUt0B,KAAK0uB,QACtC/H,EAAI65D,EAAO75D,GAAKoT,EAChBymD,EAAOlgD,OACP5qB,EAAI8qE,EAAO9qE,EAAI6Y,GAAeD,EAAOtuB,KAAKyuB,KAAO6F,EAASt0B,KAAK0uB,MAAQwwD,EAAWsB,EAAOlgD,QAElF9rB,EAAI,GAAKmS,EAAIoT,EAAa/5B,KAAKw0B,SACxC9e,EAAI8qE,EAAO9qE,EAAIA,EAAIupE,EAAYuB,EAAOlgD,MAAMrgC,MAAQq0B,EACpDksD,EAAOlgD,OACP3Z,EAAI65D,EAAO75D,EAAI4H,GAAeD,EAAOtuB,KAAKu0B,IAAM2rC,EAAc5rC,EAASt0B,KAAKw0B,OAASyqD,EAAYuB,EAAOlgD,MAAM/C,SAGhH,MAAMwjD,EAAQZ,EAAUzqE,EAAEA,GAS1B,GAPA+qE,EAAcM,EAAOp6D,EAAGulC,GAExBx2C,EAAI8Y,GAAO2R,EAAWzqB,EAAI4oE,EAAWiC,EAAc37B,EAAelvC,EAAIzV,EAAQD,KAAK0uB,MAAOsR,EAAKrR,KAG/FgT,EAASw+C,EAAUzqE,EAAEA,GAAIiR,EAAGulC,GAExBtH,EACF47B,EAAO9qE,GAAKzV,EAAQq0B,OACf,GAA+B,kBAApB43B,EAAWx0B,KAAmB,CAC9C,MAAMspD,EAAiB5B,EAAUrlD,WACjCymD,EAAO75D,GAAKs6D,GAA0B/0B,EAAY80B,GAAkB1sD,C,MAEpEksD,EAAO75D,GAAKoT,IAIhB8V,GAAqB7vC,KAAKk6B,IAAK8F,EAAK8gD,cACtC,CAKAvc,SAAAA,GACE,MAAMvkC,EAAOhgC,KAAK8N,QACZkyD,EAAYhgC,EAAKxyB,MACjB0zE,EAAYr+C,GAAOm9B,EAAUnmC,MAC7BsnD,EAAev+C,GAAUo9B,EAAU1rC,SAEzC,IAAK0rC,EAAUtpC,QACb,OAGF,MAAMypD,EAAY7wC,GAActP,EAAKrR,IAAK3uB,KAAKyuB,KAAMzuB,KAAKC,OACpDi6B,EAAMl6B,KAAKk6B,IACXq1B,EAAWyQ,EAAUzQ,SACrBgxB,EAAeW,EAAU7zE,KAAO,EAChC+zE,EAA6BD,EAAa5sD,IAAMgsD,EACtD,IAAI55D,EAIA8H,EAAOzuB,KAAKyuB,KACZiT,EAAW1hC,KAAKC,MAEpB,GAAID,KAAK4kD,eAEPljB,EAAWzyB,KAAK6C,OAAO9R,KAAKk/E,YAC5Bv4D,EAAI3mB,KAAKu0B,IAAM6sD,EACf3yD,EAAOF,GAAeyR,EAAK1R,MAAOG,EAAMzuB,KAAK0uB,MAAQgT,OAChD,CAEL,MAAMqL,EAAY/sC,KAAKi/E,YAAYlqC,OAAO,CAACC,EAAK3nC,IAAS4B,KAAK6C,IAAIkjC,EAAK3nC,EAAKkwB,QAAS,GACrF5W,EAAIy6D,EAA6B7yD,GAAeyR,EAAK1R,MAAOtuB,KAAKu0B,IAAKv0B,KAAKw0B,OAASuY,EAAY/M,EAAK8e,OAAOxqB,QAAUt0B,KAAKq/E,sB,CAK7H,MAAM3pE,EAAI6Y,GAAeghC,EAAU9gC,EAAMA,EAAOiT,GAGhDxH,EAAIiG,UAAYggD,EAAUhgD,UAAU9R,GAAmBkhC,IACvDr1B,EAAIkG,aAAe,SACnBlG,EAAI6G,YAAci/B,EAAUt9C,MAC5BwX,EAAIgG,UAAY8/B,EAAUt9C,MAC1BwX,EAAIL,KAAOqnD,EAAUjlD,OAErBmF,GAAWlH,EAAK8lC,EAAUtoC,KAAMhiB,EAAGiR,EAAGu6D,EACxC,CAKA7B,mBAAAA,GACE,MAAMrf,EAAYhgE,KAAK8N,QAAQN,MACzB0zE,EAAYr+C,GAAOm9B,EAAUnmC,MAC7BsnD,EAAev+C,GAAUo9B,EAAU1rC,SACzC,OAAO0rC,EAAUtpC,QAAUwqD,EAAUnnD,WAAaonD,EAAa5jD,OAAS,CAC1E,CAKA8jD,gBAAAA,CAAiB3rE,EAAGiR,GAClB,IAAInS,EAAG8sE,EAAQC,EAEf,GAAI71D,GAAWhW,EAAG1V,KAAKyuB,KAAMzuB,KAAK0uB,QAC7BhD,GAAW/E,EAAG3mB,KAAKu0B,IAAKv0B,KAAKw0B,QAGhC,IADA+sD,EAAKvhF,KAAK6+E,eACLrqE,EAAI,EAAGA,EAAI+sE,EAAG76E,SAAU8N,EAG3B,GAFA8sE,EAASC,EAAG/sE,GAERkX,GAAWhW,EAAG4rE,EAAO7yD,KAAM6yD,EAAO7yD,KAAO6yD,EAAOrhF,QAC/CyrB,GAAW/E,EAAG26D,EAAO/sD,IAAK+sD,EAAO/sD,IAAM+sD,EAAO/jD,QAEjD,OAAOv9B,KAAKg/E,YAAYxqE,GAK9B,OAAO,IACT,CAMAgtE,WAAAA,CAAYzuE,GACV,MAAMitB,EAAOhgC,KAAK8N,QAClB,IAAK2zE,GAAW1uE,EAAEzT,KAAM0gC,GACtB,OAIF,MAAM0hD,EAAc1hF,KAAKqhF,iBAAiBtuE,EAAE2C,EAAG3C,EAAE4T,GAEjD,GAAe,cAAX5T,EAAEzT,MAAmC,aAAXyT,EAAEzT,KAAqB,CACnD,MAAMggC,EAAWt/B,KAAK8+E,aAChB6C,EAAWjD,GAAWp/C,EAAUoiD,GAClCpiD,IAAaqiD,GACf/8D,GAAKob,EAAK4hD,QAAS,CAAC7uE,EAAGusB,EAAUt/B,MAAOA,MAG1CA,KAAK8+E,aAAe4C,EAEhBA,IAAgBC,GAClB/8D,GAAKob,EAAKrF,QAAS,CAAC5nB,EAAG2uE,EAAa1hF,MAAOA,KAE/C,MAAW0hF,GACT98D,GAAKob,EAAKphC,QAAS,CAACmU,EAAG2uE,EAAa1hF,MAAOA,KAE/C,EAGF,SAASigF,GAAkB3B,EAAUc,EAAWllD,EAAKgyB,EAAYyzB,GAC/D,MAAMxwC,EAAY0yC,GAAmB31B,EAAYoyB,EAAUc,EAAWllD,GAChEukD,EAAaqD,GAAoBnC,EAAazzB,EAAYkzB,EAAUrlD,YAC1E,MAAO,CAACoV,YAAWsvC,aACrB,CAEA,SAASoD,GAAmB31B,EAAYoyB,EAAUc,EAAWllD,GAC3D,IAAI6nD,EAAiB71B,EAAWx0B,KAIhC,OAHIqqD,GAA4C,kBAAnBA,IAC3BA,EAAiBA,EAAehtC,OAAO,CAACpiC,EAAGC,IAAMD,EAAEjM,OAASkM,EAAElM,OAASiM,EAAIC,IAEtE0rE,EAAYc,EAAU/xE,KAAO,EAAK6sB,EAAIiC,YAAY4lD,GAAgB9hF,KAC3E,CAEA,SAAS6hF,GAAoBnC,EAAazzB,EAAY80B,GACpD,IAAIvC,EAAakB,EAIjB,MAH+B,kBAApBzzB,EAAWx0B,OACpB+mD,EAAawC,GAA0B/0B,EAAY80B,IAE9CvC,CACT,CAEA,SAASwC,GAA0B/0B,EAAY80B,GAC7C,MAAM3gB,EAAcnU,EAAWx0B,KAAOw0B,EAAWx0B,KAAKhxB,OAAS,EAC/D,OAAOs6E,EAAiB3gB,CAC1B,CAEA,SAASohB,GAAWniF,EAAM0gC,GACxB,QAAc,cAAT1gC,GAAiC,aAATA,IAAyB0gC,EAAKrF,UAAWqF,EAAK4hD,aAGvE5hD,EAAKphC,SAAqB,UAATU,GAA6B,YAATA,EAI3C,CAEA,IAAA0iF,GAAe,CACbjxE,GAAI,SAMJkxE,SAAUtD,GAEVr4E,KAAAA,CAAMqvB,EAAOkoD,EAAO/vE,GAClB,MAAM49C,EAAS/1B,EAAM+1B,OAAS,IAAIizB,GAAO,CAACzkD,IAAKvE,EAAMuE,IAAKpsB,UAAS6nB,UACnE+7B,GAAQ5a,UAAUnhB,EAAO+1B,EAAQ59C,GACjC4jD,GAAQyC,OAAOx+B,EAAO+1B,EACxB,EAEAra,IAAAA,CAAK1b,GACH+7B,GAAQ4C,UAAU3+B,EAAOA,EAAM+1B,eACxB/1B,EAAM+1B,MACf,EAKAgS,YAAAA,CAAa/nC,EAAOkoD,EAAO/vE,GACzB,MAAM49C,EAAS/1B,EAAM+1B,OACrBgG,GAAQ5a,UAAUnhB,EAAO+1B,EAAQ59C,GACjC49C,EAAO59C,QAAUA,CACnB,EAIA+wD,WAAAA,CAAYlpC,GACV,MAAM+1B,EAAS/1B,EAAM+1B,OACrBA,EAAOyzB,cACPzzB,EAAOw0B,gBACT,EAGAgC,UAAAA,CAAWvsD,EAAOz2B,GACXA,EAAK4yE,QACRn8C,EAAM+1B,OAAO81B,YAAYtiF,EAAKutC,MAElC,EAEApZ,SAAU,CACRqD,SAAS,EACT64B,SAAU,MACVjhC,MAAO,SACP4jC,UAAU,EACVhtC,SAAS,EACTvC,OAAQ,IAGR/jB,OAAAA,CAAQmU,EAAGm5C,EAAYR,GACrB,MAAMhtD,EAAQwtD,EAAWzmC,aACnB08D,EAAKz2B,EAAO/1B,MACdwsD,EAAGl4B,iBAAiBvrD,IACtByjF,EAAGhuD,KAAKz1B,GACRwtD,EAAW7Q,QAAS,IAEpB8mC,EAAGnuD,KAAKt1B,GACRwtD,EAAW7Q,QAAS,EAExB,EAEA1gB,QAAS,KACTinD,QAAS,KAET9iC,OAAQ,CACNp8B,MAAQwX,GAAQA,EAAIvE,MAAM7nB,QAAQ4U,MAClC47D,SAAU,GACVhqD,QAAS,GAYTq3B,cAAAA,CAAeh2B,GACb,MAAM2D,EAAW3D,EAAMj2B,KAAK45B,UACrBwlB,QAAQ,cAACy/B,EAAA,WAAexgD,EAAU,UAAEoC,EAAA,MAAWzd,EAAA,gBAAOkpC,EAAe,aAAEC,IAAiBl2B,EAAM+1B,OAAO59C,QAE5G,OAAO6nB,EAAMyiB,yBAAyBvjC,IAAKia,IACzC,MAAMzwB,EAAQywB,EAAKgrB,WAAWvO,SAASgzC,EAAgB,OAAIzqE,GACrDgrB,EAAc8D,GAAUvkC,EAAMygC,aAEpC,MAAO,CACLpH,KAAM4B,EAASxK,EAAKpwB,OAAO4O,MAC3B4yB,UAAW7hC,EAAM+6B,gBACjB0yB,UAAWppC,EACX24B,QAASvsB,EAAKoF,QACdiiD,QAAS93E,EAAMq0C,eACfqZ,SAAU1tD,EAAMs0C,WAChBqZ,eAAgB3tD,EAAMu0C,iBACtBqZ,SAAU5tD,EAAMw0C,gBAChB5b,WAAY6H,EAAY7+B,MAAQ6+B,EAAYvB,QAAU,EACtDwD,YAAa1iC,EAAMg7B,YACnB0E,WAAYA,GAAc1/B,EAAM0/B,WAChCC,SAAU3/B,EAAM2/B,SAChBmC,UAAWA,GAAa9hC,EAAM8hC,UAC9B0rB,aAAcD,IAAoBC,GAAgBxtD,EAAMwtD,cAGxDpmC,aAAcqJ,EAAKpwB,QAEpBsB,KACL,GAGFwN,MAAO,CACLkV,MAAQwX,GAAQA,EAAIvE,MAAM7nB,QAAQ4U,MAClCgU,SAAS,EACT64B,SAAU,SACV73B,KAAM,KAIVkB,YAAa,CACXjF,YAAcv0B,IAAUA,EAAKs5B,WAAW,MACxComB,OAAQ,CACNnrB,YAAcv0B,IAAU,CAAC,iBAAkB,SAAU,QAAQm3B,SAASn3B,MCzsBhE,IAAIgjF,QCahB,MAAMC,GAAc,CAIlBC,OAAAA,CAAQ90D,GACN,IAAKA,EAAM9mB,OACT,OAAO,EAGT,IAAI8N,EAAGb,EACH4uE,EAAO,IAAI70D,IACX/G,EAAI,EACJtY,EAAQ,EAEZ,IAAKmG,EAAI,EAAGb,EAAM6Z,EAAM9mB,OAAQ8N,EAAIb,IAAOa,EAAG,CAC5C,MAAM/T,EAAK+sB,EAAMhZ,GAAG42B,QACpB,GAAI3qC,GAAMA,EAAGu4D,WAAY,CACvB,MAAMntB,EAAMprC,EAAGs4D,kBACfwpB,EAAKjhF,IAAIuqC,EAAIn2B,GACbiR,GAAKklB,EAAIllB,IACPtY,C,CAEN,CAGA,GAAc,IAAVA,GAA6B,IAAdk0E,EAAKl1E,KACtB,OAAO,EAGT,MAAMm1E,EAAW,IAAID,GAAMxtC,OAAO,CAACpiC,EAAGC,IAAMD,EAAIC,GAAK2vE,EAAKl1E,KAE1D,MAAO,CACLqI,EAAG8sE,EACH77D,EAAGA,EAAItY,EAEX,EAKA2iD,OAAAA,CAAQxjC,EAAOi1D,GACb,IAAKj1D,EAAM9mB,OACT,OAAO,EAGT,IAGI8N,EAAGb,EAAK+uE,EAHRhtE,EAAI+sE,EAAc/sE,EAClBiR,EAAI87D,EAAc97D,EAClB4pC,EAAc/qD,OAAOuiB,kBAGzB,IAAKvT,EAAI,EAAGb,EAAM6Z,EAAM9mB,OAAQ8N,EAAIb,IAAOa,EAAG,CAC5C,MAAM/T,EAAK+sB,EAAMhZ,GAAG42B,QACpB,GAAI3qC,GAAMA,EAAGu4D,WAAY,CACvB,MAAM3S,EAAS5lD,EAAG+vD,iBACZ19C,EAAI8X,GAAsB63D,EAAep8B,GAE3CvzC,EAAIy9C,IACNA,EAAcz9C,EACd4vE,EAAiBjiF,E,CAGvB,CAEA,GAAIiiF,EAAgB,CAClB,MAAMC,EAAKD,EAAe3pB,kBAC1BrjD,EAAIitE,EAAGjtE,EACPiR,EAAIg8D,EAAGh8D,C,CAGT,MAAO,CACLjR,IACAiR,IAEJ,GAIF,SAASi8D,GAAa31D,EAAM41D,GAU1B,OATIA,IACEjuE,GAAQiuE,GAEV98E,MAAM8d,UAAUmD,KAAKjC,MAAMkI,EAAM41D,GAEjC51D,EAAKjG,KAAK67D,IAIP51D,CACT,CAQA,SAAS61D,GAAcrvE,GACrB,OAAoB,kBAARA,GAAoBA,aAAelU,SAAWkU,EAAIsS,QAAQ,OAAS,EACtEtS,EAAIqT,MAAM,MAEZrT,CACT,CASA,SAASsvE,GAAkBptD,EAAOn3B,GAChC,MAAM,QAAC4sC,EAAO,aAAE3lB,EAAA,MAAc/mB,GAASF,EACjCs7C,EAAankB,EAAM8nB,eAAeh4B,GAAcq0B,YAChD,MAACxsC,EAAA,MAAOxI,GAASg1C,EAAWiG,iBAAiBrhD,GAEnD,MAAO,CACLi3B,QACAroB,QACAs6B,OAAQkS,EAAWqF,UAAUzgD,GAC7Bm8C,IAAKllB,EAAMj2B,KAAK45B,SAAS7T,GAAc/lB,KAAKhB,GAC5CskF,eAAgBl+E,EAChByqB,QAASuqB,EAAW6C,aACpB/B,UAAWl8C,EACX+mB,eACA2lB,UAEJ,CAKA,SAAS63C,GAAeC,EAASp1E,GAC/B,MAAMosB,EAAMgpD,EAAQvtD,MAAMuE,KACpB,KAACipD,EAAI,OAAEC,EAAA,MAAQ51E,GAAS01E,GACxB,SAAC5E,EAAA,UAAUD,GAAavwE,EACxBu1E,EAAWxgD,GAAO/0B,EAAQu1E,UAC1BnC,EAAYr+C,GAAO/0B,EAAQozE,WAC3BoC,EAAazgD,GAAO/0B,EAAQw1E,YAC5BC,EAAiB/1E,EAAM9G,OACvB88E,EAAkBJ,EAAO18E,OACzB+8E,EAAoBN,EAAKz8E,OAEzB4tB,EAAUsO,GAAU90B,EAAQwmB,SAClC,IAAIiJ,EAASjJ,EAAQiJ,OACjBt9B,EAAQ,EAGRyjF,EAAqBP,EAAKpuC,OAAO,CAAC1mC,EAAOs1E,IAAat1E,EAAQs1E,EAASC,OAAOl9E,OAASi9E,EAAStiD,MAAM36B,OAASi9E,EAASE,MAAMn9E,OAAQ,GAQ1I,GAPAg9E,GAAsBR,EAAQY,WAAWp9E,OAASw8E,EAAQa,UAAUr9E,OAEhE68E,IACFhmD,GAAUgmD,EAAiBrC,EAAUnnD,YACnCwpD,EAAiB,GAAKz1E,EAAQk2E,aAC/Bl2E,EAAQm2E,mBAEPP,EAAoB,CAEtB,MAAMQ,EAAiBp2E,EAAQq2E,cAAgBl1E,KAAK6C,IAAIusE,EAAWgF,EAAStpD,YAAcspD,EAAStpD,WACnGwD,GAAUkmD,EAAoBS,GAC5BR,EAAqBD,GAAqBJ,EAAStpD,YACnD2pD,EAAqB,GAAK51E,EAAQs2E,W,CAElCZ,IACFjmD,GAAUzvB,EAAQu2E,gBACjBb,EAAkBF,EAAWvpD,YAC5BypD,EAAkB,GAAK11E,EAAQw2E,eAInC,IAAIC,EAAe,EACnB,MAAMC,EAAe,SAASlkD,GAC5BrgC,EAAQgP,KAAK6C,IAAI7R,EAAOi6B,EAAIiC,YAAYmE,GAAMrgC,MAAQskF,EACxD,EA+BA,OA7BArqD,EAAIsC,OAEJtC,EAAIL,KAAOqnD,EAAUjlD,OACrBjX,GAAKk+D,EAAQ11E,MAAOg3E,GAGpBtqD,EAAIL,KAAOwpD,EAASpnD,OACpBjX,GAAKk+D,EAAQY,WAAWhhC,OAAOogC,EAAQa,WAAYS,GAGnDD,EAAez2E,EAAQq2E,cAAiB7F,EAAW,EAAIxwE,EAAQglD,WAAc,EAC7E9tC,GAAKm+D,EAAOQ,IACV3+D,GAAK2+D,EAASC,OAAQY,GACtBx/D,GAAK2+D,EAAStiD,MAAOmjD,GACrBx/D,GAAK2+D,EAASE,MAAOW,KAIvBD,EAAe,EAGfrqD,EAAIL,KAAOypD,EAAWrnD,OACtBjX,GAAKk+D,EAAQE,OAAQoB,GAErBtqD,EAAI0C,UAGJ38B,GAASq0B,EAAQr0B,MAEV,CAACA,QAAOs9B,SACjB,CAEA,SAASknD,GAAgB9uD,EAAOtoB,GAC9B,MAAM,EAACsZ,EAAA,OAAG4W,GAAUlwB,EAEpB,OAAIsZ,EAAI4W,EAAS,EACR,MACE5W,EAAKgP,EAAM4H,OAASA,EAAS,EAC/B,SAEF,QACT,CAEA,SAASmnD,GAAoBC,EAAQhvD,EAAO7nB,EAAST,GACnD,MAAM,EAACqI,EAAA,MAAGzV,GAASoN,EACbu3E,EAAQ92E,EAAQ+2E,UAAY/2E,EAAQg3E,aAC1C,MAAe,SAAXH,GAAqBjvE,EAAIzV,EAAQ2kF,EAAQjvD,EAAM11B,QAIpC,UAAX0kF,GAAsBjvE,EAAIzV,EAAQ2kF,EAAQ,QAA9C,EAGF,CAEA,SAASG,GAAgBpvD,EAAO7nB,EAAST,EAAM23E,GAC7C,MAAM,EAACtvE,EAAA,MAAGzV,GAASoN,GACZpN,MAAOglF,EAAYjyC,WAAW,KAACvkB,EAAI,MAAEC,IAAUiH,EACtD,IAAIgvD,EAAS,SAcb,MAZe,WAAXK,EACFL,EAASjvE,IAAM+Y,EAAOC,GAAS,EAAI,OAAS,QACnChZ,GAAKzV,EAAQ,EACtB0kF,EAAS,OACAjvE,GAAKuvE,EAAahlF,EAAQ,IACnC0kF,EAAS,SAGPD,GAAoBC,EAAQhvD,EAAO7nB,EAAST,KAC9Cs3E,EAAS,UAGJA,CACT,CAKA,SAASO,GAAmBvvD,EAAO7nB,EAAST,GAC1C,MAAM23E,EAAS33E,EAAK23E,QAAUl3E,EAAQk3E,QAAUP,GAAgB9uD,EAAOtoB,GAEvE,MAAO,CACLs3E,OAAQt3E,EAAKs3E,QAAU72E,EAAQ62E,QAAUI,GAAgBpvD,EAAO7nB,EAAST,EAAM23E,GAC/EA,SAEJ,CAEA,SAASG,GAAO93E,EAAMs3E,GACpB,IAAI,EAACjvE,EAAA,MAAGzV,GAASoN,EAMjB,MALe,UAAXs3E,EACFjvE,GAAKzV,EACe,WAAX0kF,IACTjvE,GAAMzV,EAAQ,GAETyV,CACT,CAEA,SAAS0vE,GAAO/3E,EAAM23E,EAAQK,GAE5B,IAAI,EAAC1+D,EAAA,OAAG4W,GAAUlwB,EAQlB,MAPe,QAAX23E,EACFr+D,GAAK0+D,EAEL1+D,GADoB,WAAXq+D,EACJznD,EAAS8nD,EAER9nD,EAAS,EAEV5W,CACT,CAKA,SAAS2+D,GAAmBx3E,EAAST,EAAMk4E,EAAW5vD,GACpD,MAAM,UAACkvD,EAAS,aAAEC,EAAA,aAAclnD,GAAgB9vB,GAC1C,OAAC62E,EAAA,OAAQK,GAAUO,EACnBF,EAAiBR,EAAYC,GAC7B,QAACjjD,EAAO,SAAEG,EAAQ,WAAEF,EAAA,YAAYC,GAAeY,GAAc/E,GAEnE,IAAIloB,EAAIyvE,GAAO93E,EAAMs3E,GACrB,MAAMh+D,EAAIy+D,GAAO/3E,EAAM23E,EAAQK,GAc/B,MAZe,WAAXL,EACa,SAAXL,EACFjvE,GAAK2vE,EACe,UAAXV,IACTjvE,GAAK2vE,GAEa,SAAXV,EACTjvE,GAAKzG,KAAK6C,IAAI+vB,EAASC,GAAc+iD,EACjB,UAAXF,IACTjvE,GAAKzG,KAAK6C,IAAIkwB,EAAUD,GAAe8iD,GAGlC,CACLnvE,EAAG8V,GAAY9V,EAAG,EAAGigB,EAAM11B,MAAQoN,EAAKpN,OACxC0mB,EAAG6E,GAAY7E,EAAG,EAAGgP,EAAM4H,OAASlwB,EAAKkwB,QAE7C,CAEA,SAASioD,GAAYtC,EAAS50D,EAAOxgB,GACnC,MAAMwmB,EAAUsO,GAAU90B,EAAQwmB,SAElC,MAAiB,WAAVhG,EACH40D,EAAQxtE,EAAIwtE,EAAQjjF,MAAQ,EAClB,UAAVquB,EACE40D,EAAQxtE,EAAIwtE,EAAQjjF,MAAQq0B,EAAQ5F,MACpCw0D,EAAQxtE,EAAI4e,EAAQ7F,IAC5B,CAKA,SAASg3D,GAAwB7gE,GAC/B,OAAOg+D,GAAa,GAAIE,GAAcl+D,GACxC,CAEA,SAAS8gE,GAAqBx+C,EAAQg8C,EAASyC,GAC7C,OAAOliD,GAAcyD,EAAQ,CAC3Bg8C,UACAyC,eACArmF,KAAM,WAEV,CAEA,SAASsmF,GAAkBhyC,EAAWpa,GACpC,MAAM2B,EAAW3B,GAAWA,EAAQjK,SAAWiK,EAAQjK,QAAQ2zD,SAAW1pD,EAAQjK,QAAQ2zD,QAAQtvC,UAClG,OAAOzY,EAAWyY,EAAUzY,SAASA,GAAYyY,CACnD,CAEA,MAAMiyC,GAAmB,CAEvBC,YAAapiE,GACblW,KAAAA,CAAMm4E,GACJ,GAAIA,EAAaj/E,OAAS,EAAG,CAC3B,MAAMlI,EAAOmnF,EAAa,GACpB7mC,EAAStgD,EAAKm3B,MAAMj2B,KAAKo/C,OACzBinC,EAAajnC,EAASA,EAAOp4C,OAAS,EAE5C,GAAI1G,MAAQA,KAAK8N,SAAiC,YAAtB9N,KAAK8N,QAAQysB,KACvC,OAAO/7B,EAAK+wB,QAAQjiB,OAAS,GACxB,GAAI9O,EAAK8O,MACd,OAAO9O,EAAK8O,MACP,GAAIy4E,EAAa,GAAKvnF,EAAKo8C,UAAYmrC,EAC5C,OAAOjnC,EAAOtgD,EAAKo8C,U,CAIvB,MAAO,EACT,EACAorC,WAAYtiE,GAGZogE,WAAYpgE,GAGZuiE,YAAaviE,GACbpW,KAAAA,CAAM44E,GACJ,GAAIlmF,MAAQA,KAAK8N,SAAiC,YAAtB9N,KAAK8N,QAAQysB,KACvC,OAAO2rD,EAAY54E,MAAQ,KAAO44E,EAAYlD,gBAAkBkD,EAAYlD,eAG9E,IAAI11E,EAAQ44E,EAAY32D,QAAQjiB,OAAS,GAErCA,IACFA,GAAS,MAEX,MAAMxI,EAAQohF,EAAYlD,eAI1B,OAHKp/D,GAAc9e,KACjBwI,GAASxI,GAEJwI,CACT,EACA64E,UAAAA,CAAWD,GACT,MAAMp3D,EAAOo3D,EAAYvwD,MAAM8nB,eAAeyoC,EAAYzgE,cACpD3X,EAAUghB,EAAKgrB,WAAWvO,SAAS26C,EAAYtrC,WACrD,MAAO,CACLvhB,YAAavrB,EAAQurB,YACrBD,gBAAiBtrB,EAAQsrB,gBACzB0F,YAAahxB,EAAQgxB,YACrB6T,WAAY7kC,EAAQ6kC,WACpBC,iBAAkB9kC,EAAQ8kC,iBAC1BiZ,aAAc,EAElB,EACAu6B,cAAAA,GACE,OAAOpmF,KAAK8N,QAAQu4E,SACtB,EACAC,eAAAA,CAAgBJ,GACd,MAAMp3D,EAAOo3D,EAAYvwD,MAAM8nB,eAAeyoC,EAAYzgE,cACpD3X,EAAUghB,EAAKgrB,WAAWvO,SAAS26C,EAAYtrC,WACrD,MAAO,CACL7c,WAAYjwB,EAAQiwB,WACpBC,SAAUlwB,EAAQkwB,SAEtB,EACAuoD,WAAY7iE,GAGZqgE,UAAWrgE,GAGX8iE,aAAc9iE,GACd0/D,OAAQ1/D,GACR+iE,YAAa/iE,IAYf,SAASgjE,GAA2B9yC,EAAWx0C,EAAM86B,EAAK0sC,GACxD,MAAM59C,EAAS4qB,EAAUx0C,GAAM2kB,KAAKmW,EAAK0sC,GAEzC,MAAsB,qBAAX59C,EACF68D,GAAiBzmF,GAAM2kB,KAAKmW,EAAK0sC,GAGnC59C,CACT,CAEO,MAAM29D,WAAgB7tB,GAO3B12C,WAAAA,CAAYw0B,GACVgP,QAEA5lD,KAAK4mF,QAAU,EACf5mF,KAAKs0C,QAAU,GACft0C,KAAK6mF,oBAAiB/yE,EACtB9T,KAAK8mF,WAAQhzE,EACb9T,KAAK+mF,uBAAoBjzE,EACzB9T,KAAKgnF,cAAgB,GACrBhnF,KAAKy3C,iBAAc3jC,EACnB9T,KAAKk8C,cAAWpoC,EAChB9T,KAAK21B,MAAQihB,EAAOjhB,MACpB31B,KAAK8N,QAAU8oC,EAAO9oC,QACtB9N,KAAKinF,gBAAanzE,EAClB9T,KAAKwN,WAAQsG,EACb9T,KAAK8jF,gBAAahwE,EAClB9T,KAAKmjF,UAAOrvE,EACZ9T,KAAK+jF,eAAYjwE,EACjB9T,KAAKojF,YAAStvE,EACd9T,KAAK2kF,YAAS7wE,EACd9T,KAAKglF,YAASlxE,EACd9T,KAAK0V,OAAI5B,EACT9T,KAAK2mB,OAAI7S,EACT9T,KAAKu9B,YAASzpB,EACd9T,KAAKC,WAAQ6T,EACb9T,KAAKknF,YAASpzE,EACd9T,KAAKmnF,YAASrzE,EAGd9T,KAAKonF,iBAActzE,EACnB9T,KAAKqnF,sBAAmBvzE,EACxB9T,KAAKsnF,qBAAkBxzE,CACzB,CAEAwoC,UAAAA,CAAWxuC,GACT9N,KAAK8N,QAAUA,EACf9N,KAAK+mF,uBAAoBjzE,EACzB9T,KAAKk8C,cAAWpoC,CAClB,CAKA2sC,kBAAAA,GACE,MAAMxF,EAASj7C,KAAK+mF,kBAEpB,GAAI9rC,EACF,OAAOA,EAGT,MAAMtlB,EAAQ31B,KAAK21B,MACb7nB,EAAU9N,KAAK8N,QAAQ63B,WAAW3lC,KAAKo9B,cACvC4C,EAAOlyB,EAAQ0rD,SAAW7jC,EAAM7nB,QAAQgmB,WAAahmB,EAAQmmB,WAC7DA,EAAa,IAAI0iB,GAAW32C,KAAK21B,MAAOqK,GAK9C,OAJIA,EAAKmE,aACPnkC,KAAK+mF,kBAAoB/4E,OAAOwyC,OAAOvsB,IAGlCA,CACT,CAKAmJ,UAAAA,GACE,OAAOp9B,KAAKk8C,WACZl8C,KAAKk8C,SAAWwpC,GAAqB1lF,KAAK21B,MAAMyH,aAAcp9B,KAAMA,KAAKgnF,eAC3E,CAEAO,QAAAA,CAAS/tD,EAAS1rB,GAChB,MAAM,UAAC8lC,GAAa9lC,EAEdg4E,EAAcY,GAA2B9yC,EAAW,cAAe5zC,KAAMw5B,GACzEhsB,EAAQk5E,GAA2B9yC,EAAW,QAAS5zC,KAAMw5B,GAC7DwsD,EAAaU,GAA2B9yC,EAAW,aAAc5zC,KAAMw5B,GAE7E,IAAI6H,EAAQ,GAKZ,OAJAA,EAAQuhD,GAAavhD,EAAOyhD,GAAcgD,IAC1CzkD,EAAQuhD,GAAavhD,EAAOyhD,GAAct1E,IAC1C6zB,EAAQuhD,GAAavhD,EAAOyhD,GAAckD,IAEnC3kD,CACT,CAEAmmD,aAAAA,CAAc7B,EAAc73E,GAC1B,OAAO23E,GACLiB,GAA2B54E,EAAQ8lC,UAAW,aAAc5zC,KAAM2lF,GAEtE,CAEA8B,OAAAA,CAAQ9B,EAAc73E,GACpB,MAAM,UAAC8lC,GAAa9lC,EACd45E,EAAY,GAgBlB,OAdA1iE,GAAK2gE,EAAensD,IAClB,MAAMmqD,EAAW,CACfC,OAAQ,GACRviD,MAAO,GACPwiD,MAAO,IAEH8D,EAAS/B,GAAkBhyC,EAAWpa,GAC5CopD,GAAae,EAASC,OAAQd,GAAc4D,GAA2BiB,EAAQ,cAAe3nF,KAAMw5B,KACpGopD,GAAae,EAAStiD,MAAOqlD,GAA2BiB,EAAQ,QAAS3nF,KAAMw5B,IAC/EopD,GAAae,EAASE,MAAOf,GAAc4D,GAA2BiB,EAAQ,aAAc3nF,KAAMw5B,KAElGkuD,EAAU1gE,KAAK28D,KAGV+D,CACT,CAEAE,YAAAA,CAAajC,EAAc73E,GACzB,OAAO23E,GACLiB,GAA2B54E,EAAQ8lC,UAAW,YAAa5zC,KAAM2lF,GAErE,CAGAkC,SAAAA,CAAUlC,EAAc73E,GACtB,MAAM,UAAC8lC,GAAa9lC,EAEd04E,EAAeE,GAA2B9yC,EAAW,eAAgB5zC,KAAM2lF,GAC3EvC,EAASsD,GAA2B9yC,EAAW,SAAU5zC,KAAM2lF,GAC/Dc,EAAcC,GAA2B9yC,EAAW,cAAe5zC,KAAM2lF,GAE/E,IAAItkD,EAAQ,GAKZ,OAJAA,EAAQuhD,GAAavhD,EAAOyhD,GAAc0D,IAC1CnlD,EAAQuhD,GAAavhD,EAAOyhD,GAAcM,IAC1C/hD,EAAQuhD,GAAavhD,EAAOyhD,GAAc2D,IAEnCplD,CACT,CAKAymD,YAAAA,CAAah6E,GACX,MAAM+lB,EAAS7zB,KAAKs0C,QACd50C,EAAOM,KAAK21B,MAAMj2B,KAClB0nF,EAAc,GACdC,EAAmB,GACnBC,EAAkB,GACxB,IACI9yE,EAAGb,EADHgyE,EAAe,GAGnB,IAAKnxE,EAAI,EAAGb,EAAMkgB,EAAOntB,OAAQ8N,EAAIb,IAAOa,EAC1CmxE,EAAa3+D,KAAK+7D,GAAkB/iF,KAAK21B,MAAO9B,EAAOrf,KAyBzD,OArBI1G,EAAQi5B,SACV4+C,EAAeA,EAAa5+C,OAAO,CAACqE,EAAS1sC,EAAOkrB,IAAU9b,EAAQi5B,OAAOqE,EAAS1sC,EAAOkrB,EAAOlqB,KAIlGoO,EAAQi6E,WACVpC,EAAeA,EAAaz8D,KAAK,CAACvW,EAAGC,IAAM9E,EAAQi6E,SAASp1E,EAAGC,EAAGlT,KAIpEslB,GAAK2gE,EAAensD,IAClB,MAAMmuD,EAAS/B,GAAkB93E,EAAQ8lC,UAAWpa,GACpD4tD,EAAYpgE,KAAK0/D,GAA2BiB,EAAQ,aAAc3nF,KAAMw5B,IACxE6tD,EAAiBrgE,KAAK0/D,GAA2BiB,EAAQ,kBAAmB3nF,KAAMw5B,IAClF8tD,EAAgBtgE,KAAK0/D,GAA2BiB,EAAQ,iBAAkB3nF,KAAMw5B,MAGlFx5B,KAAKonF,YAAcA,EACnBpnF,KAAKqnF,iBAAmBA,EACxBrnF,KAAKsnF,gBAAkBA,EACvBtnF,KAAKinF,WAAatB,EACXA,CACT,CAEAvvC,MAAAA,CAAO1lB,EAASohD,GACd,MAAMhkE,EAAU9N,KAAK8N,QAAQ63B,WAAW3lC,KAAKo9B,cACvCvJ,EAAS7zB,KAAKs0C,QACpB,IAAI1gB,EACA+xD,EAAe,GAEnB,GAAK9xD,EAAOntB,OAML,CACL,MAAM6oD,EAAW8yB,GAAYv0E,EAAQyhD,UAAUxrC,KAAK/jB,KAAM6zB,EAAQ7zB,KAAK6mF,gBACvElB,EAAe3lF,KAAK8nF,aAAah6E,GAEjC9N,KAAKwN,MAAQxN,KAAKunF,SAAS5B,EAAc73E,GACzC9N,KAAK8jF,WAAa9jF,KAAKwnF,cAAc7B,EAAc73E,GACnD9N,KAAKmjF,KAAOnjF,KAAKynF,QAAQ9B,EAAc73E,GACvC9N,KAAK+jF,UAAY/jF,KAAK4nF,aAAajC,EAAc73E,GACjD9N,KAAKojF,OAASpjF,KAAK6nF,UAAUlC,EAAc73E,GAE3C,MAAMT,EAAOrN,KAAK8mF,MAAQ7D,GAAejjF,KAAM8N,GACzCk6E,EAAkBh6E,OAAO8T,OAAO,CAAC,EAAGytC,EAAUliD,GAC9Ck4E,EAAYL,GAAmBllF,KAAK21B,MAAO7nB,EAASk6E,GACpDC,EAAkB3C,GAAmBx3E,EAASk6E,EAAiBzC,EAAWvlF,KAAK21B,OAErF31B,KAAK2kF,OAASY,EAAUZ,OACxB3kF,KAAKglF,OAASO,EAAUP,OAExBpxD,EAAa,CACXgzD,QAAS,EACTlxE,EAAGuyE,EAAgBvyE,EACnBiR,EAAGshE,EAAgBthE,EACnB1mB,MAAOoN,EAAKpN,MACZs9B,OAAQlwB,EAAKkwB,OACb2pD,OAAQ33B,EAAS75C,EACjByxE,OAAQ53B,EAAS5oC,E,MA9BE,IAAjB3mB,KAAK4mF,UACPhzD,EAAa,CACXgzD,QAAS,IAgCf5mF,KAAKgnF,cAAgBrB,EACrB3lF,KAAKk8C,cAAWpoC,EAEZ8f,GACF5zB,KAAKygD,qBAAqBrK,OAAOp2C,KAAM4zB,GAGrClD,GAAW5iB,EAAQo6E,UACrBp6E,EAAQo6E,SAASnkE,KAAK/jB,KAAM,CAAC21B,MAAO31B,KAAK21B,MAAOutD,QAASljF,KAAM8xE,UAEnE,CAEAqW,SAAAA,CAAUC,EAAcluD,EAAK7sB,EAAMS,GACjC,MAAMu6E,EAAgBroF,KAAKsoF,iBAAiBF,EAAc/6E,EAAMS,GAEhEosB,EAAIwE,OAAO2pD,EAAc3lB,GAAI2lB,EAAc1lB,IAC3CzoC,EAAIwE,OAAO2pD,EAAczlB,GAAIylB,EAAcxlB,IAC3C3oC,EAAIwE,OAAO2pD,EAAcE,GAAIF,EAAcG,GAC7C,CAEAF,gBAAAA,CAAiBF,EAAc/6E,EAAMS,GACnC,MAAM,OAAC62E,EAAM,OAAEK,GAAUhlF,MACnB,UAAC6kF,EAAA,aAAWjnD,GAAgB9vB,GAC5B,QAAC+zB,EAAO,SAAEG,EAAQ,WAAEF,EAAA,YAAYC,GAAeY,GAAc/E,IAC5DloB,EAAG+yE,EAAK9hE,EAAG+hE,GAAON,GACnB,MAACnoF,EAAA,OAAOs9B,GAAUlwB,EACxB,IAAIq1D,EAAIE,EAAI2lB,EAAI5lB,EAAIE,EAAI2lB,EAgDxB,MA9Ce,WAAXxD,GACFniB,EAAK6lB,EAAOnrD,EAAS,EAEN,SAAXonD,GACFjiB,EAAK+lB,EACL7lB,EAAKF,EAAKmiB,EAGVliB,EAAKE,EAAKgiB,EACV2D,EAAK3lB,EAAKgiB,IAEVniB,EAAK+lB,EAAMxoF,EACX2iE,EAAKF,EAAKmiB,EAGVliB,EAAKE,EAAKgiB,EACV2D,EAAK3lB,EAAKgiB,GAGZ0D,EAAK7lB,IAGHE,EADa,SAAX+hB,EACG8D,EAAMx5E,KAAK6C,IAAI+vB,EAASC,GAAe+iD,EACxB,UAAXF,EACJ8D,EAAMxoF,EAAQgP,KAAK6C,IAAIkwB,EAAUD,GAAe8iD,EAEhD7kF,KAAKknF,OAGG,QAAXlC,GACFriB,EAAK+lB,EACL7lB,EAAKF,EAAKkiB,EAGVniB,EAAKE,EAAKiiB,EACV0D,EAAK3lB,EAAKiiB,IAEVliB,EAAK+lB,EAAMnrD,EACXslC,EAAKF,EAAKkiB,EAGVniB,EAAKE,EAAKiiB,EACV0D,EAAK3lB,EAAKiiB,GAEZ2D,EAAK7lB,GAEA,CAACD,KAAIE,KAAI2lB,KAAI5lB,KAAIE,KAAI2lB,KAC9B,CAEAjkB,SAAAA,CAAUx6B,EAAI7P,EAAKpsB,GACjB,MAAMN,EAAQxN,KAAKwN,MACb9G,EAAS8G,EAAM9G,OACrB,IAAIw6E,EAAW8C,EAAcxvE,EAE7B,GAAI9N,EAAQ,CACV,MAAMy5E,EAAY7wC,GAAcxhC,EAAQ6gB,IAAK3uB,KAAK0V,EAAG1V,KAAKC,OAa1D,IAXA8pC,EAAGr0B,EAAI8vE,GAAYxlF,KAAM8N,EAAQ4tD,WAAY5tD,GAE7CosB,EAAIiG,UAAYggD,EAAUhgD,UAAUryB,EAAQ4tD,YAC5CxhC,EAAIkG,aAAe,SAEnB8gD,EAAYr+C,GAAO/0B,EAAQozE,WAC3B8C,EAAel2E,EAAQk2E,aAEvB9pD,EAAIgG,UAAYpyB,EAAQ66E,WACxBzuD,EAAIL,KAAOqnD,EAAUjlD,OAEhBznB,EAAI,EAAGA,EAAI9N,IAAU8N,EACxB0lB,EAAIyH,SAASn0B,EAAMgH,GAAI2rE,EAAUzqE,EAAEq0B,EAAGr0B,GAAIq0B,EAAGpjB,EAAIu6D,EAAUnnD,WAAa,GACxEgQ,EAAGpjB,GAAKu6D,EAAUnnD,WAAaiqD,EAE3BxvE,EAAI,IAAM9N,IACZqjC,EAAGpjB,GAAK7Y,EAAQm2E,kBAAoBD,E,CAI5C,CAKA4E,aAAAA,CAAc1uD,EAAK6P,EAAIv1B,EAAG2rE,EAAWryE,GACnC,MAAMq4E,EAAanmF,KAAKonF,YAAY5yE,GAC9B8xE,EAAkBtmF,KAAKqnF,iBAAiB7yE,IACxC,UAAC6pE,EAAA,SAAWC,GAAYxwE,EACxBu1E,EAAWxgD,GAAO/0B,EAAQu1E,UAC1BwF,EAASrD,GAAYxlF,KAAM,OAAQ8N,GACnCg7E,EAAY3I,EAAUzqE,EAAEmzE,GACxBE,EAAU1K,EAAYgF,EAAStpD,YAAcspD,EAAStpD,WAAaskD,GAAa,EAAI,EACpF2K,EAASj/C,EAAGpjB,EAAIoiE,EAEtB,GAAIj7E,EAAQywE,cAAe,CACzB,MAAMmC,EAAc,CAClBziD,OAAQhvB,KAAK8C,IAAIusE,EAAUD,GAAa,EACxCtgD,WAAYuoD,EAAgBvoD,WAC5BC,SAAUsoD,EAAgBtoD,SAC1Bc,YAAa,GAITosB,EAAUi1B,EAAUjxC,WAAW45C,EAAWxK,GAAYA,EAAW,EACjEnzB,EAAU69B,EAAS3K,EAAY,EAGrCnkD,EAAI6G,YAAcjzB,EAAQm7E,mBAC1B/uD,EAAIgG,UAAYpyB,EAAQm7E,mBACxBzrD,GAAUtD,EAAKwmD,EAAax1B,EAASC,GAGrCjxB,EAAI6G,YAAcolD,EAAW9sD,YAC7Ba,EAAIgG,UAAYimD,EAAW/sD,gBAC3BoE,GAAUtD,EAAKwmD,EAAax1B,EAASC,E,KAChC,CAELjxB,EAAIjD,UAAYhT,GAASkiE,EAAWrnD,aAAe7vB,KAAK6C,OAAO9D,OAAOse,OAAO65D,EAAWrnD,cAAiBqnD,EAAWrnD,aAAe,EACnI5E,EAAI6G,YAAcolD,EAAW9sD,YAC7Ba,EAAIgqC,YAAYiiB,EAAWxzC,YAAc,IACzCzY,EAAI8xB,eAAiBm6B,EAAWvzC,kBAAoB,EAGpD,MAAMs2C,EAAS/I,EAAUjxC,WAAW45C,EAAWxK,GACzC6K,EAAShJ,EAAUjxC,WAAWixC,EAAUlxC,MAAM65C,EAAW,GAAIxK,EAAW,GACxEzyB,EAAelpB,GAAcwjD,EAAWt6B,cAE1C79C,OAAOse,OAAOu/B,GAAcoc,KAAKv2D,GAAW,IAANA,IACxCwoB,EAAImE,YACJnE,EAAIgG,UAAYpyB,EAAQm7E,mBACxBrnD,GAAmB1H,EAAK,CACtBxkB,EAAGwzE,EACHviE,EAAGqiE,EACH10E,EAAGgqE,EACHzsE,EAAGwsE,EACHpgD,OAAQ4tB,IAEV3xB,EAAI2E,OACJ3E,EAAI6E,SAGJ7E,EAAIgG,UAAYimD,EAAW/sD,gBAC3Bc,EAAImE,YACJuD,GAAmB1H,EAAK,CACtBxkB,EAAGyzE,EACHxiE,EAAGqiE,EAAS,EACZ10E,EAAGgqE,EAAW,EACdzsE,EAAGwsE,EAAY,EACfpgD,OAAQ4tB,IAEV3xB,EAAI2E,SAGJ3E,EAAIgG,UAAYpyB,EAAQm7E,mBACxB/uD,EAAIiH,SAAS+nD,EAAQF,EAAQ1K,EAAUD,GACvCnkD,EAAIkvD,WAAWF,EAAQF,EAAQ1K,EAAUD,GAEzCnkD,EAAIgG,UAAYimD,EAAW/sD,gBAC3Bc,EAAIiH,SAASgoD,EAAQH,EAAS,EAAG1K,EAAW,EAAGD,EAAY,G,CAK/DnkD,EAAIgG,UAAYlgC,KAAKsnF,gBAAgB9yE,EACvC,CAEA60E,QAAAA,CAASt/C,EAAI7P,EAAKpsB,GAChB,MAAM,KAACq1E,GAAQnjF,MACT,YAACokF,EAAA,UAAakF,EAAA,cAAWnF,EAAA,UAAe9F,EAAA,SAAWC,EAAA,WAAUxrB,GAAchlD,EAC3Eu1E,EAAWxgD,GAAO/0B,EAAQu1E,UAChC,IAAIa,EAAiBb,EAAStpD,WAC1BwvD,EAAe,EAEnB,MAAMpJ,EAAY7wC,GAAcxhC,EAAQ6gB,IAAK3uB,KAAK0V,EAAG1V,KAAKC,OAEpDupF,EAAiB,SAASlpD,GAC9BpG,EAAIyH,SAASrB,EAAM6/C,EAAUzqE,EAAEq0B,EAAGr0B,EAAI6zE,GAAex/C,EAAGpjB,EAAIu9D,EAAiB,GAC7En6C,EAAGpjB,GAAKu9D,EAAiBE,CAC3B,EAEMqF,EAA0BtJ,EAAUhgD,UAAUmpD,GACpD,IAAI3F,EAAU+F,EAAWroD,EAAO7sB,EAAG+L,EAAG+E,EAAMmX,EAiB5C,IAfAvC,EAAIiG,UAAYmpD,EAChBpvD,EAAIkG,aAAe,SACnBlG,EAAIL,KAAOwpD,EAASpnD,OAEpB8N,EAAGr0B,EAAI8vE,GAAYxlF,KAAMypF,EAAyB37E,GAGlDosB,EAAIgG,UAAYpyB,EAAQu4E,UACxBrhE,GAAKhlB,KAAK8jF,WAAY0F,GAEtBD,EAAepF,GAA6C,UAA5BsF,EACd,WAAdH,EAA0BhL,EAAW,EAAIxrB,EAAewrB,EAAW,EAAIxrB,EACvE,EAGCt+C,EAAI,EAAG8Q,EAAO69D,EAAKz8E,OAAQ8N,EAAI8Q,IAAQ9Q,EAAG,CAc7C,IAbAmvE,EAAWR,EAAK3uE,GAChBk1E,EAAY1pF,KAAKsnF,gBAAgB9yE,GAEjC0lB,EAAIgG,UAAYwpD,EAChB1kE,GAAK2+D,EAASC,OAAQ4F,GAEtBnoD,EAAQsiD,EAAStiD,MAEb8iD,GAAiB9iD,EAAM36B,SACzB1G,KAAK4oF,cAAc1uD,EAAK6P,EAAIv1B,EAAG2rE,EAAWryE,GAC1Co2E,EAAiBj1E,KAAK6C,IAAIuxE,EAAStpD,WAAYskD,IAG5C99D,EAAI,EAAGkc,EAAO4E,EAAM36B,OAAQ6Z,EAAIkc,IAAQlc,EAC3CipE,EAAenoD,EAAM9gB,IAErB2jE,EAAiBb,EAAStpD,WAG5B/U,GAAK2+D,EAASE,MAAO2F,EACvB,CAGAD,EAAe,EACfrF,EAAiBb,EAAStpD,WAG1B/U,GAAKhlB,KAAK+jF,UAAWyF,GACrBz/C,EAAGpjB,GAAKy9D,CACV,CAEAuF,UAAAA,CAAW5/C,EAAI7P,EAAKpsB,GAClB,MAAMs1E,EAASpjF,KAAKojF,OACd18E,EAAS08E,EAAO18E,OACtB,IAAI48E,EAAY9uE,EAEhB,GAAI9N,EAAQ,CACV,MAAMy5E,EAAY7wC,GAAcxhC,EAAQ6gB,IAAK3uB,KAAK0V,EAAG1V,KAAKC,OAa1D,IAXA8pC,EAAGr0B,EAAI8vE,GAAYxlF,KAAM8N,EAAQ87E,YAAa97E,GAC9Ci8B,EAAGpjB,GAAK7Y,EAAQu2E,gBAEhBnqD,EAAIiG,UAAYggD,EAAUhgD,UAAUryB,EAAQ87E,aAC5C1vD,EAAIkG,aAAe,SAEnBkjD,EAAazgD,GAAO/0B,EAAQw1E,YAE5BppD,EAAIgG,UAAYpyB,EAAQ+7E,YACxB3vD,EAAIL,KAAOypD,EAAWrnD,OAEjBznB,EAAI,EAAGA,EAAI9N,IAAU8N,EACxB0lB,EAAIyH,SAASyhD,EAAO5uE,GAAI2rE,EAAUzqE,EAAEq0B,EAAGr0B,GAAIq0B,EAAGpjB,EAAI28D,EAAWvpD,WAAa,GAC1EgQ,EAAGpjB,GAAK28D,EAAWvpD,WAAajsB,EAAQw2E,a,CAG9C,CAEAvgB,cAAAA,CAAeh6B,EAAI7P,EAAK4vD,EAAah8E,GACnC,MAAM,OAAC62E,EAAM,OAAEK,GAAUhlF,MACnB,EAAC0V,EAAA,EAAGiR,GAAKojB,GACT,MAAC9pC,EAAA,OAAOs9B,GAAUusD,GAClB,QAACjoD,EAAA,SAASG,EAAA,WAAUF,EAAA,YAAYC,GAAeY,GAAc70B,EAAQ8vB,cAE3E1D,EAAIgG,UAAYpyB,EAAQsrB,gBACxBc,EAAI6G,YAAcjzB,EAAQurB,YAC1Ba,EAAIjD,UAAYnpB,EAAQgxB,YAExB5E,EAAImE,YACJnE,EAAIuE,OAAO/oB,EAAImsB,EAASlb,GACT,QAAXq+D,GACFhlF,KAAKmoF,UAAUp+C,EAAI7P,EAAK4vD,EAAah8E,GAEvCosB,EAAIwE,OAAOhpB,EAAIzV,EAAQ+hC,EAAUrb,GACjCuT,EAAI6vD,iBAAiBr0E,EAAIzV,EAAO0mB,EAAGjR,EAAIzV,EAAO0mB,EAAIqb,GACnC,WAAXgjD,GAAkC,UAAXL,GACzB3kF,KAAKmoF,UAAUp+C,EAAI7P,EAAK4vD,EAAah8E,GAEvCosB,EAAIwE,OAAOhpB,EAAIzV,EAAO0mB,EAAI4W,EAASwE,GACnC7H,EAAI6vD,iBAAiBr0E,EAAIzV,EAAO0mB,EAAI4W,EAAQ7nB,EAAIzV,EAAQ8hC,EAAapb,EAAI4W,GAC1D,WAAXynD,GACFhlF,KAAKmoF,UAAUp+C,EAAI7P,EAAK4vD,EAAah8E,GAEvCosB,EAAIwE,OAAOhpB,EAAIosB,EAAYnb,EAAI4W,GAC/BrD,EAAI6vD,iBAAiBr0E,EAAGiR,EAAI4W,EAAQ7nB,EAAGiR,EAAI4W,EAASuE,GACrC,WAAXkjD,GAAkC,SAAXL,GACzB3kF,KAAKmoF,UAAUp+C,EAAI7P,EAAK4vD,EAAah8E,GAEvCosB,EAAIwE,OAAOhpB,EAAGiR,EAAIkb,GAClB3H,EAAI6vD,iBAAiBr0E,EAAGiR,EAAGjR,EAAImsB,EAASlb,GACxCuT,EAAIsE,YAEJtE,EAAI2E,OAEA/wB,EAAQgxB,YAAc,GACxB5E,EAAI6E,QAER,CAMAirD,sBAAAA,CAAuBl8E,GACrB,MAAM6nB,EAAQ31B,KAAK21B,MACbge,EAAQ3zC,KAAKy3C,YACbwyC,EAAQt2C,GAASA,EAAMj+B,EACvBw0E,EAAQv2C,GAASA,EAAMhtB,EAC7B,GAAIsjE,GAASC,EAAO,CAClB,MAAM36B,EAAW8yB,GAAYv0E,EAAQyhD,UAAUxrC,KAAK/jB,KAAMA,KAAKs0C,QAASt0C,KAAK6mF,gBAC7E,IAAKt3B,EACH,OAEF,MAAMliD,EAAOrN,KAAK8mF,MAAQ7D,GAAejjF,KAAM8N,GACzCk6E,EAAkBh6E,OAAO8T,OAAO,CAAC,EAAGytC,EAAUvvD,KAAK8mF,OACnDvB,EAAYL,GAAmBvvD,EAAO7nB,EAASk6E,GAC/Cj4D,EAAQu1D,GAAmBx3E,EAASk6E,EAAiBzC,EAAW5vD,GAClEs0D,EAAM/zC,MAAQnmB,EAAMra,GAAKw0E,EAAMh0C,MAAQnmB,EAAMpJ,IAC/C3mB,KAAK2kF,OAASY,EAAUZ,OACxB3kF,KAAKglF,OAASO,EAAUP,OACxBhlF,KAAKC,MAAQoN,EAAKpN,MAClBD,KAAKu9B,OAASlwB,EAAKkwB,OACnBv9B,KAAKknF,OAAS33B,EAAS75C,EACvB1V,KAAKmnF,OAAS53B,EAAS5oC,EACvB3mB,KAAKygD,qBAAqBrK,OAAOp2C,KAAM+vB,G,CAG7C,CAMAo6D,WAAAA,GACE,QAASnqF,KAAK4mF,OAChB,CAEAvyC,IAAAA,CAAKna,GACH,MAAMpsB,EAAU9N,KAAK8N,QAAQ63B,WAAW3lC,KAAKo9B,cAC7C,IAAIwpD,EAAU5mF,KAAK4mF,QAEnB,IAAKA,EACH,OAGF5mF,KAAKgqF,uBAAuBl8E,GAE5B,MAAMg8E,EAAc,CAClB7pF,MAAOD,KAAKC,MACZs9B,OAAQv9B,KAAKu9B,QAETwM,EAAK,CACTr0B,EAAG1V,KAAK0V,EACRiR,EAAG3mB,KAAK2mB,GAIVigE,EAAU33E,KAAKuZ,IAAIo+D,GAAW,KAAO,EAAIA,EAEzC,MAAMtyD,EAAUsO,GAAU90B,EAAQwmB,SAG5B81D,EAAoBpqF,KAAKwN,MAAM9G,QAAU1G,KAAK8jF,WAAWp9E,QAAU1G,KAAKmjF,KAAKz8E,QAAU1G,KAAK+jF,UAAUr9E,QAAU1G,KAAKojF,OAAO18E,OAE9HoH,EAAQ0rD,SAAW4wB,IACrBlwD,EAAIsC,OACJtC,EAAImwD,YAAczD,EAGlB5mF,KAAK+jE,eAAeh6B,EAAI7P,EAAK4vD,EAAah8E,GAE1CyhC,GAAsBrV,EAAKpsB,EAAQgzE,eAEnC/2C,EAAGpjB,GAAK2N,EAAQC,IAGhBv0B,KAAKukE,UAAUx6B,EAAI7P,EAAKpsB,GAGxB9N,KAAKqpF,SAASt/C,EAAI7P,EAAKpsB,GAGvB9N,KAAK2pF,WAAW5/C,EAAI7P,EAAKpsB,GAEzB+hC,GAAqB3V,EAAKpsB,EAAQgzE,eAElC5mD,EAAI0C,UAER,CAMA60C,iBAAAA,GACE,OAAOzxE,KAAKs0C,SAAW,EACzB,CAOAo9B,iBAAAA,CAAkBC,EAAgB8Q,GAChC,MAAM7Q,EAAa5xE,KAAKs0C,QAClBzgB,EAAS89C,EAAe98D,IAAI,EAAE4Q,eAAc/mB,YAChD,MAAMowB,EAAO9uB,KAAK21B,MAAM8nB,eAAeh4B,GAEvC,IAAKqJ,EACH,MAAM,IAAI4X,MAAM,kCAAoCjhB,GAGtD,MAAO,CACLA,eACA2lB,QAAStc,EAAKpvB,KAAKhB,GACnBA,WAGEgyB,GAAWvL,GAAeysD,EAAY/9C,GACtCy2D,EAAkBtqF,KAAKuqF,iBAAiB12D,EAAQ4uD,IAElD/xD,GAAW45D,KACbtqF,KAAKs0C,QAAUzgB,EACf7zB,KAAK6mF,eAAiBpE,EACtBziF,KAAKwqF,qBAAsB,EAC3BxqF,KAAKo2C,QAAO,GAEhB,CASAorC,WAAAA,CAAYzuE,EAAG++D,EAAQvF,GAAc,GACnC,GAAIuF,GAAU9xE,KAAKwqF,oBACjB,OAAO,EAETxqF,KAAKwqF,qBAAsB,EAE3B,MAAM18E,EAAU9N,KAAK8N,QACf8jE,EAAa5xE,KAAKs0C,SAAW,GAC7BzgB,EAAS7zB,KAAKoyE,mBAAmBr/D,EAAG6+D,EAAYE,EAAQvF,GAKxD+d,EAAkBtqF,KAAKuqF,iBAAiB12D,EAAQ9gB,GAGhD2d,EAAUohD,IAAW3sD,GAAe0O,EAAQ+9C,IAAe0Y,EAgBjE,OAbI55D,IACF1wB,KAAKs0C,QAAUzgB,GAEX/lB,EAAQ0rD,SAAW1rD,EAAQo6E,YAC7BloF,KAAK6mF,eAAiB,CACpBnxE,EAAG3C,EAAE2C,EACLiR,EAAG5T,EAAE4T,GAGP3mB,KAAKo2C,QAAO,EAAM07B,KAIfphD,CACT,CAWA0hD,kBAAAA,CAAmBr/D,EAAG6+D,EAAYE,EAAQvF,GACxC,MAAMz+D,EAAU9N,KAAK8N,QAErB,GAAe,aAAXiF,EAAEzT,KACJ,MAAO,GAGT,IAAKitE,EAGH,OAAOqF,EAAW7qC,OAAOvyB,GACvBxU,KAAK21B,MAAMj2B,KAAK45B,SAAS9kB,EAAEiR,oBACiD3R,IAA5E9T,KAAK21B,MAAM8nB,eAAejpC,EAAEiR,cAAcq0B,WAAWqF,UAAU3qC,EAAE9V,QAKrE,MAAMm1B,EAAS7zB,KAAK21B,MAAMi7C,0BAA0B79D,EAAGjF,EAAQysB,KAAMzsB,EAASgkE,GAM9E,OAJIhkE,EAAQoX,SACV2O,EAAO3O,UAGF2O,CACT,CASA02D,gBAAAA,CAAiB12D,EAAQ9gB,GACvB,MAAM,OAACm0E,EAAA,OAAQC,EAAA,QAAQr5E,GAAW9N,KAC5BuvD,EAAW8yB,GAAYv0E,EAAQyhD,UAAUxrC,KAAK/jB,KAAM6zB,EAAQ9gB,GAClE,OAAoB,IAAbw8C,IAAuB23B,IAAW33B,EAAS75C,GAAKyxE,IAAW53B,EAAS5oC,EAC7E,GACD++B,EAAAA,GAAAA,GA5vBYihC,GAAgB,cAKNtE,IAyvBvB,IAAAoI,GAAe,CACb15E,GAAI,UACJkxE,SAAU0E,GACVtE,eAEAqI,SAAAA,CAAU/0D,EAAOkoD,EAAO/vE,GAClBA,IACF6nB,EAAMutD,QAAU,IAAIyD,GAAQ,CAAChxD,QAAO7nB,YAExC,EAEA4vD,YAAAA,CAAa/nC,EAAOkoD,EAAO/vE,GACrB6nB,EAAMutD,SACRvtD,EAAMutD,QAAQ5mC,WAAWxuC,EAE7B,EAEA8vC,KAAAA,CAAMjoB,EAAOkoD,EAAO/vE,GACd6nB,EAAMutD,SACRvtD,EAAMutD,QAAQ5mC,WAAWxuC,EAE7B,EAEA68E,SAAAA,CAAUh1D,GACR,MAAMutD,EAAUvtD,EAAMutD,QAEtB,GAAIA,GAAWA,EAAQiH,cAAe,CACpC,MAAMjrF,EAAO,CACXgkF,WAGF,IAA8E,IAA1EvtD,EAAMupC,cAAc,oBAAqB,IAAIhgE,EAAMwoE,YAAY,IACjE,OAGFwb,EAAQ7uC,KAAK1e,EAAMuE,KAEnBvE,EAAMupC,cAAc,mBAAoBhgE,E,CAE5C,EAEAgjF,UAAAA,CAAWvsD,EAAOz2B,GAChB,GAAIy2B,EAAMutD,QAAS,CAEjB,MAAMnzB,EAAmB7wD,EAAK4yE,OAC1Bn8C,EAAMutD,QAAQ1B,YAAYtiF,EAAKutC,MAAOsjB,EAAkB7wD,EAAKqtE,eAE/DrtE,EAAKwxB,SAAU,E,CAGrB,EAEA2C,SAAU,CACRmmC,SAAS,EACT0uB,SAAU,KACV34B,SAAU,UACVn2B,gBAAiB,kBACjBuvD,WAAY,OACZzH,UAAW,CACTv+D,OAAQ,QAEVqhE,aAAc,EACdC,kBAAmB,EACnBvoB,WAAY,OACZ2qB,UAAW,OACXjC,YAAa,EACbf,SAAU,CAAC,EAEXiG,UAAW,OACXO,YAAa,OACbvF,cAAe,EACfD,gBAAiB,EACjBf,WAAY,CACV3gE,OAAQ,QAEVinE,YAAa,OACbt1D,QAAS,EACTwwD,aAAc,EACdD,UAAW,EACXjnD,aAAc,EACdygD,UAAWA,CAACnkD,EAAK8F,IAASA,EAAKqjD,SAASh2E,KACxCixE,SAAUA,CAACpkD,EAAK8F,IAASA,EAAKqjD,SAASh2E,KACvC47E,mBAAoB,OACpB9E,eAAe,EACfrxB,WAAY,EACZz5B,YAAa,gBACbyF,YAAa,EACbhL,UAAW,CACTR,SAAU,IACVC,OAAQ,gBAEVU,WAAY,CACVf,QAAS,CACP5zB,KAAM,SACNs0B,WAAY,CAAC,IAAK,IAAK,QAAS,SAAU,SAAU,WAEtDgzD,QAAS,CACPrzD,OAAQ,SACRD,SAAU,MAGdsgB,UAAWiyC,IAGbvgB,cAAe,CACb+d,SAAU,OACVC,WAAY,OACZpC,UAAW,QAGbtoD,YAAa,CACXjF,YAAcv0B,GAAkB,WAATA,GAA8B,aAATA,GAAgC,aAATA,EACnEs0B,YAAY,EACZkgB,UAAW,CACTjgB,aAAa,EACbD,YAAY,GAEdI,UAAW,CACTL,WAAW,GAEbQ,WAAY,CACVR,UAAW,cAKfi3C,uBAAwB,CAAC,gBCj0C3B,MAAMkgB,GAAcA,CAAC9rC,EAAQjE,EAAKn8C,EAAOmsF,KACpB,kBAARhwC,GACTn8C,EAAQogD,EAAO93B,KAAK6zB,GAAO,EAC3BgwC,EAAY5O,QAAQ,CAACv9E,QAAO4O,MAAOutC,KAC1BrxB,MAAMqxB,KACfn8C,EAAQ,MAEHA,GAGT,SAASosF,GAAehsC,EAAQjE,EAAKn8C,EAAOmsF,GAC1C,MAAMlxB,EAAQ7a,EAAO/4B,QAAQ80B,GAC7B,IAAe,IAAX8e,EACF,OAAOixB,GAAY9rC,EAAQjE,EAAKn8C,EAAOmsF,GAEzC,MAAM3+D,EAAO4yB,EAAOisC,YAAYlwC,GAChC,OAAO8e,IAAUztC,EAAOxtB,EAAQi7D,CAClC,CAEA,MAAMwB,GAAaA,CAACz8D,EAAOoT,IAAkB,OAAVpT,EAAiB,KAAO8sB,GAAYvc,KAAKC,MAAMxQ,GAAQ,EAAGoT,GAE7F,SAASk5E,GAAkBlmF,GACzB,MAAMg6C,EAAS9+C,KAAK++C,YAEpB,OAAIj6C,GAAS,GAAKA,EAAQg6C,EAAOp4C,OACxBo4C,EAAOh6C,GAETA,CACT,CAEe,MAAMmmF,WAAsBlvB,GAazC35C,WAAAA,CAAYszB,GACVkQ,MAAMlQ,GAGN11C,KAAKkrF,iBAAcp3E,EACnB9T,KAAKmrF,YAAc,EACnBnrF,KAAKorF,aAAe,EACtB,CAEA18B,IAAAA,CAAKoa,GACH,MAAMuiB,EAAQrrF,KAAKorF,aACnB,GAAIC,EAAM3kF,OAAQ,CAChB,MAAMo4C,EAAS9+C,KAAK++C,YACpB,IAAK,MAAM,MAACrgD,EAAA,MAAO4O,KAAU+9E,EACvBvsC,EAAOpgD,KAAW4O,GACpBwxC,EAAOxxB,OAAO5uB,EAAO,GAGzBsB,KAAKorF,aAAe,E,CAEtBxlC,MAAM8I,KAAKoa,EACb,CAEAjhC,KAAAA,CAAMgT,EAAKn8C,GACT,GAAIklB,GAAci3B,GAChB,OAAO,KAET,MAAMiE,EAAS9+C,KAAK++C,YAGpB,OAFArgD,EAAQylB,SAASzlB,IAAUogD,EAAOpgD,KAAWm8C,EAAMn8C,EAC/CosF,GAAehsC,EAAQjE,EAAKv2B,GAAe5lB,EAAOm8C,GAAM76C,KAAKorF,cAC1DjwB,GAAWz8D,EAAOogD,EAAOp4C,OAAS,EAC3C,CAEAs3D,mBAAAA,GACE,MAAM,WAACvuC,EAAA,WAAYC,GAAc1vB,KAAK2vB,gBACtC,IAAI,IAAC5d,EAAG,IAAED,GAAO9R,KAAKw/C,WAAU,GAEJ,UAAxBx/C,KAAK8N,QAAQ+oB,SACVpH,IACH1d,EAAM,GAEH2d,IACH5d,EAAM9R,KAAK++C,YAAYr4C,OAAS,IAIpC1G,KAAK+R,IAAMA,EACX/R,KAAK8R,IAAMA,CACb,CAEAqsD,UAAAA,GACE,MAAMpsD,EAAM/R,KAAK+R,IACXD,EAAM9R,KAAK8R,IACX6kB,EAAS32B,KAAK8N,QAAQ6oB,OACtBjB,EAAQ,GACd,IAAIopB,EAAS9+C,KAAK++C,YAGlBD,EAAkB,IAAT/sC,GAAcD,IAAQgtC,EAAOp4C,OAAS,EAAKo4C,EAASA,EAAO96B,MAAMjS,EAAKD,EAAM,GAErF9R,KAAKmrF,YAAcl8E,KAAK6C,IAAIgtC,EAAOp4C,QAAUiwB,EAAS,EAAI,GAAI,GAC9D32B,KAAKkrF,YAAclrF,KAAK+R,KAAO4kB,EAAS,GAAM,GAE9C,IAAK,IAAI7xB,EAAQiN,EAAKjN,GAASgN,EAAKhN,IAClC4wB,EAAM1O,KAAK,CAACliB,UAEd,OAAO4wB,CACT,CAEAsqB,gBAAAA,CAAiBl7C,GACf,OAAOkmF,GAAkBjnE,KAAK/jB,KAAM8E,EACtC,CAKAgyC,SAAAA,GACE8O,MAAM9O,YAED92C,KAAK4kD,iBAER5kD,KAAKovD,gBAAkBpvD,KAAKovD,eAEhC,CAGAx/B,gBAAAA,CAAiB9qB,GAKf,MAJqB,kBAAVA,IACTA,EAAQ9E,KAAK6nC,MAAM/iC,IAGJ,OAAVA,EAAiBy6C,IAAMv/C,KAAK0nD,oBAAoB5iD,EAAQ9E,KAAKkrF,aAAelrF,KAAKmrF,YAC1F,CAIAhoC,eAAAA,CAAgBzkD,GACd,MAAMg3B,EAAQ11B,KAAK01B,MACnB,OAAIh3B,EAAQ,GAAKA,EAAQg3B,EAAMhvB,OAAS,EAC/B,KAEF1G,KAAK4vB,iBAAiB8F,EAAMh3B,GAAOoG,MAC5C,CAEA8iD,gBAAAA,CAAiB7qB,GACf,OAAO9tB,KAAKC,MAAMlP,KAAKkrF,YAAclrF,KAAK0hE,mBAAmB3kC,GAAS/8B,KAAKmrF,YAC7E,CAEArlC,YAAAA,GACE,OAAO9lD,KAAKw0B,MACd,ECpIF,SAAS82D,GAAcC,EAAmBC,GACxC,MAAM91D,EAAQ,GAKR+1D,EAAc,OACd,OAAC50D,EAAM,KAAEksC,EAAA,IAAMhxD,EAAA,IAAKD,EAAG,UAAE45E,EAAA,MAAWr9E,EAAA,SAAOs9E,EAAQ,UAAEC,EAAA,cAAWC,GAAiBN,EACjFO,EAAO/oB,GAAQ,EACfgpB,EAAYJ,EAAW,GACtB55E,IAAKi6E,EAAMl6E,IAAKm6E,GAAQT,EACzB/7D,GAAc7L,GAAc7R,GAC5B2d,GAAc9L,GAAc9R,GAC5Bo6E,GAAgBtoE,GAAcvV,GAC9B89E,GAAcF,EAAOD,IAASJ,EAAY,GAChD,IACIt2C,EAAQ82C,EAASC,EAASC,EAD1BniC,EAAU1hC,IAASwjE,EAAOD,GAAQD,EAAYD,GAAQA,EAK1D,GAAI3hC,EAAUshC,IAAgBh8D,IAAeC,EAC3C,MAAO,CAAC,CAAC5qB,MAAOknF,GAAO,CAAClnF,MAAOmnF,IAGjCK,EAAYr9E,KAAKsrD,KAAK0xB,EAAO9hC,GAAWl7C,KAAK2Z,MAAMojE,EAAO7hC,GACtDmiC,EAAYP,IAEd5hC,EAAU1hC,GAAQ6jE,EAAYniC,EAAU4hC,EAAYD,GAAQA,GAGzDloE,GAAc8nE,KAEjBp2C,EAASrmC,KAAKmS,IAAI,GAAIsqE,GACtBvhC,EAAUl7C,KAAKsrD,KAAKpQ,EAAU7U,GAAUA,GAG3B,UAAXze,GACFu1D,EAAUn9E,KAAK2Z,MAAMojE,EAAO7hC,GAAWA,EACvCkiC,EAAUp9E,KAAKsrD,KAAK0xB,EAAO9hC,GAAWA,IAEtCiiC,EAAUJ,EACVK,EAAUJ,GAGRx8D,GAAcC,GAAcqzC,GAAQt5C,IAAa3X,EAAMC,GAAOgxD,EAAM5Y,EAAU,MAKhFmiC,EAAYr9E,KAAKC,MAAMD,KAAK8C,KAAKD,EAAMC,GAAOo4C,EAASwhC,IACvDxhC,GAAWr4C,EAAMC,GAAOu6E,EACxBF,EAAUr6E,EACVs6E,EAAUv6E,GACDo6E,GAITE,EAAU38D,EAAa1d,EAAMq6E,EAC7BC,EAAU38D,EAAa5d,EAAMu6E,EAC7BC,EAAYj+E,EAAQ,EACpB87C,GAAWkiC,EAAUD,GAAWE,IAGhCA,GAAaD,EAAUD,GAAWjiC,EAIhCmiC,EADEhkE,GAAagkE,EAAWr9E,KAAKC,MAAMo9E,GAAYniC,EAAU,KAC/Cl7C,KAAKC,MAAMo9E,GAEXr9E,KAAKsrD,KAAK+xB,IAM1B,MAAMC,EAAgBt9E,KAAK6C,IACzBoY,GAAeigC,GACfjgC,GAAekiE,IAEjB92C,EAASrmC,KAAKmS,IAAI,GAAIwC,GAAc8nE,GAAaa,EAAgBb,GACjEU,EAAUn9E,KAAKC,MAAMk9E,EAAU92C,GAAUA,EACzC+2C,EAAUp9E,KAAKC,MAAMm9E,EAAU/2C,GAAUA,EAEzC,IAAI/0B,EAAI,EAiBR,IAhBIkP,IACEo8D,GAAiBO,IAAYr6E,GAC/B2jB,EAAM1O,KAAK,CAACliB,MAAOiN,IAEfq6E,EAAUr6E,GACZwO,IAGE+H,GAAarZ,KAAKC,OAAOk9E,EAAU7rE,EAAI4pC,GAAW7U,GAAUA,EAAQvjC,EAAKy6E,GAAkBz6E,EAAKo6E,EAAYZ,KAC9GhrE,KAEO6rE,EAAUr6E,GACnBwO,KAIGA,EAAI+rE,IAAa/rE,EAAG,CACzB,MAAMkV,EAAYxmB,KAAKC,OAAOk9E,EAAU7rE,EAAI4pC,GAAW7U,GAAUA,EACjE,GAAI5lB,GAAc+F,EAAY3jB,EAC5B,MAEF4jB,EAAM1O,KAAK,CAACliB,MAAO2wB,GACrB,CAaA,OAXI/F,GAAcm8D,GAAiBQ,IAAYv6E,EAEzC4jB,EAAMhvB,QAAU4hB,GAAaoN,EAAMA,EAAMhvB,OAAS,GAAG5B,MAAOgN,EAAK06E,GAAkB16E,EAAKq6E,EAAYZ,IACtG71D,EAAMA,EAAMhvB,OAAS,GAAG5B,MAAQgN,EAEhC4jB,EAAM1O,KAAK,CAACliB,MAAOgN,IAEX4d,GAAc28D,IAAYv6E,GACpC4jB,EAAM1O,KAAK,CAACliB,MAAOunF,IAGd32D,CACT,CAEA,SAAS82D,GAAkB1nF,EAAOqnF,GAAY,WAACrnC,EAAU,YAAEntB,IACzD,MAAMuG,EAAMpU,GAAU6N,GAChBjW,GAASojC,EAAa71C,KAAK4hB,IAAIqN,GAAOjvB,KAAK6iB,IAAIoM,KAAS,KACxDx3B,EAAS,IAAOylF,GAAc,GAAKrnF,GAAO4B,OAChD,OAAOuI,KAAK8C,IAAIo6E,EAAazqE,EAAOhb,EACtC,EDMAg/C,EAAAA,GAAAA,GA5HqBulC,GAAsB,KAE7B,aAAWvlC,EAAAA,GAAAA,GAFJulC,GAAsB,WAOvB,CAChBv1D,MAAO,CACL9Q,SAAUomE,MC+GD,MAAMyB,WAAwB1wB,GAE3C35C,WAAAA,CAAYszB,GACVkQ,MAAMlQ,GAGN11C,KAAKsG,WAAQwN,EAEb9T,KAAKkrB,SAAMpX,EAEX9T,KAAKkrF,iBAAcp3E,EAEnB9T,KAAK0sF,eAAY54E,EACjB9T,KAAKmrF,YAAc,CACrB,CAEAtjD,KAAAA,CAAMgT,EAAKn8C,GACT,OAAIklB,GAAci3B,KAGE,kBAARA,GAAoBA,aAAer1C,UAAY2e,UAAU02B,GAF5D,MAMDA,CACV,CAEA8xC,sBAAAA,GACE,MAAM,YAAC/1D,GAAe52B,KAAK8N,SACrB,WAAC2hB,EAAA,WAAYC,GAAc1vB,KAAK2vB,gBACtC,IAAI,IAAC5d,EAAG,IAAED,GAAO9R,KAEjB,MAAM4sF,EAASl7E,GAAMK,EAAM0d,EAAa1d,EAAML,EACxCm7E,EAASn7E,GAAMI,EAAM4d,EAAa5d,EAAMJ,EAE9C,GAAIklB,EAAa,CACf,MAAMk2D,EAAUzkE,GAAKtW,GACfg7E,EAAU1kE,GAAKvW,GAEjBg7E,EAAU,GAAKC,EAAU,EAC3BF,EAAO,GACEC,EAAU,GAAKC,EAAU,GAClCH,EAAO,E,CAIX,GAAI76E,IAAQD,EAAK,CACf,IAAI6kB,EAAiB,IAAR7kB,EAAY,EAAI7C,KAAKuZ,IAAU,IAAN1W,GAEtC+6E,EAAO/6E,EAAM6kB,GAERC,GACHg2D,EAAO76E,EAAM4kB,E,CAGjB32B,KAAK+R,IAAMA,EACX/R,KAAK8R,IAAMA,CACb,CAEAk7E,YAAAA,GACE,MAAM9zB,EAAWl5D,KAAK8N,QAAQ4nB,MAE9B,IACIi2D,GADA,cAACryB,EAAA,SAAe2zB,GAAY/zB,EAkBhC,OAfI+zB,GACFtB,EAAW18E,KAAKsrD,KAAKv6D,KAAK8R,IAAMm7E,GAAYh+E,KAAK2Z,MAAM5oB,KAAK+R,IAAMk7E,GAAY,EAC1EtB,EAAW,MACb5oD,QAAQC,KAAK,UAAUhjC,KAAK+Q,sBAAsBk8E,mCAA0CtB,8BAC5FA,EAAW,OAGbA,EAAW3rF,KAAKktF,mBAChB5zB,EAAgBA,GAAiB,IAG/BA,IACFqyB,EAAW18E,KAAK8C,IAAIunD,EAAeqyB,IAG9BA,CACT,CAKAuB,gBAAAA,GACE,OAAO1nF,OAAOuiB,iBAChB,CAEAo2C,UAAAA,GACE,MAAMn+B,EAAOhgC,KAAK8N,QACZorD,EAAWl5B,EAAKtK,MAMtB,IAAIi2D,EAAW3rF,KAAKgtF,eACpBrB,EAAW18E,KAAK6C,IAAI,EAAG65E,GAEvB,MAAMwB,EAA0B,CAC9BxB,WACA90D,OAAQmJ,EAAKnJ,OACb9kB,IAAKiuB,EAAKjuB,IACVD,IAAKkuB,EAAKluB,IACV45E,UAAWxyB,EAASwyB,UACpB3oB,KAAM7J,EAAS+zB,SACf5+E,MAAO6qD,EAAS7qD,MAChBu9E,UAAW5rF,KAAK2kE,aAChB7f,WAAY9kD,KAAK4kD,eACjBjtB,YAAauhC,EAASvhC,aAAe,EACrCk0D,eAA0C,IAA3B3yB,EAAS2yB,eAEpBL,EAAYxrF,KAAKs8D,QAAUt8D,KAC3B01B,EAAQ41D,GAAc6B,EAAyB3B,GAkBrD,MAdoB,UAAhBxrD,EAAKnJ,QACPlN,GAAmB+L,EAAO11B,KAAM,SAG9BggC,EAAK9a,SACPwQ,EAAMxQ,UAENllB,KAAKsG,MAAQtG,KAAK8R,IAClB9R,KAAKkrB,IAAMlrB,KAAK+R,MAEhB/R,KAAKsG,MAAQtG,KAAK+R,IAClB/R,KAAKkrB,IAAMlrB,KAAK8R,KAGX4jB,CACT,CAKAohB,SAAAA,GACE,MAAMphB,EAAQ11B,KAAK01B,MACnB,IAAIpvB,EAAQtG,KAAK+R,IACbmZ,EAAMlrB,KAAK8R,IAIf,GAFA8zC,MAAM9O,YAEF92C,KAAK8N,QAAQ6oB,QAAUjB,EAAMhvB,OAAQ,CACvC,MAAMiwB,GAAUzL,EAAM5kB,GAAS2I,KAAK6C,IAAI4jB,EAAMhvB,OAAS,EAAG,GAAK,EAC/DJ,GAASqwB,EACTzL,GAAOyL,C,CAET32B,KAAKkrF,YAAc5kF,EACnBtG,KAAK0sF,UAAYxhE,EACjBlrB,KAAKmrF,YAAcjgE,EAAM5kB,CAC3B,CAEA05C,gBAAAA,CAAiBl7C,GACf,OAAOswB,GAAatwB,EAAO9E,KAAK21B,MAAM7nB,QAAQ8mB,OAAQ50B,KAAK8N,QAAQ4nB,MAAMJ,OAC3E,EClTa,MAAM83D,WAAoBX,GAcvCzuB,mBAAAA,GACE,MAAM,IAACjsD,EAAG,IAAED,GAAO9R,KAAKw/C,WAAU,GAElCx/C,KAAK+R,IAAMmS,GAASnS,GAAOA,EAAM,EACjC/R,KAAK8R,IAAMoS,GAASpS,GAAOA,EAAM,EAGjC9R,KAAK2sF,wBACP,CAMAO,gBAAAA,GACE,MAAMpoC,EAAa9kD,KAAK4kD,eAClBl+C,EAASo+C,EAAa9kD,KAAKC,MAAQD,KAAKu9B,OACxC5F,EAAc7N,GAAU9pB,KAAK8N,QAAQ4nB,MAAMiC,aAC3CjW,GAASojC,EAAa71C,KAAK4hB,IAAI8G,GAAe1oB,KAAK6iB,IAAI6F,KAAiB,KACxEspC,EAAWjhE,KAAKshE,wBAAwB,GAC9C,OAAOryD,KAAKsrD,KAAK7zD,EAASuI,KAAK8C,IAAI,GAAIkvD,EAASlnC,WAAarY,GAC/D,CAGAkO,gBAAAA,CAAiB9qB,GACf,OAAiB,OAAVA,EAAiBy6C,IAAMv/C,KAAK0nD,oBAAoB5iD,EAAQ9E,KAAKkrF,aAAelrF,KAAKmrF,YAC1F,CAEAvjC,gBAAAA,CAAiB7qB,GACf,OAAO/8B,KAAKkrF,YAAclrF,KAAK0hE,mBAAmB3kC,GAAS/8B,KAAKmrF,WAClE,GACFzlC,EAAAA,GAAAA,GA7CqB0nC,GAAoB,KAE3B,WAAS1nC,EAAAA,GAAAA,GAFF0nC,GAAoB,WAOrB,CAChB13D,MAAO,CACL9Q,SAAU4R,GAAMjB,WAAWC,WCPjC,MAAM63D,GAAa37E,GAAKzC,KAAK2Z,MAAMR,GAAM1W,IACnC47E,GAAiBA,CAAC57E,EAAGyD,IAAMlG,KAAKmS,IAAI,GAAIisE,GAAW37E,GAAKyD,GAE9D,SAASo4E,GAAQC,GACf,MAAMn3D,EAASm3D,EAAWv+E,KAAKmS,IAAI,GAAIisE,GAAWG,IAClD,OAAkB,IAAXn3D,CACT,CAEA,SAASo3D,GAAM17E,EAAKD,EAAK47E,GACvB,MAAMC,EAAY1+E,KAAKmS,IAAI,GAAIssE,GACzBpnF,EAAQ2I,KAAK2Z,MAAM7W,EAAM47E,GACzBziE,EAAMjc,KAAKsrD,KAAKzoD,EAAM67E,GAC5B,OAAOziE,EAAM5kB,CACf,CAEA,SAASsnF,GAAS77E,EAAKD,GACrB,MAAM5K,EAAQ4K,EAAMC,EACpB,IAAI27E,EAAWL,GAAWnmF,GAC1B,MAAOumF,GAAM17E,EAAKD,EAAK47E,GAAY,GACjCA,IAEF,MAAOD,GAAM17E,EAAKD,EAAK47E,GAAY,GACjCA,IAEF,OAAOz+E,KAAK8C,IAAI27E,EAAUL,GAAWt7E,GACvC,CASA,SAAS87E,GAActC,GAAmB,IAACx5E,EAAG,IAAED,IAC9CC,EAAMqS,GAAgBmnE,EAAkBx5E,IAAKA,GAC7C,MAAM2jB,EAAQ,GACRo4D,EAAST,GAAWt7E,GAC1B,IAAIg8E,EAAMH,GAAS77E,EAAKD,GACpB45E,EAAYqC,EAAM,EAAI9+E,KAAKmS,IAAI,GAAInS,KAAKuZ,IAAIulE,IAAQ,EACxD,MAAMd,EAAWh+E,KAAKmS,IAAI,GAAI2sE,GACxB9gE,EAAO6gE,EAASC,EAAM9+E,KAAKmS,IAAI,GAAI0sE,GAAU,EAC7CxnF,EAAQ2I,KAAKC,OAAO6C,EAAMkb,GAAQy+D,GAAaA,EAC/C/0D,EAAS1nB,KAAK2Z,OAAO7W,EAAMkb,GAAQggE,EAAW,IAAMA,EAAW,GACrE,IAAI32D,EAAcrnB,KAAK2Z,OAAOtiB,EAAQqwB,GAAU1nB,KAAKmS,IAAI,GAAI2sE,IACzDjpF,EAAQsf,GAAgBmnE,EAAkBx5E,IAAK9C,KAAKC,OAAO+d,EAAO0J,EAASL,EAAcrnB,KAAKmS,IAAI,GAAI2sE,IAAQrC,GAAaA,GAC/H,MAAO5mF,EAAQgN,EACb4jB,EAAM1O,KAAK,CAACliB,QAAOszB,MAAOm1D,GAAQzoF,GAAQwxB,gBACtCA,GAAe,GACjBA,EAAcA,EAAc,GAAK,GAAK,GAEtCA,IAEEA,GAAe,KACjBy3D,IACAz3D,EAAc,EACdo1D,EAAYqC,GAAO,EAAI,EAAIrC,GAE7B5mF,EAAQmK,KAAKC,OAAO+d,EAAO0J,EAASL,EAAcrnB,KAAKmS,IAAI,GAAI2sE,IAAQrC,GAAaA,EAEtF,MAAMsC,EAAW5pE,GAAgBmnE,EAAkBz5E,IAAKhN,GAGxD,OAFA4wB,EAAM1O,KAAK,CAACliB,MAAOkpF,EAAU51D,MAAOm1D,GAAQS,GAAW13D,gBAEhDZ,CACT,CAEe,MAAMu4D,WAAyBlyB,GAiB5C35C,WAAAA,CAAYszB,GACVkQ,MAAMlQ,GAGN11C,KAAKsG,WAAQwN,EAEb9T,KAAKkrB,SAAMpX,EAEX9T,KAAKkrF,iBAAcp3E,EACnB9T,KAAKmrF,YAAc,CACrB,CAEAtjD,KAAAA,CAAMgT,EAAKn8C,GACT,MAAMoG,EAAQ2nF,GAAgB5oE,UAAUgkB,MAAM9iB,MAAM/kB,KAAM,CAAC66C,EAAKn8C,IAChE,GAAc,IAAVoG,EAIJ,OAAOof,GAASpf,IAAUA,EAAQ,EAAIA,EAAQ,KAH5C9E,KAAKkuF,OAAQ,CAIjB,CAEAlwB,mBAAAA,GACE,MAAM,IAACjsD,EAAG,IAAED,GAAO9R,KAAKw/C,WAAU,GAElCx/C,KAAK+R,IAAMmS,GAASnS,GAAO9C,KAAK6C,IAAI,EAAGC,GAAO,KAC9C/R,KAAK8R,IAAMoS,GAASpS,GAAO7C,KAAK6C,IAAI,EAAGA,GAAO,KAE1C9R,KAAK8N,QAAQ8oB,cACf52B,KAAKkuF,OAAQ,GAKXluF,KAAKkuF,OAASluF,KAAK+R,MAAQ/R,KAAK88D,gBAAkB54C,GAASlkB,KAAK48D,YAClE58D,KAAK+R,IAAMA,IAAQu7E,GAAettF,KAAK+R,IAAK,GAAKu7E,GAAettF,KAAK+R,KAAM,GAAKu7E,GAAettF,KAAK+R,IAAK,IAG3G/R,KAAK2sF,wBACP,CAEAA,sBAAAA,GACE,MAAM,WAACl9D,EAAA,WAAYC,GAAc1vB,KAAK2vB,gBACtC,IAAI5d,EAAM/R,KAAK+R,IACXD,EAAM9R,KAAK8R,IAEf,MAAM86E,EAASl7E,GAAMK,EAAM0d,EAAa1d,EAAML,EACxCm7E,EAASn7E,GAAMI,EAAM4d,EAAa5d,EAAMJ,EAE1CK,IAAQD,IACNC,GAAO,GACT66E,EAAO,GACPC,EAAO,MAEPD,EAAOU,GAAev7E,GAAM,IAC5B86E,EAAOS,GAAex7E,EAAK,MAG3BC,GAAO,GACT66E,EAAOU,GAAex7E,GAAM,IAE1BA,GAAO,GAET+6E,EAAOS,GAAev7E,EAAK,IAG7B/R,KAAK+R,IAAMA,EACX/R,KAAK8R,IAAMA,CACb,CAEAqsD,UAAAA,GACE,MAAMn+B,EAAOhgC,KAAK8N,QAEZy9E,EAAoB,CACxBx5E,IAAK/R,KAAK48D,SACV9qD,IAAK9R,KAAK28D,UAENjnC,EAAQm4D,GAActC,EAAmBvrF,MAkB/C,MAdoB,UAAhBggC,EAAKnJ,QACPlN,GAAmB+L,EAAO11B,KAAM,SAG9BggC,EAAK9a,SACPwQ,EAAMxQ,UAENllB,KAAKsG,MAAQtG,KAAK8R,IAClB9R,KAAKkrB,IAAMlrB,KAAK+R,MAEhB/R,KAAKsG,MAAQtG,KAAK+R,IAClB/R,KAAKkrB,IAAMlrB,KAAK8R,KAGX4jB,CACT,CAMAsqB,gBAAAA,CAAiBl7C,GACf,YAAiBgP,IAAVhP,EACH,IACAswB,GAAatwB,EAAO9E,KAAK21B,MAAM7nB,QAAQ8mB,OAAQ50B,KAAK8N,QAAQ4nB,MAAMJ,OACxE,CAKAwhB,SAAAA,GACE,MAAMxwC,EAAQtG,KAAK+R,IAEnB6zC,MAAM9O,YAEN92C,KAAKkrF,YAAc9iE,GAAM9hB,GACzBtG,KAAKmrF,YAAc/iE,GAAMpoB,KAAK8R,KAAOsW,GAAM9hB,EAC7C,CAEAspB,gBAAAA,CAAiB9qB,GAIf,YAHcgP,IAAVhP,GAAiC,IAAVA,IACzBA,EAAQ9E,KAAK+R,KAED,OAAVjN,GAAkB0kB,MAAM1kB,GACnBy6C,IAEFv/C,KAAK0nD,mBAAmB5iD,IAAU9E,KAAK+R,IAC1C,GACCqW,GAAMtjB,GAAS9E,KAAKkrF,aAAelrF,KAAKmrF,YAC/C,CAEAvjC,gBAAAA,CAAiB7qB,GACf,MAAM0kC,EAAUzhE,KAAK0hE,mBAAmB3kC,GACxC,OAAO9tB,KAAKmS,IAAI,GAAIphB,KAAKkrF,YAAczpB,EAAUzhE,KAAKmrF,YACxD,ECxNF,SAASgD,GAAsBnuD,GAC7B,MAAMk5B,EAAWl5B,EAAKtK,MAEtB,GAAIwjC,EAASxiC,SAAWsJ,EAAKtJ,QAAS,CACpC,MAAMpC,EAAUsO,GAAUs2B,EAAS1gC,iBACnC,OAAOlU,GAAe40C,EAASr/B,MAAQq/B,EAASr/B,KAAKxsB,KAAMgmB,GAASwG,KAAKxsB,MAAQinB,EAAQiJ,M,CAE3F,OAAO,CACT,CAEA,SAAS6wD,GAAiBl0D,EAAKL,EAAMvsB,GAEnC,OADAA,EAAQsH,GAAQtH,GAASA,EAAQ,CAACA,GAC3B,CACLgH,EAAG8nB,GAAalC,EAAKL,EAAKoC,OAAQ3uB,GAClCuE,EAAGvE,EAAM5G,OAASmzB,EAAKE,WAE3B,CAEA,SAASs0D,GAAgB5jE,EAAOohB,EAAKx+B,EAAM0E,EAAKD,GAC9C,OAAI2Y,IAAU1Y,GAAO0Y,IAAU3Y,EACtB,CACLxL,MAAOulC,EAAOx+B,EAAO,EACrB6d,IAAK2gB,EAAOx+B,EAAO,GAEZod,EAAQ1Y,GAAO0Y,EAAQ3Y,EACzB,CACLxL,MAAOulC,EAAMx+B,EACb6d,IAAK2gB,GAIF,CACLvlC,MAAOulC,EACP3gB,IAAK2gB,EAAMx+B,EAEf,CAKA,SAASihF,GAAmBvzD,GA8B1B,MAAMuqB,EAAO,CACX1zC,EAAGmpB,EAAMtM,KAAOsM,EAAMwzD,SAAS9/D,KAC/Bnb,EAAGynB,EAAMrM,MAAQqM,EAAMwzD,SAAS7/D,MAChClN,EAAGuZ,EAAMxG,IAAMwG,EAAMwzD,SAASh6D,IAC9B3hB,EAAGmoB,EAAMvG,OAASuG,EAAMwzD,SAAS/5D,QAE7Bg6D,EAASxgF,OAAO8T,OAAO,CAAC,EAAGwjC,GAC3Bma,EAAa,GACbnrC,EAAU,GACVm6D,EAAa1zD,EAAM2zD,aAAahoF,OAChCioF,EAAiB5zD,EAAMjtB,QAAQigD,YAC/B6gC,EAAkBD,EAAeE,kBAAoBlnE,GAAK8mE,EAAa,EAE7E,IAAK,IAAIj6E,EAAI,EAAGA,EAAIi6E,EAAYj6E,IAAK,CACnC,MAAMwrB,EAAO2uD,EAAehpD,WAAW5K,EAAM+zD,qBAAqBt6E,IAClE8f,EAAQ9f,GAAKwrB,EAAK1L,QAClB,MAAM45B,EAAgBnzB,EAAMg0D,iBAAiBv6E,EAAGumB,EAAMi0D,YAAc16D,EAAQ9f,GAAIo6E,GAC1EK,EAASpsD,GAAO7C,EAAKnG,MACrBq1D,EAAWd,GAAiBrzD,EAAMb,IAAK+0D,EAAQl0D,EAAM2zD,aAAal6E,IACxEirD,EAAWjrD,GAAK06E,EAEhB,MAAM9uB,EAAep1C,GAAgB+P,EAAMyyB,cAAch5C,GAAKo6E,GACxDnkE,EAAQxb,KAAKC,MAAM8a,GAAUo2C,IAC7B+uB,EAAUd,GAAgB5jE,EAAOyjC,EAAcx4C,EAAGw5E,EAAS56E,EAAG,EAAG,KACjE86E,EAAUf,GAAgB5jE,EAAOyjC,EAAcvnC,EAAGuoE,EAASr9E,EAAG,GAAI,KACxEw9E,GAAab,EAAQlpC,EAAM8a,EAAc+uB,EAASC,EACpD,CAEAr0D,EAAMu0D,eACJhqC,EAAK1zC,EAAI48E,EAAO58E,EAChB48E,EAAOl7E,EAAIgyC,EAAKhyC,EAChBgyC,EAAK9jC,EAAIgtE,EAAOhtE,EAChBgtE,EAAO57E,EAAI0yC,EAAK1yC,GAIlBmoB,EAAMw0D,iBAAmBC,GAAqBz0D,EAAO0kC,EAAYnrC,EACnE,CAEA,SAAS+6D,GAAab,EAAQlpC,EAAM76B,EAAO0kE,EAASC,GAClD,MAAMv+D,EAAM5hB,KAAKuZ,IAAIvZ,KAAK4hB,IAAIpG,IACxBqH,EAAM7iB,KAAKuZ,IAAIvZ,KAAK6iB,IAAIrH,IAC9B,IAAI/U,EAAI,EACJiR,EAAI,EACJwoE,EAAQ7oF,MAAQg/C,EAAK1zC,GACvB8D,GAAK4vC,EAAK1zC,EAAIu9E,EAAQ7oF,OAASuqB,EAC/B29D,EAAO58E,EAAI3C,KAAK8C,IAAIy8E,EAAO58E,EAAG0zC,EAAK1zC,EAAI8D,IAC9By5E,EAAQjkE,IAAMo6B,EAAKhyC,IAC5BoC,GAAKy5E,EAAQjkE,IAAMo6B,EAAKhyC,GAAKud,EAC7B29D,EAAOl7E,EAAIrE,KAAK6C,IAAI08E,EAAOl7E,EAAGgyC,EAAKhyC,EAAIoC,IAErC05E,EAAQ9oF,MAAQg/C,EAAK9jC,GACvBmF,GAAK2+B,EAAK9jC,EAAI4tE,EAAQ9oF,OAASwrB,EAC/B08D,EAAOhtE,EAAIvS,KAAK8C,IAAIy8E,EAAOhtE,EAAG8jC,EAAK9jC,EAAImF,IAC9ByoE,EAAQlkE,IAAMo6B,EAAK1yC,IAC5B+T,GAAKyoE,EAAQlkE,IAAMo6B,EAAK1yC,GAAKkf,EAC7B08D,EAAO57E,EAAI3D,KAAK6C,IAAI08E,EAAO57E,EAAG0yC,EAAK1yC,EAAI+T,GAE3C,CAEA,SAAS8oE,GAAqB10D,EAAOr8B,EAAOgxF,GAC1C,MAAMC,EAAgB50D,EAAMi0D,aACtB,MAACY,EAAA,gBAAOhB,EAAA,QAAiBt6D,EAAO,KAAEjnB,GAAQqiF,EAC1CG,EAAqB90D,EAAMg0D,iBAAiBrwF,EAAOixF,EAAgBC,EAAQt7D,EAASs6D,GACpFnkE,EAAQxb,KAAKC,MAAM8a,GAAUgB,GAAgB6kE,EAAmBplE,MAAQxC,MACxEtB,EAAImpE,GAAUD,EAAmBlpE,EAAGtZ,EAAKwE,EAAG4Y,GAC5C0V,EAAY4vD,GAAqBtlE,GACjCgE,EAAOuhE,GAAiBH,EAAmBn6E,EAAGrI,EAAKiH,EAAG6rB,GAC5D,MAAO,CAELjM,SAAS,EAGTxe,EAAGm6E,EAAmBn6E,EACtBiR,IAGAwZ,YAGA1R,OACA8F,IAAK5N,EACL+H,MAAOD,EAAOphB,EAAKiH,EACnBkgB,OAAQ7N,EAAItZ,EAAKwE,EAErB,CAEA,SAASo+E,GAAgBzxF,EAAMygC,GAC7B,IAAKA,EACH,OAAO,EAET,MAAM,KAACxQ,EAAA,IAAM8F,EAAA,MAAK7F,EAAK,OAAE8F,GAAUh2B,EAC7B0xF,EAAelxD,GAAe,CAACtpB,EAAG+Y,EAAM9H,EAAG4N,GAAM0K,IAASD,GAAe,CAACtpB,EAAG+Y,EAAM9H,EAAG6N,GAASyK,IACnGD,GAAe,CAACtpB,EAAGgZ,EAAO/H,EAAG4N,GAAM0K,IAASD,GAAe,CAACtpB,EAAGgZ,EAAO/H,EAAG6N,GAASyK,GACpF,OAAQixD,CACV,CAEA,SAASV,GAAqBz0D,EAAO0kC,EAAYnrC,GAC/C,MAAM9G,EAAQ,GACRihE,EAAa1zD,EAAM2zD,aAAahoF,OAChCs5B,EAAOjF,EAAMjtB,SACb,kBAAC+gF,EAAiB,QAAEn4D,GAAWsJ,EAAK+tB,YACpC2hC,EAAW,CACfE,MAAOzB,GAAsBnuD,GAAQ,EACrC4uD,gBAAiBC,EAAoBlnE,GAAK8mE,EAAa,GAEzD,IAAIxvD,EAEJ,IAAK,IAAIzqB,EAAI,EAAGA,EAAIi6E,EAAYj6E,IAAK,CACnCk7E,EAASp7D,QAAUA,EAAQ9f,GAC3Bk7E,EAASriF,KAAOoyD,EAAWjrD,GAE3B,MAAMhW,EAAOixF,GAAqB10D,EAAOvmB,EAAGk7E,GAC5CliE,EAAMxG,KAAKxoB,GACK,SAAZk4B,IACFl4B,EAAK01B,QAAU+7D,GAAgBzxF,EAAMygC,GACjCzgC,EAAK01B,UACP+K,EAAOzgC,GAGb,CACA,OAAOgvB,CACT,CAEA,SAASuiE,GAAqBtlE,GAC5B,OAAc,IAAVA,GAAyB,MAAVA,EACV,SACEA,EAAQ,IACV,OAGF,OACT,CAEA,SAASulE,GAAiBt6E,EAAGpB,EAAGga,GAM9B,MALc,UAAVA,EACF5Y,GAAKpB,EACc,WAAVga,IACT5Y,GAAMpB,EAAI,GAELoB,CACT,CAEA,SAASo6E,GAAUnpE,EAAG9U,EAAG4Y,GAMvB,OALc,KAAVA,GAA0B,MAAVA,EAClB9D,GAAM9U,EAAI,GACD4Y,EAAQ,KAAOA,EAAQ,MAChC9D,GAAK9U,GAEA8U,CACT,CAEA,SAASwpE,GAAkBj2D,EAAK8F,EAAMxhC,GACpC,MAAM,KAACiwB,EAAA,IAAM8F,EAAA,MAAK7F,EAAK,OAAE8F,GAAUh2B,GAC7B,cAAC+5B,GAAiByH,EAExB,IAAKpc,GAAc2U,GAAgB,CACjC,MAAMszB,EAAelpB,GAAc3C,EAAK6rB,cAClCv3B,EAAUsO,GAAU5C,EAAKxH,iBAC/B0B,EAAIgG,UAAY3H,EAEhB,MAAM63D,EAAe3hE,EAAO6F,EAAQ7F,KAC9B4hE,EAAc97D,EAAMD,EAAQC,IAC5B+7D,EAAgB5hE,EAAQD,EAAO6F,EAAQr0B,MACvCswF,EAAiB/7D,EAASD,EAAMD,EAAQiJ,OAE1CvvB,OAAOse,OAAOu/B,GAAcoc,KAAKv2D,GAAW,IAANA,IACxCwoB,EAAImE,YACJuD,GAAmB1H,EAAK,CACtBxkB,EAAG06E,EACHzpE,EAAG0pE,EACH/7E,EAAGg8E,EACHz+E,EAAG0+E,EACHtyD,OAAQ4tB,IAEV3xB,EAAI2E,QAEJ3E,EAAIiH,SAASivD,EAAcC,EAAaC,EAAeC,E,CAG7D,CAEA,SAASC,GAAgBz1D,EAAOgrD,GAC9B,MAAM,IAAC7rD,EAAKpsB,SAAS,YAACigD,IAAgBhzB,EAEtC,IAAK,IAAIvmB,EAAIuxE,EAAa,EAAGvxE,GAAK,EAAGA,IAAK,CACxC,MAAMhW,EAAOu8B,EAAMw0D,iBAAiB/6E,GACpC,IAAKhW,EAAK01B,QAER,SAEF,MAAM8uC,EAAcjV,EAAYpoB,WAAW5K,EAAM+zD,qBAAqBt6E,IACtE27E,GAAkBj2D,EAAK8oC,EAAaxkE,GACpC,MAAMywF,EAASpsD,GAAOmgC,EAAYnpC,OAC5B,EAACnkB,EAAC,EAAEiR,EAAA,UAAGwZ,GAAa3hC,EAE1B4iC,GACElH,EACAa,EAAM2zD,aAAal6E,GACnBkB,EACAiR,EAAKsoE,EAAOl1D,WAAa,EACzBk1D,EACA,CACEvsE,MAAOsgD,EAAYtgD,MACnByd,UAAWA,EACXC,aAAc,UAGpB,CACF,CAEA,SAASqwD,GAAe11D,EAAOkD,EAAQ6vB,EAAUi4B,GAC/C,MAAM,IAAC7rD,GAAOa,EACd,GAAI+yB,EAEF5zB,EAAIqE,IAAIxD,EAAMsyB,QAAStyB,EAAMuyB,QAASrvB,EAAQ,EAAGrW,QAC5C,CAEL,IAAIsmC,EAAgBnzB,EAAMg0D,iBAAiB,EAAG9wD,GAC9C/D,EAAIuE,OAAOyvB,EAAcx4C,EAAGw4C,EAAcvnC,GAE1C,IAAK,IAAInS,EAAI,EAAGA,EAAIuxE,EAAYvxE,IAC9B05C,EAAgBnzB,EAAMg0D,iBAAiBv6E,EAAGypB,GAC1C/D,EAAIwE,OAAOwvB,EAAcx4C,EAAGw4C,EAAcvnC,E,CAGhD,CAEA,SAAS+pE,GAAe31D,EAAO41D,EAAc1yD,EAAQ8nD,EAAY/jB,GAC/D,MAAM9nC,EAAMa,EAAMb,IACZ4zB,EAAW6iC,EAAa7iC,UAExB,MAACprC,EAAA,UAAOuU,GAAa05D,GAErB7iC,IAAai4B,IAAgBrjE,IAAUuU,GAAagH,EAAS,IAInE/D,EAAIsC,OACJtC,EAAI6G,YAAcre,EAClBwX,EAAIjD,UAAYA,EAChBiD,EAAIgqC,YAAYlC,EAAWxqC,MAAQ,IACnC0C,EAAI8xB,eAAiBgW,EAAWvqC,WAEhCyC,EAAImE,YACJoyD,GAAe11D,EAAOkD,EAAQ6vB,EAAUi4B,GACxC7rD,EAAIsE,YACJtE,EAAI6E,SACJ7E,EAAI0C,UACN,CAEA,SAASg0D,GAAwB1pD,EAAQxoC,EAAO4O,GAC9C,OAAOm2B,GAAcyD,EAAQ,CAC3B55B,QACA5O,QACAY,KAAM,cAEV,ED9GAomD,EAAAA,GAAAA,GAxJqBuoC,GAAyB,KAEhC,gBAAcvoC,EAAAA,GAAAA,GAFPuoC,GAAyB,WAO1B,CAChBv4D,MAAO,CACL9Q,SAAU4R,GAAMjB,WAAWa,YAC3BgC,MAAO,CACLohC,SAAS,MC6PF,MAAMq3B,WAA0BpE,GA0E7CrqE,WAAAA,CAAYszB,GACVkQ,MAAMlQ,GAGN11C,KAAKqtD,aAAUv5C,EAEf9T,KAAKstD,aAAUx5C,EAEf9T,KAAKgvF,iBAAcl7E,EAEnB9T,KAAK0uF,aAAe,GACpB1uF,KAAKuvF,iBAAmB,EAC1B,CAEA1xB,aAAAA,GAEE,MAAMvpC,EAAUt0B,KAAKuuF,SAAW3rD,GAAUurD,GAAsBnuF,KAAK8N,SAAW,GAC1EwG,EAAItU,KAAKC,MAAQD,KAAK0hC,SAAWpN,EAAQr0B,MACzC4R,EAAI7R,KAAKu9B,OAASv9B,KAAK+sC,UAAYzY,EAAQiJ,OACjDv9B,KAAKqtD,QAAUp+C,KAAK2Z,MAAM5oB,KAAKyuB,KAAOna,EAAI,EAAIggB,EAAQ7F,MACtDzuB,KAAKstD,QAAUr+C,KAAK2Z,MAAM5oB,KAAKu0B,IAAM1iB,EAAI,EAAIyiB,EAAQC,KACrDv0B,KAAKgvF,YAAc//E,KAAK2Z,MAAM3Z,KAAK8C,IAAIuC,EAAGzC,GAAK,EACjD,CAEAmsD,mBAAAA,GACE,MAAM,IAACjsD,EAAG,IAAED,GAAO9R,KAAKw/C,WAAU,GAElCx/C,KAAK+R,IAAMmS,GAASnS,KAASyX,MAAMzX,GAAOA,EAAM,EAChD/R,KAAK8R,IAAMoS,GAASpS,KAAS0X,MAAM1X,GAAOA,EAAM,EAGhD9R,KAAK2sF,wBACP,CAMAO,gBAAAA,GACE,OAAOj+E,KAAKsrD,KAAKv6D,KAAKgvF,YAAcb,GAAsBnuF,KAAK8N,SACjE,CAEAsxD,kBAAAA,CAAmB1pC,GACjB+2D,GAAgB5oE,UAAUu7C,mBAAmBr7C,KAAK/jB,KAAM01B,GAGxD11B,KAAK0uF,aAAe1uF,KAAK++C,YACtBlqC,IAAI,CAAC/P,EAAOpG,KACX,MAAM4O,EAAQsX,GAAa5kB,KAAK8N,QAAQigD,YAAYnpC,SAAU,CAAC9f,EAAOpG,GAAQsB,MAC9E,OAAOsN,GAAmB,IAAVA,EAAcA,EAAQ,KAEvCy5B,OAAO,CAACr1B,EAAG8C,IAAMxU,KAAK21B,MAAM6xB,kBAAkBhzC,GACnD,CAEAxD,GAAAA,GACE,MAAMgvB,EAAOhgC,KAAK8N,QAEdkyB,EAAKtJ,SAAWsJ,EAAK+tB,YAAYr3B,QACnC43D,GAAmBtuF,MAEnBA,KAAKsvF,eAAe,EAAG,EAAG,EAAG,EAEjC,CAEAA,cAAAA,CAAewB,EAAcC,EAAeC,EAAaC,GACvDjxF,KAAKqtD,SAAWp+C,KAAK2Z,OAAOkoE,EAAeC,GAAiB,GAC5D/wF,KAAKstD,SAAWr+C,KAAK2Z,OAAOooE,EAAcC,GAAkB,GAC5DjxF,KAAKgvF,aAAe//E,KAAK8C,IAAI/R,KAAKgvF,YAAc,EAAG//E,KAAK6C,IAAIg/E,EAAcC,EAAeC,EAAaC,GACxG,CAEAzjC,aAAAA,CAAc9uD,GACZ,MAAMwyF,EAAkBtpE,IAAO5nB,KAAK0uF,aAAahoF,QAAU,GACrDoiD,EAAa9oD,KAAK8N,QAAQg7C,YAAc,EAE9C,OAAO99B,GAAgBtsB,EAAQwyF,EAAkBpnE,GAAUg/B,GAC7D,CAEA8E,6BAAAA,CAA8B9oD,GAC5B,GAAI8e,GAAc9e,GAChB,OAAOy6C,IAIT,MAAM4xC,EAAgBnxF,KAAKgvF,aAAehvF,KAAK8R,IAAM9R,KAAK+R,KAC1D,OAAI/R,KAAK8N,QAAQoX,SACPllB,KAAK8R,IAAMhN,GAASqsF,GAEtBrsF,EAAQ9E,KAAK+R,KAAOo/E,CAC9B,CAEAC,6BAAAA,CAA8BzmE,GAC5B,GAAI/G,GAAc+G,GAChB,OAAO40B,IAGT,MAAM8xC,EAAiB1mE,GAAY3qB,KAAKgvF,aAAehvF,KAAK8R,IAAM9R,KAAK+R,MACvE,OAAO/R,KAAK8N,QAAQoX,QAAUllB,KAAK8R,IAAMu/E,EAAiBrxF,KAAK+R,IAAMs/E,CACvE,CAEAvC,oBAAAA,CAAqBpwF,GACnB,MAAMqvD,EAAc/tD,KAAK0uF,cAAgB,GAEzC,GAAIhwF,GAAS,GAAKA,EAAQqvD,EAAYrnD,OAAQ,CAC5C,MAAM4qF,EAAavjC,EAAYrvD,GAC/B,OAAOkyF,GAAwB5wF,KAAKo9B,aAAc1+B,EAAO4yF,E,CAE7D,CAEAvC,gBAAAA,CAAiBrwF,EAAO6yF,EAAoB3C,EAAkB,GAC5D,MAAMnkE,EAAQzqB,KAAKwtD,cAAc9uD,GAASupB,GAAU2mE,EACpD,MAAO,CACLl5E,EAAGzG,KAAK6iB,IAAIrH,GAAS8mE,EAAqBvxF,KAAKqtD,QAC/C1mC,EAAG1X,KAAK4hB,IAAIpG,GAAS8mE,EAAqBvxF,KAAKstD,QAC/C7iC,QAEJ,CAEA0jC,wBAAAA,CAAyBzvD,EAAOoG,GAC9B,OAAO9E,KAAK+uF,iBAAiBrwF,EAAOsB,KAAK4tD,8BAA8B9oD,GACzE,CAEA0sF,eAAAA,CAAgB9yF,GACd,OAAOsB,KAAKmuD,yBAAyBzvD,GAAS,EAAGsB,KAAK2hE,eACxD,CAEA8vB,qBAAAA,CAAsB/yF,GACpB,MAAM,KAAC+vB,EAAA,IAAM8F,EAAA,MAAK7F,EAAK,OAAE8F,GAAUx0B,KAAKuvF,iBAAiB7wF,GACzD,MAAO,CACL+vB,OACA8F,MACA7F,QACA8F,SAEJ,CAKAuvC,cAAAA,GACE,MAAM,gBAAC3qC,EAAiBpC,MAAM,SAAC82B,IAAa9tD,KAAK8N,QACjD,GAAIsrB,EAAiB,CACnB,MAAMc,EAAMl6B,KAAKk6B,IACjBA,EAAIsC,OACJtC,EAAImE,YACJoyD,GAAezwF,KAAMA,KAAK4tD,8BAA8B5tD,KAAK0sF,WAAY5+B,EAAU9tD,KAAK0uF,aAAahoF,QACrGwzB,EAAIsE,YACJtE,EAAIgG,UAAY9G,EAChBc,EAAI2E,OACJ3E,EAAI0C,S,CAER,CAKAonC,QAAAA,GACE,MAAM9pC,EAAMl6B,KAAKk6B,IACX8F,EAAOhgC,KAAK8N,SACZ,WAAC+/C,EAAU,KAAE72B,EAAA,OAAMO,GAAUyI,EAC7B+lD,EAAa/lF,KAAK0uF,aAAahoF,OAErC,IAAI8N,EAAGmiB,EAAQ44B,EAmBf,GAjBIvvB,EAAK+tB,YAAYr3B,SACnB85D,GAAgBxwF,KAAM+lF,GAGpB/uD,EAAKN,SACP12B,KAAK01B,MAAM3I,QAAQ,CAACynB,EAAM91C,KACxB,GAAc,IAAVA,GAA0B,IAAVA,GAAesB,KAAK+R,IAAM,EAAI,CAChD4kB,EAAS32B,KAAK4tD,8BAA8BpZ,EAAK1vC,OACjD,MAAM00B,EAAUx5B,KAAKo9B,WAAW1+B,GAC1BskE,EAAchsC,EAAK2O,WAAWnM,GAC9BypC,EAAoB1rC,EAAOoO,WAAWnM,GAE5Ck3D,GAAe1wF,KAAMgjE,EAAarsC,EAAQovD,EAAY9iB,E,IAKxDpV,EAAWn3B,QAAS,CAGtB,IAFAwD,EAAIsC,OAEChoB,EAAIuxE,EAAa,EAAGvxE,GAAK,EAAGA,IAAK,CACpC,MAAMwuD,EAAcnV,EAAWloB,WAAW3lC,KAAK8uF,qBAAqBt6E,KAC9D,MAACkO,EAAA,UAAOuU,GAAa+rC,EAEtB/rC,GAAcvU,IAInBwX,EAAIjD,UAAYA,EAChBiD,EAAI6G,YAAcre,EAElBwX,EAAIgqC,YAAYlB,EAAYrwB,YAC5BzY,EAAI8xB,eAAiBgX,EAAYpwB,iBAEjCjc,EAAS32B,KAAK4tD,8BAA8B5tB,EAAK9a,QAAUllB,KAAK+R,IAAM/R,KAAK8R,KAC3Ey9C,EAAWvvD,KAAK+uF,iBAAiBv6E,EAAGmiB,GACpCuD,EAAImE,YACJnE,EAAIuE,OAAOz+B,KAAKqtD,QAASrtD,KAAKstD,SAC9BpzB,EAAIwE,OAAO6wB,EAAS75C,EAAG65C,EAAS5oC,GAChCuT,EAAI6E,SACN,CAEA7E,EAAI0C,S,CAER,CAKAunC,UAAAA,GAAc,CAKdE,UAAAA,GACE,MAAMnqC,EAAMl6B,KAAKk6B,IACX8F,EAAOhgC,KAAK8N,QACZorD,EAAWl5B,EAAKtK,MAEtB,IAAKwjC,EAASxiC,QACZ,OAGF,MAAMoyB,EAAa9oD,KAAKwtD,cAAc,GACtC,IAAI72B,EAAQ12B,EAEZi6B,EAAIsC,OACJtC,EAAIiE,UAAUn+B,KAAKqtD,QAASrtD,KAAKstD,SACjCpzB,EAAI3kB,OAAOuzC,GACX5uB,EAAIiG,UAAY,SAChBjG,EAAIkG,aAAe,SAEnBpgC,KAAK01B,MAAM3I,QAAQ,CAACynB,EAAM91C,KACxB,GAAe,IAAVA,GAAesB,KAAK+R,KAAO,IAAOiuB,EAAK9a,QAC1C,OAGF,MAAM89C,EAAc9J,EAASvzB,WAAW3lC,KAAKo9B,WAAW1+B,IAClDuiE,EAAWp+B,GAAOmgC,EAAYnpC,MAGpC,GAFAlD,EAAS32B,KAAK4tD,8BAA8B5tD,KAAK01B,MAAMh3B,GAAOoG,OAE1Dk+D,EAAY1qC,kBAAmB,CACjC4B,EAAIL,KAAOonC,EAAShlC,OACpBh8B,EAAQi6B,EAAIiC,YAAYqY,EAAKlnC,OAAOrN,MACpCi6B,EAAIgG,UAAY8iC,EAAYzqC,cAE5B,MAAMjE,EAAUsO,GAAUogC,EAAYxqC,iBACtC0B,EAAIiH,UACDlhC,EAAQ,EAAIq0B,EAAQ7F,MACpBkI,EAASsqC,EAAS5zD,KAAO,EAAIinB,EAAQC,IACtCt0B,EAAQq0B,EAAQr0B,MAChBghE,EAAS5zD,KAAOinB,EAAQiJ,O,CAI5B6D,GAAWlH,EAAKsa,EAAKlnC,MAAO,GAAIqpB,EAAQsqC,EAAU,CAChDv+C,MAAOsgD,EAAYtgD,MACnB6e,YAAayhC,EAAYjrC,gBACzBuJ,YAAa0hC,EAAYlrC,oBAI7BoC,EAAI0C,SACN,CAKA2nC,SAAAA,GAAa,GACf7e,EAAAA,GAAAA,GA1VqBmrC,GAA0B,KAEjC,iBAAenrC,EAAAA,GAAAA,GAFRmrC,GAA0B,WAO3B,CAChBn6D,SAAS,EAGTg7D,SAAS,EACTniC,SAAU,YAEV1B,WAAY,CACVn3B,SAAS,EACTO,UAAW,EACX0b,WAAY,GACZC,iBAAkB,GAGpB5b,KAAM,CACJ82B,UAAU,GAGZhF,WAAY,EAGZpzB,MAAO,CAEL4C,mBAAmB,EAEnB1T,SAAU4R,GAAMjB,WAAWC,SAG7Bu4B,YAAa,CACXx1B,mBAAezkB,EAGf0kB,gBAAiB,EAGjB9B,SAAS,EAGTmD,KAAM,CACJxsB,KAAM,IAIRuX,QAAAA,CAAStX,GACP,OAAOA,CACT,EAGAgnB,QAAS,EAGTu6D,mBAAmB,MAErBnpC,EAAAA,GAAAA,GA5DiBmrC,GAA0B,gBA8DtB,CACrB,mBAAoB,cACpB,oBAAqB,QACrB,cAAe,WACfnrC,EAAAA,GAAAA,GAlEiBmrC,GAA0B,cAoExB,CACnBhjC,WAAY,CACVp6B,UAAW,UCxYjB,MAAMk+D,GAAY,CAChBC,YAAa,CAACC,QAAQ,EAAMxkF,KAAM,EAAGogF,MAAO,KAC5CqE,OAAQ,CAACD,QAAQ,EAAMxkF,KAAM,IAAMogF,MAAO,IAC1CsE,OAAQ,CAACF,QAAQ,EAAMxkF,KAAM,IAAOogF,MAAO,IAC3CuE,KAAM,CAACH,QAAQ,EAAMxkF,KAAM,KAASogF,MAAO,IAC3CrpF,IAAK,CAACytF,QAAQ,EAAMxkF,KAAM,MAAUogF,MAAO,IAC3CwE,KAAM,CAACJ,QAAQ,EAAOxkF,KAAM,OAAWogF,MAAO,GAC9ChoF,MAAO,CAACosF,QAAQ,EAAMxkF,KAAM,OAASogF,MAAO,IAC5CyE,QAAS,CAACL,QAAQ,EAAOxkF,KAAM,OAASogF,MAAO,GAC/CloF,KAAM,CAACssF,QAAQ,EAAMxkF,KAAM,SAMvB8kF,GAA6CnkF,OAAOC,KAAK0jF,IAM/D,SAASS,GAAOz/E,EAAGC,GACjB,OAAOD,EAAIC,CACb,CAOA,SAASi1B,GAAM9M,EAAO/Y,GACpB,GAAI4B,GAAc5B,GAChB,OAAO,KAGT,MAAMqwE,EAAUt3D,EAAMu3D,UAChB,OAACC,EAAA,MAAQrjF,EAAA,WAAOsjF,GAAcz3D,EAAM03D,WAC1C,IAAI3tF,EAAQkd,EAaZ,MAXsB,oBAAXuwE,IACTztF,EAAQytF,EAAOztF,IAIZof,GAASpf,KACZA,EAA0B,kBAAXytF,EACXF,EAAQxqD,MAAM/iC,EAAOytF,GACrBF,EAAQxqD,MAAM/iC,IAGN,OAAVA,EACK,MAGLoK,IACFpK,EAAkB,SAAVoK,IAAqBqa,GAASipE,KAA8B,IAAfA,EAEjDH,EAAQxjC,QAAQ/pD,EAAOoK,GADvBmjF,EAAQxjC,QAAQ/pD,EAAO,UAAW0tF,KAIhC1tF,EACV,CAUA,SAAS4tF,GAA0BC,EAAS5gF,EAAKD,EAAK8gF,GACpD,MAAMttE,EAAO6sE,GAAMzrF,OAEnB,IAAK,IAAI8N,EAAI29E,GAAMpsE,QAAQ4sE,GAAUn+E,EAAI8Q,EAAO,IAAK9Q,EAAG,CACtD,MAAMq+E,EAAWlB,GAAUQ,GAAM39E,IAC3B8gC,EAASu9C,EAASpF,MAAQoF,EAASpF,MAAQjoF,OAAOstF,iBAExD,GAAID,EAAShB,QAAU5iF,KAAKsrD,MAAMzoD,EAAMC,IAAQujC,EAASu9C,EAASxlF,QAAUulF,EAC1E,OAAOT,GAAM39E,EAEjB,CAEA,OAAO29E,GAAM7sE,EAAO,EACtB,CAWA,SAASytE,GAA2Bh4D,EAAOukC,EAAUqzB,EAAS5gF,EAAKD,GACjE,IAAK,IAAI0C,EAAI29E,GAAMzrF,OAAS,EAAG8N,GAAK29E,GAAMpsE,QAAQ4sE,GAAUn+E,IAAK,CAC/D,MAAMs3E,EAAOqG,GAAM39E,GACnB,GAAIm9E,GAAU7F,GAAM+F,QAAU92D,EAAMu3D,SAAS1jC,KAAK98C,EAAKC,EAAK+5E,IAASxsB,EAAW,EAC9E,OAAOwsB,CAEX,CAEA,OAAOqG,GAAMQ,EAAUR,GAAMpsE,QAAQ4sE,GAAW,EAClD,CAMA,SAASK,GAAmBlH,GAC1B,IAAK,IAAIt3E,EAAI29E,GAAMpsE,QAAQ+lE,GAAQ,EAAGxmE,EAAO6sE,GAAMzrF,OAAQ8N,EAAI8Q,IAAQ9Q,EACrE,GAAIm9E,GAAUQ,GAAM39E,IAAIq9E,OACtB,OAAOM,GAAM39E,EAGnB,CAOA,SAASy+E,GAAQv9D,EAAOw9D,EAAMC,GAC5B,GAAKA,GAEE,GAAIA,EAAWzsF,OAAQ,CAC5B,MAAM,GAACslB,EAAE,GAAED,GAAMJ,GAAQwnE,EAAYD,GAC/BE,EAAYD,EAAWnnE,IAAOknE,EAAOC,EAAWnnE,GAAMmnE,EAAWpnE,GACvE2J,EAAM09D,IAAa,C,OAJnB19D,EAAMw9D,IAAQ,CAMlB,CASA,SAASG,GAAct4D,EAAOrF,EAAO7gB,EAAKy+E,GACxC,MAAMjB,EAAUt3D,EAAMu3D,SAChB34B,GAAS04B,EAAQxjC,QAAQn5B,EAAM,GAAG5wB,MAAOwuF,GACzCpnE,EAAOwJ,EAAMA,EAAMhvB,OAAS,GAAG5B,MACrC,IAAIszB,EAAO15B,EAEX,IAAK05B,EAAQuhC,EAAOvhC,GAASlM,EAAMkM,GAASi6D,EAAQ/wF,IAAI82B,EAAO,EAAGk7D,GAChE50F,EAAQmW,EAAIujB,GACR15B,GAAS,IACXg3B,EAAMh3B,GAAO05B,OAAQ,GAGzB,OAAO1C,CACT,CAQA,SAAS69D,GAAoBx4D,EAAOzO,EAAQgnE,GAC1C,MAAM59D,EAAQ,GAER7gB,EAAM,CAAC,EACPyQ,EAAOgH,EAAO5lB,OACpB,IAAI8N,EAAG1P,EAEP,IAAK0P,EAAI,EAAGA,EAAI8Q,IAAQ9Q,EACtB1P,EAAQwnB,EAAO9X,GACfK,EAAI/P,GAAS0P,EAEbkhB,EAAM1O,KAAK,CACTliB,QACAszB,OAAO,IAMX,OAAiB,IAAT9S,GAAeguE,EAAqBD,GAAct4D,EAAOrF,EAAO7gB,EAAKy+E,GAAzC59D,CACtC,CAEe,MAAM89D,WAAkBz3B,GAgDrC35C,WAAAA,CAAY/iB,GACVumD,MAAMvmD,GAGNW,KAAKnC,OAAS,CACZ6B,KAAM,GACNo/C,OAAQ,GACRlH,IAAK,IAIP53C,KAAKyzF,MAAQ,MAEbzzF,KAAK0zF,gBAAa5/E,EAClB9T,KAAK2zF,SAAW,CAAC,EACjB3zF,KAAK4zF,aAAc,EACnB5zF,KAAKyyF,gBAAa3+E,CACpB,CAEA46C,IAAAA,CAAK2f,EAAWruC,EAAO,IACrB,MAAMkzD,EAAO7kB,EAAU6kB,OAAS7kB,EAAU6kB,KAAO,CAAC,GAE5Cb,EAAUryF,KAAKsyF,SAAW,IAAIvjC,GAASC,MAAMqf,EAAUtf,SAAS9pD,MAEtEotF,EAAQ3jC,KAAK1uB,GAMb1Z,GAAQ4sE,EAAKW,eAAgBxB,EAAQ1jC,WAErC3uD,KAAKyyF,WAAa,CAChBF,OAAQW,EAAKX,OACbrjF,MAAOgkF,EAAKhkF,MACZsjF,WAAYU,EAAKV,YAGnB5sC,MAAM8I,KAAK2f,GAEXruE,KAAK4zF,YAAc5zD,EAAK8zD,UAC1B,CAOAjsD,KAAAA,CAAMgT,EAAKn8C,GACT,YAAYoV,IAAR+mC,EACK,KAEFhT,GAAM7nC,KAAM66C,EACrB,CAEA8Z,YAAAA,GACE/O,MAAM+O,eACN30D,KAAKnC,OAAS,CACZ6B,KAAM,GACNo/C,OAAQ,GACRlH,IAAK,GAET,CAEAomB,mBAAAA,GACE,MAAMlwD,EAAU9N,KAAK8N,QACfukF,EAAUryF,KAAKsyF,SACfxG,EAAOh+E,EAAQolF,KAAKpH,MAAQ,MAElC,IAAI,IAAC/5E,EAAA,IAAKD,EAAA,WAAK2d,EAAA,WAAYC,GAAc1vB,KAAK2vB,gBAK9C,SAASokE,EAAal9D,GACfpH,GAAejG,MAAMqN,EAAO9kB,OAC/BA,EAAM9C,KAAK8C,IAAIA,EAAK8kB,EAAO9kB,MAExB2d,GAAelG,MAAMqN,EAAO/kB,OAC/BA,EAAM7C,KAAK6C,IAAIA,EAAK+kB,EAAO/kB,KAE/B,CAGK2d,GAAeC,IAElBqkE,EAAa/zF,KAAKg0F,mBAIK,UAAnBlmF,EAAQ+oB,QAA+C,WAAzB/oB,EAAQ4nB,MAAMhQ,QAC9CquE,EAAa/zF,KAAKw/C,WAAU,KAIhCztC,EAAMmS,GAASnS,KAASyX,MAAMzX,GAAOA,GAAOsgF,EAAQxjC,QAAQnpD,KAAKwuC,MAAO43C,GACxEh6E,EAAMoS,GAASpS,KAAS0X,MAAM1X,GAAOA,GAAOugF,EAAQvjC,MAAMppD,KAAKwuC,MAAO43C,GAAQ,EAG9E9rF,KAAK+R,IAAM9C,KAAK8C,IAAIA,EAAKD,EAAM,GAC/B9R,KAAK8R,IAAM7C,KAAK6C,IAAIC,EAAM,EAAGD,EAC/B,CAKAkiF,eAAAA,GACE,MAAMltD,EAAM9mC,KAAKi0F,qBACjB,IAAIliF,EAAMvM,OAAOuiB,kBACbjW,EAAMtM,OAAO4zC,kBAMjB,OAJItS,EAAIpgC,SACNqL,EAAM+0B,EAAI,GACVh1B,EAAMg1B,EAAIA,EAAIpgC,OAAS,IAElB,CAACqL,MAAKD,MACf,CAKAqsD,UAAAA,GACE,MAAMrwD,EAAU9N,KAAK8N,QACfomF,EAAWpmF,EAAQolF,KACnBh6B,EAAWprD,EAAQ4nB,MACnBy9D,EAAiC,WAApBj6B,EAASxzC,OAAsB1lB,KAAKi0F,qBAAuBj0F,KAAKm0F,YAE5D,UAAnBrmF,EAAQ+oB,QAAsBs8D,EAAWzsF,SAC3C1G,KAAK+R,IAAM/R,KAAK48D,UAAYu2B,EAAW,GACvCnzF,KAAK8R,IAAM9R,KAAK28D,UAAYw2B,EAAWA,EAAWzsF,OAAS,IAG7D,MAAMqL,EAAM/R,KAAK+R,IACXD,EAAM9R,KAAK8R,IAEX4jB,EAAQrJ,GAAe8mE,EAAYphF,EAAKD,GAgB9C,OAXA9R,KAAKyzF,MAAQS,EAASpI,OAAS5yB,EAASlhC,SACpC06D,GAA0BwB,EAASvB,QAAS3yF,KAAK+R,IAAK/R,KAAK8R,IAAK9R,KAAKo0F,kBAAkBriF,IACvFghF,GAA2B/yF,KAAM01B,EAAMhvB,OAAQwtF,EAASvB,QAAS3yF,KAAK+R,IAAK/R,KAAK8R,MACpF9R,KAAK0zF,WAAcx6B,EAAS9gC,MAAMohC,SAA0B,SAAfx5D,KAAKyzF,MAC9CT,GAAmBhzF,KAAKyzF,YADyC3/E,EAErE9T,KAAKq0F,YAAYlB,GAEbrlF,EAAQoX,SACVwQ,EAAMxQ,UAGDquE,GAAoBvzF,KAAM01B,EAAO11B,KAAK0zF,WAC/C,CAEAh1B,aAAAA,GAGM1+D,KAAK8N,QAAQwmF,qBACft0F,KAAKq0F,YAAYr0F,KAAK01B,MAAM7gB,IAAI2/B,IAASA,EAAK1vC,OAElD,CAUAuvF,WAAAA,CAAYlB,EAAa,IACvB,IAEIx5B,EAAOztC,EAFP5lB,EAAQ,EACR4kB,EAAM,EAGNlrB,KAAK8N,QAAQ6oB,QAAUw8D,EAAWzsF,SACpCizD,EAAQ35D,KAAKu0F,mBAAmBpB,EAAW,IAEzC7sF,EADwB,IAAtB6sF,EAAWzsF,OACL,EAAIizD,GAEH35D,KAAKu0F,mBAAmBpB,EAAW,IAAMx5B,GAAS,EAE7DztC,EAAOlsB,KAAKu0F,mBAAmBpB,EAAWA,EAAWzsF,OAAS,IAE5DwkB,EADwB,IAAtBioE,EAAWzsF,OACPwlB,GAECA,EAAOlsB,KAAKu0F,mBAAmBpB,EAAWA,EAAWzsF,OAAS,KAAO,GAGhF,MAAMo8D,EAAQqwB,EAAWzsF,OAAS,EAAI,GAAM,IAC5CJ,EAAQklB,GAAYllB,EAAO,EAAGw8D,GAC9B53C,EAAMM,GAAYN,EAAK,EAAG43C,GAE1B9iE,KAAK2zF,SAAW,CAACrtF,QAAO4kB,MAAKoqB,OAAQ,GAAKhvC,EAAQ,EAAI4kB,GACxD,CASAipE,SAAAA,GACE,MAAM9B,EAAUryF,KAAKsyF,SACfvgF,EAAM/R,KAAK+R,IACXD,EAAM9R,KAAK8R,IACXhE,EAAU9N,KAAK8N,QACfomF,EAAWpmF,EAAQolF,KAEnB/6D,EAAQ+7D,EAASpI,MAAQ4G,GAA0BwB,EAASvB,QAAS5gF,EAAKD,EAAK9R,KAAKo0F,kBAAkBriF,IACtGk7E,EAAW3oE,GAAexW,EAAQ4nB,MAAMu3D,SAAU,GAClD/oF,EAAoB,SAAVi0B,GAAmB+7D,EAAS1B,WACtCgC,EAAajrE,GAASrlB,KAAwB,IAAZA,EAClCwxB,EAAQ,CAAC,EACf,IACIw9D,EAAM7kF,EADNsrD,EAAQ5nD,EAYZ,GARIyiF,IACF76B,GAAS04B,EAAQxjC,QAAQ8K,EAAO,UAAWz1D,IAI7Cy1D,GAAS04B,EAAQxjC,QAAQ8K,EAAO66B,EAAa,MAAQr8D,GAGjDk6D,EAAQzjC,KAAK98C,EAAKC,EAAKomB,GAAS,IAAS80D,EAC3C,MAAM,IAAIvmD,MAAM30B,EAAM,QAAUD,EAAM,uCAAyCm7E,EAAW,IAAM90D,GAGlG,MAAMg7D,EAAsC,SAAzBrlF,EAAQ4nB,MAAMhQ,QAAqB1lB,KAAKy0F,oBAC3D,IAAKvB,EAAOv5B,EAAOtrD,EAAQ,EAAG6kF,EAAOphF,EAAKohF,GAAQb,EAAQ/wF,IAAI4xF,EAAMjG,EAAU90D,GAAQ9pB,IACpF4kF,GAAQv9D,EAAOw9D,EAAMC,GAQvB,OALID,IAASphF,GAA0B,UAAnBhE,EAAQ+oB,QAAgC,IAAVxoB,GAChD4kF,GAAQv9D,EAAOw9D,EAAMC,GAIhBnlF,OAAOC,KAAKynB,GAAOxM,KAAKkpE,IAAQv9E,IAAIa,IAAMA,EACnD,CAMAsqC,gBAAAA,CAAiBl7C,GACf,MAAMutF,EAAUryF,KAAKsyF,SACf4B,EAAWl0F,KAAK8N,QAAQolF,KAE9B,OAAIgB,EAASQ,cACJrC,EAAQ/8D,OAAOxwB,EAAOovF,EAASQ,eAEjCrC,EAAQ/8D,OAAOxwB,EAAOovF,EAASL,eAAec,SACvD,CAOAr/D,MAAAA,CAAOxwB,EAAOwwB,GACZ,MAAMxnB,EAAU9N,KAAK8N,QACf6gD,EAAU7gD,EAAQolF,KAAKW,eACvB/H,EAAO9rF,KAAKyzF,MACZmB,EAAMt/D,GAAUq5B,EAAQm9B,GAC9B,OAAO9rF,KAAKsyF,SAASh9D,OAAOxwB,EAAO8vF,EACrC,CAWAC,mBAAAA,CAAoB3B,EAAMx0F,EAAOg3B,EAAOJ,GACtC,MAAMxnB,EAAU9N,KAAK8N,QACfknB,EAAYlnB,EAAQ4nB,MAAM9Q,SAEhC,GAAIoQ,EACF,OAAOpQ,GAAKoQ,EAAW,CAACk+D,EAAMx0F,EAAOg3B,GAAQ11B,MAG/C,MAAM2uD,EAAU7gD,EAAQolF,KAAKW,eACvB/H,EAAO9rF,KAAKyzF,MACZH,EAAYtzF,KAAK0zF,WACjBoB,EAAchJ,GAAQn9B,EAAQm9B,GAC9BiJ,EAAczB,GAAa3kC,EAAQ2kC,GACnC9+C,EAAO9e,EAAMh3B,GACb05B,EAAQk7D,GAAayB,GAAevgD,GAAQA,EAAKpc,MAEvD,OAAOp4B,KAAKsyF,SAASh9D,OAAO49D,EAAM59D,IAAW8C,EAAQ28D,EAAcD,GACrE,CAKA11B,kBAAAA,CAAmB1pC,GACjB,IAAIlhB,EAAG8Q,EAAMkvB,EAEb,IAAKhgC,EAAI,EAAG8Q,EAAOoQ,EAAMhvB,OAAQ8N,EAAI8Q,IAAQ9Q,EAC3CggC,EAAO9e,EAAMlhB,GACbggC,EAAKlnC,MAAQtN,KAAK60F,oBAAoBrgD,EAAK1vC,MAAO0P,EAAGkhB,EAEzD,CAMA6+D,kBAAAA,CAAmBzvF,GACjB,OAAiB,OAAVA,EAAiBy6C,KAAOz6C,EAAQ9E,KAAK+R,MAAQ/R,KAAK8R,IAAM9R,KAAK+R,IACtE,CAMA6d,gBAAAA,CAAiB9qB,GACf,MAAMkwF,EAAUh1F,KAAK2zF,SACf9nD,EAAM7rC,KAAKu0F,mBAAmBzvF,GACpC,OAAO9E,KAAK0nD,oBAAoBstC,EAAQ1uF,MAAQulC,GAAOmpD,EAAQ1/C,OACjE,CAMAsS,gBAAAA,CAAiB7qB,GACf,MAAMi4D,EAAUh1F,KAAK2zF,SACf9nD,EAAM7rC,KAAK0hE,mBAAmB3kC,GAASi4D,EAAQ1/C,OAAS0/C,EAAQ9pE,IACtE,OAAOlrB,KAAK+R,IAAM85B,GAAO7rC,KAAK8R,IAAM9R,KAAK+R,IAC3C,CAOAkjF,aAAAA,CAAc3nF,GACZ,MAAM4nF,EAAYl1F,KAAK8N,QAAQ4nB,MACzBy/D,EAAiBn1F,KAAKk6B,IAAIiC,YAAY7uB,GAAOrN,MAC7CwqB,EAAQX,GAAU9pB,KAAK4kD,eAAiBswC,EAAUt9D,YAAcs9D,EAAUv9D,aAC1Ey9D,EAAcnmF,KAAK6iB,IAAIrH,GACvB4qE,EAAcpmF,KAAK4hB,IAAIpG,GACvB6qE,EAAet1F,KAAKshE,wBAAwB,GAAGj0D,KAErD,MAAO,CACLiH,EAAI6gF,EAAiBC,EAAgBE,EAAeD,EACpDxjF,EAAIsjF,EAAiBE,EAAgBC,EAAeF,EAExD,CAOAhB,iBAAAA,CAAkBmB,GAChB,MAAMrB,EAAWl0F,KAAK8N,QAAQolF,KACxBW,EAAiBK,EAASL,eAG1Bv+D,EAASu+D,EAAeK,EAASpI,OAAS+H,EAAejC,YACzD4D,EAAex1F,KAAK60F,oBAAoBU,EAAa,EAAGhC,GAAoBvzF,KAAM,CAACu1F,GAAcv1F,KAAK0zF,YAAap+D,GACnHjoB,EAAOrN,KAAKi1F,cAAcO,GAG1B5C,EAAW3jF,KAAK2Z,MAAM5oB,KAAK4kD,eAAiB5kD,KAAKC,MAAQoN,EAAKiH,EAAItU,KAAKu9B,OAASlwB,EAAKwE,GAAK,EAChG,OAAO+gF,EAAW,EAAIA,EAAW,CACnC,CAKA6B,iBAAAA,GACE,IACIjgF,EAAG8Q,EADH6tE,EAAanzF,KAAKnC,OAAO6B,MAAQ,GAGrC,GAAIyzF,EAAWzsF,OACb,OAAOysF,EAGT,MAAM/1B,EAAQp9D,KAAK45C,0BAEnB,GAAI55C,KAAK4zF,aAAex2B,EAAM12D,OAC5B,OAAQ1G,KAAKnC,OAAO6B,KAAO09D,EAAM,GAAGtjB,WAAW+F,mBAAmB7/C,MAGpE,IAAKwU,EAAI,EAAG8Q,EAAO83C,EAAM12D,OAAQ8N,EAAI8Q,IAAQ9Q,EAC3C2+E,EAAaA,EAAWrwC,OAAOsa,EAAM5oD,GAAGslC,WAAW+F,mBAAmB7/C,OAGxE,OAAQA,KAAKnC,OAAO6B,KAAOM,KAAKiwC,UAAUkjD,EAC5C,CAKAc,kBAAAA,GACE,MAAMd,EAAanzF,KAAKnC,OAAOihD,QAAU,GACzC,IAAItqC,EAAG8Q,EAEP,GAAI6tE,EAAWzsF,OACb,OAAOysF,EAGT,MAAMr0C,EAAS9+C,KAAK++C,YACpB,IAAKvqC,EAAI,EAAG8Q,EAAOw5B,EAAOp4C,OAAQ8N,EAAI8Q,IAAQ9Q,EAC5C2+E,EAAWnsE,KAAK6gB,GAAM7nC,KAAM8+C,EAAOtqC,KAGrC,OAAQxU,KAAKnC,OAAOihD,OAAS9+C,KAAK4zF,YAAcT,EAAanzF,KAAKiwC,UAAUkjD,EAC9E,CAMAljD,SAAAA,CAAU3jB,GAER,OAAOiB,GAAajB,EAAOpD,KAAKkpE,IAClC,ECtpBF,SAAS/wE,GAAYuK,EAAOzI,EAAK+B,GAC/B,IAEIuwE,EAAYC,EAAYC,EAAYC,EAFpC5pE,EAAK,EACLD,EAAKH,EAAMllB,OAAS,EAEpBwe,GACE/B,GAAOyI,EAAMI,GAAI6f,KAAO1oB,GAAOyI,EAAMG,GAAI8f,OACzC7f,KAAID,MAAME,GAAaL,EAAO,MAAOzI,MAEvC0oB,IAAK4pD,EAAYvC,KAAMyC,GAAc/pE,EAAMI,MAC3C6f,IAAK6pD,EAAYxC,KAAM0C,GAAchqE,EAAMG,MAEzC5I,GAAOyI,EAAMI,GAAIknE,MAAQ/vE,GAAOyI,EAAMG,GAAImnE,QAC1ClnE,KAAID,MAAME,GAAaL,EAAO,OAAQzI,MAExC+vE,KAAMuC,EAAY5pD,IAAK8pD,GAAc/pE,EAAMI,MAC3CknE,KAAMwC,EAAY7pD,IAAK+pD,GAAchqE,EAAMG,KAG/C,MAAM8pE,EAAOH,EAAaD,EAC1B,OAAOI,EAAOF,GAAcC,EAAaD,IAAexyE,EAAMsyE,GAAcI,EAAOF,CACrF,EDmoBAjwC,EAAAA,GAAAA,GA5dqB8tC,GAAkB,KAEzB,SAAO9tC,EAAAA,GAAAA,GAFA8tC,GAAkB,WAOnB,CAQhB38D,OAAQ,OAERk4B,SAAU,CAAC,EACXmkC,KAAM,CACJX,QAAQ,EACRzG,MAAM,EACN58E,OAAO,EACPsjF,YAAY,EACZG,QAAS,cACTkB,eAAgB,CAAC,GAEnBn+D,MAAO,CASLhQ,OAAQ,OAERd,UAAU,EAEVwT,MAAO,CACLohC,SAAS,MC7MjB,MAAMs8B,WAAwBtC,GAY5BpxE,WAAAA,CAAY/iB,GACVumD,MAAMvmD,GAGNW,KAAK+1F,OAAS,GAEd/1F,KAAKg2F,aAAUliF,EAEf9T,KAAKi2F,iBAAcniF,CACrB,CAKAugF,WAAAA,GACE,MAAMlB,EAAanzF,KAAKk2F,yBAClBtqE,EAAQ5rB,KAAK+1F,OAAS/1F,KAAKm2F,iBAAiBhD,GAClDnzF,KAAKg2F,QAAU30E,GAAYuK,EAAO5rB,KAAK+R,KACvC/R,KAAKi2F,YAAc50E,GAAYuK,EAAO5rB,KAAK8R,KAAO9R,KAAKg2F,QACvDpwC,MAAMyuC,YAAYlB,EACpB,CAaAgD,gBAAAA,CAAiBhD,GACf,MAAM,IAACphF,EAAG,IAAED,GAAO9R,KACbwtB,EAAQ,GACR5B,EAAQ,GACd,IAAIpX,EAAG8Q,EAAMilB,EAAMyY,EAAM1a,EAEzB,IAAK9zB,EAAI,EAAG8Q,EAAO6tE,EAAWzsF,OAAQ8N,EAAI8Q,IAAQ9Q,EAChDwuC,EAAOmwC,EAAW3+E,GACdwuC,GAAQjxC,GAAOixC,GAAQlxC,GACzB0b,EAAMxG,KAAKg8B,GAIf,GAAIx1B,EAAM9mB,OAAS,EAEjB,MAAO,CACL,CAACwsF,KAAMnhF,EAAK85B,IAAK,GACjB,CAACqnD,KAAMphF,EAAK+5B,IAAK,IAIrB,IAAKr3B,EAAI,EAAG8Q,EAAOkI,EAAM9mB,OAAQ8N,EAAI8Q,IAAQ9Q,EAC3C8zB,EAAO9a,EAAMhZ,EAAI,GACjB+1B,EAAO/c,EAAMhZ,EAAI,GACjBwuC,EAAOx1B,EAAMhZ,GAGTvF,KAAKC,OAAOo5B,EAAOiC,GAAQ,KAAOyY,GACpCp3B,EAAM5E,KAAK,CAACksE,KAAMlwC,EAAMnX,IAAKr3B,GAAK8Q,EAAO,KAG7C,OAAOsG,CACT,CAQAuoE,SAAAA,GACE,MAAMpiF,EAAM/R,KAAK+R,IACXD,EAAM9R,KAAK8R,IACjB,IAAIqhF,EAAavtC,MAAM6uC,oBAOvB,OANKtB,EAAW58D,SAASxkB,IAASohF,EAAWzsF,QAC3CysF,EAAW7lE,OAAO,EAAG,EAAGvb,GAErBohF,EAAW58D,SAASzkB,IAA8B,IAAtBqhF,EAAWzsF,QAC1CysF,EAAWnsE,KAAKlV,GAEXqhF,EAAWjqE,KAAK,CAACvW,EAAGC,IAAMD,EAAIC,EACvC,CAOAsjF,sBAAAA,GACE,IAAI/C,EAAanzF,KAAKnC,OAAO+5C,KAAO,GAEpC,GAAIu7C,EAAWzsF,OACb,OAAOysF,EAGT,MAAMzzF,EAAOM,KAAKy0F,oBACZnnF,EAAQtN,KAAKi0F,qBAUnB,OANEd,EAHEzzF,EAAKgH,QAAU4G,EAAM5G,OAGV1G,KAAKiwC,UAAUvwC,EAAKojD,OAAOx1C,IAE3B5N,EAAKgH,OAAShH,EAAO4N,EAEpC6lF,EAAanzF,KAAKnC,OAAO+5C,IAAMu7C,EAExBA,CACT,CAMAoB,kBAAAA,CAAmBzvF,GACjB,OAAQuc,GAAYrhB,KAAK+1F,OAAQjxF,GAAS9E,KAAKg2F,SAAWh2F,KAAKi2F,WACjE,CAMAruC,gBAAAA,CAAiB7qB,GACf,MAAMi4D,EAAUh1F,KAAK2zF,SACflyB,EAAUzhE,KAAK0hE,mBAAmB3kC,GAASi4D,EAAQ1/C,OAAS0/C,EAAQ9pE,IAC1E,OAAO7J,GAAYrhB,KAAK+1F,OAAQt0B,EAAUzhE,KAAKi2F,YAAcj2F,KAAKg2F,SAAS,EAC7E,GACFtwC,EAAAA,GAAAA,GA7IMowC,GAAwB,KAEhB,eAAapwC,EAAAA,GAAAA,GAFrBowC,GAAwB,WAOVtC,GAAUngE,U,gBC/BvB,MAAM+iE,GAAc,CACzB12F,KAAM,CACJJ,KAAM0O,OACNqoF,UAAU,GAEZvoF,QAAS,CACPxO,KAAM0O,OACNxO,QAASA,KAAA,CAAQ,IAEnBq7B,QAAS,CACPv7B,KAAMyG,MACNvG,QAASA,IAAM,IAEjB82F,aAAc,CACZh3F,KAAMC,OACNC,QAAS,SAEX+2F,WAAY,CACVj3F,KAAMC,OACNC,aAASsU,IAIA0iF,GAAY,CACvBC,UAAW,CACTn3F,KAAMC,QAERm3F,gBAAiB,CACfp3F,KAAMC,SAIGo3F,GAAQ,CACnBr3F,KAAM,CACJA,KAAMC,OACN82F,UAAU,GAEZO,aAAc,CACZt3F,KAAMkG,OACNhG,QAAS,MAER42F,MACAI,ICzCQK,GACI,MAAf5pF,EAAAA,GAAQ,GACJ,CAA6B6pF,EAAcz3F,IACzC2O,OAAO8T,OAAOg1E,EAAW,CAAEC,MAAO13F,IACpC,CAA6By3F,EAAcz3F,IACzC2O,OAAO8T,OAAOg1E,EAAWz3F,GAE1B,SAAS23F,GAAgBx0E,GAC9B,OAAOy0E,EAAAA,GAAAA,IAAQz0E,IAAO00E,EAAAA,GAAAA,IAAM10E,GAAOA,CACrC,CAEO,SAAS20E,GAA6B30E,GAAQ,IAAA1R,EAAAuxC,UAAA37C,OAAA,YAAA27C,UAAA,GAAAA,UAAA,GAAM7/B,EACzD,OAAOy0E,EAAAA,GAAAA,IAAQnmF,GAAO,IAAIyzB,MAAM/hB,EAAK,IAAMA,CAC7C,CAEO,SAAS40E,GAIdzhE,EAAoC0hE,GACpC,MAAMvpF,EAAU6nB,EAAM7nB,QAElBA,GAAWupF,GACbrpF,OAAO8T,OAAOhU,EAASupF,EAE3B,CAEO,SAASC,GAKdC,EACAC,GAEAD,EAAYz4C,OAAS04C,CACvB,CAEO,SAASC,GAKdF,EACAG,EACApB,GAEA,MAAMqB,EAA8C,GAEpDJ,EAAYj+D,SAAWo+D,EAAa7iF,IACjC+iF,IAEC,MAAMC,EAAiBN,EAAYj+D,SAASqtB,KACzCp3B,GACCA,EAAQ+mE,KAAkBsB,EAAYtB,IAI1C,OACGuB,GACAD,EAAYl4F,OACbi4F,EAAcphE,SAASshE,IAKzBF,EAAc3wE,KAAK6wE,GAEnB7pF,OAAO8T,OAAO+1E,EAAgBD,GAEvBC,GAPE,IAAKD,IAUpB,CAEO,SAASE,GAIdp4F,EAAuC42F,GACvC,MAAMyB,EAA4C,CAChDj5C,OAAQ,GACRxlB,SAAU,IAMZ,OAHAg+D,GAAUS,EAAUr4F,EAAKo/C,QACzB24C,GAAYM,EAAUr4F,EAAK45B,SAAUg9D,GAE9ByB,CACT,CC3EO,MAAMtrB,IAAQurB,EAAAA,EAAAA,IAAgB,CACnC34F,MAAOs3F,GACPsB,KAAAA,CAAM54F,EAAO64F,GAAA,WAAEC,EAAM,MAAEC,GAAVF,EACX,MAAMG,GAAYj6F,EAAAA,GAAAA,IAA8B,MAC1Ck6F,GAAWC,EAAAA,GAAAA,IAA2B,MAE5CJ,EAAO,CAAExiE,MAAO2iE,IAEhB,MAAME,EAAcA,KAClB,IAAKH,EAAUvzF,MAAO,OAEtB,MAAM,KAAExF,EAAI,KAAEI,EAAI,QAAEoO,EAAO,QAAE+sB,EAAO,aAAEy7D,GAAiBj3F,EACjDo5F,EAAaX,GAAUp4F,EAAM42F,GAC7BoC,EAAcvB,GAAWsB,EAAY/4F,GAE3C44F,EAASxzF,MAAQ,IAAI6zF,GAAQN,EAAUvzF,MAAO,CAC5CxF,OACAI,KAAMg5F,EACN5qF,QAAS,IAAKA,GACd+sB,aAIE+9D,EAAeA,KACnB,MAAMjjE,GAAQuhE,EAAAA,GAAAA,IAAMoB,EAASxzF,OAEzB6wB,IACEt2B,EAAMu3F,aAAe,EACvBxoE,WAAW,KACTuH,EAAMq7C,UACNsnB,EAASxzF,MAAQ,MAChBzF,EAAMu3F,eAETjhE,EAAMq7C,UACNsnB,EAASxzF,MAAQ,QAKjBsxC,EAAUzgB,IACdA,EAAMygB,OAAO/2C,EAAMk3F,aAyDrB,OAtDAsC,EAAAA,EAAAA,IAAUL,IAEVM,EAAAA,EAAAA,IAAYF,IAEZ14F,EAAAA,EAAAA,IACE,CAAC,IAAMb,EAAMyO,QAAS,IAAMzO,EAAMK,MAClC,CAGKw4F,EAAAa,KAFH,IAACC,EAAkBC,GACnBf,GAACgB,EAAkBC,GAAcJ,EAEjC,MAAMpjE,GAAQuhE,EAAAA,GAAAA,IAAMoB,EAASxzF,OAE7B,IAAK6wB,EACH,OAGF,IAAIyjE,GAAe,EAEnB,GAAIJ,EAAkB,CACpB,MAAM3B,EAAcL,GAAagC,GAC3BK,EAAcrC,GAAakC,GAE7B7B,GAAeA,IAAgBgC,IACjCjC,GAAWzhE,EAAO0hE,GAClB+B,GAAe,E,CAInB,GAAIH,EAAe,CACjB,MAAMzB,EAAaR,GAAaiC,EAAcn6C,QACxCw6C,EAAatC,GAAamC,EAAcr6C,QACxC44C,EAAeV,GAAaiC,EAAc3/D,UAC1CigE,EAAevC,GAAamC,EAAc7/D,UAE5Ck+D,IAAe8B,IACjBhC,GAAU3hE,EAAMihB,OAAOl3C,KAAM83F,GAC7B4B,GAAe,GAGb1B,GAAgBA,IAAiB6B,IACnC9B,GAAY9hE,EAAMihB,OAAOl3C,KAAMg4F,EAAcr4F,EAAMi3F,cACnD8C,GAAe,E,CAIfA,IACFI,EAAAA,EAAAA,IAAS,KACPpjD,EAAOzgB,MAIb,CAAE8jE,MAAM,IAGH,KACE5nF,EAAAA,EAAAA,GACL,SACA,CACE6nF,KAAM,MACN,aAAcr6F,EAAMo3F,UACpB,mBAAoBp3F,EAAMq3F,gBAC1Bt4F,IAAKi6F,GAEP,EAACxmF,EAAAA,EAAAA,GAAE,IAAK,CAAC,EAAG,CAACumF,EAAM54F,QAAU44F,EAAM54F,UAAY,MAGrD,IClHK,SAASm6F,GAKdr6F,EACAs6F,GAIA,OAFAjB,GAAQ3zB,SAAS40B,IAEV5B,EAAAA,EAAAA,IAAgB,CACrB34F,MAAO+2F,GACP6B,KAAAA,CAAM54F,EAAO64F,G,IAAA,OAAEC,GAAFD,EACX,MAAM95F,GAAMm6F,EAAAA,GAAAA,IAA2B,MACjCsB,EAAgBvB,IACpBl6F,EAAI0G,MAAQwzF,GAAU3iE,OAKxB,OAFAwiE,EAAO,CAAExiE,MAAOv3B,IAET,KACEyT,EAAAA,EAAAA,GACL46D,GACAoqB,GACE,CACEz4F,IAAKy7F,GAEP,CACEv6F,UACGD,IAKb,GAEJ,C,MAWay6F,GAA2BH,GACtC,WACAjwC,IAGWqwC,GAAuBJ,GAAiB,OAAQvtC,I,wEC1DtD,MAAM4tC,WAA4BtzD,MACvCtkB,WAAAA,CAAY5S,EAASyqF,EAAMpqF,GAAc,EAAOD,EAAa,IAC3Dg2C,MAAMp2C,GACNxP,KAAKZ,KAAO,sBACZY,KAAKi6F,KAAOA,EACZj6F,KAAK6P,YAAcA,EACnB7P,KAAK4P,WAAaA,CACpB,EAOF,MAAMsqF,GAAiB,CACrB,IAAK,IAAM,IAAIF,GACb,aACA,eACA,EACA,cAEF,IAAK,IAAM,IAAIA,GACb,aACA,aACA,EACA,cAEF,IAAMG,GAAY,IAAIH,GACpB,WAAWG,IACX,gBACA,EACA,cAEF,IAAK,IAAM,IAAIH,GACb,UACA,gBACA,EACA,sBAEFI,QAASA,IAAM,IAAIJ,GACjB,SACA,iBACA,EACA,cAEFK,MAAOA,IAAM,IAAIL,GACf,QACA,WACA,EACA,KAUJ,SAASM,GAAY/wB,EAAO4wB,EAAU,IAEpC,GAAmB,eAAf5wB,EAAMnqE,KACR,OAAO86F,GAAeG,QAIxB,GAAI9wB,aAAiBgxB,UAAahxB,GAAiC,kBAAjBA,EAAM16D,OAAsB,CAC5E,MAAMhI,EAAUqzF,GAAe3wB,EAAM16D,QACrC,OAAIhI,EACKA,EAAQszF,GAEV,IAAIH,GACT,SAASzwB,EAAM16D,SACf,cACA,EACA,QAEJ,CAGA,OAAI06D,aAAiBixB,WAAajxB,EAAM/5D,QAAQ+mB,SAAS,SAChD2jE,GAAeE,UAIjB,IAAIJ,GACTzwB,EAAM/5D,SAAW,OACjB,iBACA,EACA,QAEJ,CAOA,MAAMirF,GAQJr4E,WAAAA,CAAYtU,EAAU,CAAC,GACrB9N,KAAK06F,UAAY5sF,EAAQ4sF,WAAa,IACtC16F,KAAK8rE,WAAah+D,EAAQg+D,YAAc,MAAS,GACjD9rE,KAAKiR,QAAUnD,EAAQmD,SAAW,MAAS,GAC3CjR,KAAK26F,gBAAkB,IACzB,CAUA,qBAAMC,CAAgBC,GAAe,GAEnC76F,KAAK26F,gBAAkB,IAAIG,gBAC3B,MAAMC,EAAa,GACnB,IAAIva,EAAS,KACTwa,EAAe,EACfC,EAAa,EAEjB,IACE,EAAG,CAED,GAAIj7F,KAAK26F,gBAAgBO,OAAOC,QAC9B,MAIF,MAAMC,QAAiBp7F,KAAKq7F,WAAW7a,EAAQqa,GAG/CE,EAAW/zE,QAAQo0E,EAASE,SAC5B9a,EAAS4a,EAASG,WAClBP,GAAgBI,EAASE,QAAQ50F,OACjCu0F,IAGAj7F,KAAK8rE,WAAW,CACd0vB,MAAO,WACPnsF,QAAS2rF,EACTC,WAAYA,EACZzrF,QAAS,OAAOwrF,YAGpB,OAASxa,IAAWxgF,KAAK26F,gBAAgBO,OAAOC,SAGhD,GAAIn7F,KAAK26F,gBAAgBO,OAAOC,QAC9B,MAAMjB,GAAeG,QAGvB,OAAOU,CACT,CAAE,MAAOxxB,GAEP,MAAMkyB,EAAalyB,aAAiBywB,GAChCzwB,EACA+wB,GAAY/wB,GAEhB,MADAvpE,KAAKiR,QAAQwqF,GACPA,CACR,CACF,CAUA,gBAAMJ,CAAW7a,EAAQqa,GAEvB,MAAM/oC,EAAS,IAAI4pC,gBACflb,GACF1uB,EAAOrkC,IAAI,SAAU+yD,GAEnBqa,GACF/oC,EAAOrkC,IAAI,eAAgB,QAE7BqkC,EAAOrkC,IAAI,QAASluB,OAAOS,KAAK06F,YAEhC,IAEE,MAAMU,QAAiBO,EAAAA,GAAAA,GACrB,0BAA0B7pC,IAC1B,CAAEopC,OAAQl7F,KAAK26F,gBAAgBO,SAIjC,IAAKE,EAAS56E,GAAI,CAChB,IAAIo7E,EAAe,GACnB,IACE,MAAMC,QAAkBT,EAASU,OACjCF,EAAeC,EAAUtyB,OAAS,EACpC,CAAE,MACA,CAEF,MAAM+wB,GAAYc,EAAUQ,EAC9B,CAGA,MAAMl8F,QAAa07F,EAASU,OAG5B,IAAKp8F,EAAKq8F,QACR,MAAM,IAAI/B,GACRt6F,EAAK6pE,OAAS,OACd,aACA,EACA,SAIJ,MAAO,CACL+xB,QAAS57F,EAAK47F,SAAW,GACzBC,WAAY77F,EAAK67F,YAAc,KAC/BS,eAAgBt8F,EAAKs8F,gBAAkB,EAE3C,CAAE,MAAOzyB,GAEP,GAAIA,aAAiBywB,GACnB,MAAMzwB,EAGR,MAAM+wB,GAAY/wB,EACpB,CACF,CAMA0yB,KAAAA,GACMj8F,KAAK26F,iBACP36F,KAAK26F,gBAAgBsB,OAEzB,CAMAC,SAAAA,GACE,QAAOl8F,KAAK26F,iBAAkB36F,KAAK26F,gBAAgBO,OAAOC,OAC5D,CAMAv9C,KAAAA,GACE59C,KAAK26F,gBAAkB,IACzB,EAGF,UCvQA,MAAMwB,GAUJ/5E,WAAAA,CAAYtU,EAAU,CAAC,GACrB9N,KAAKo8F,UAAYtuF,EAAQsuF,WAAa,KACtCp8F,KAAKq8F,WAAavuF,EAAQuuF,YAAc,EACxCr8F,KAAKs8F,WAAaxuF,EAAQwuF,YAAc,IACxCt8F,KAAK8rE,WAAah+D,EAAQg+D,YAAc,MAAS,GACjD9rE,KAAKiR,QAAUnD,EAAQmD,SAAW,MAAS,GAC3CjR,KAAKu8F,UAAYv8F,KAAKw8F,oBACtBx8F,KAAKm7F,SAAU,CACjB,CAMA,iBAAMsB,GACJ,IACE,MAAMrB,QAAiBO,EAAAA,GAAAA,GAAc,kCACrC,IAAKP,EAAS56E,GACZ,MAAM,IAAIkmB,MAAM,UAElB,MAAM1d,QAAeoyE,EAASU,OAC9B,GAAI9yE,EAAO+yE,QACT,MAAO,CACLK,UAAWpzE,EAAOozE,WAAa,IAC/BM,aAAc1zE,EAAO0zE,cAAgB,WAGzC,MAAM,IAAIh2D,MAAM1d,EAAOugD,OAAS,SAClC,CAAE,MAAOA,GAGP,OADAxmC,QAAQC,KAAK,+CAAgDumC,GACtD,CAAE6yB,UAAW,IAAKM,aAAc,UACzC,CACF,CAeA,aAAMC,GACJ38F,KAAKm7F,SAAU,EAEf,IAEE,IAAKn7F,KAAKo8F,UAAW,CACnB,MAAMxlD,QAAe52C,KAAKy8F,cAC1Bz8F,KAAKo8F,UAAYxlD,EAAOwlD,SAC1B,CAGAp8F,KAAK8rE,WAAW,CACd0vB,MAAO,WACPhsF,QAAS,YACTH,QAAS,IAGX,MAAMutF,EAAY,IAAInC,GAAe,CACnC3uB,WAAa/oD,GAAM/iB,KAAK8rE,WAAW,IAAK/oD,EAAGy4E,MAAO,aAClDvqF,QAAU8B,GAAM/S,KAAKiR,QAAQ8B,KAGzBuoF,QAAgBsB,EAAUhC,iBAAgB,GAEhD,GAAI56F,KAAKm7F,QACP,MAAM,IAAInB,GAAoB,QAAS,WAAW,EAAO,IAa3D,GATAh6F,KAAK8rE,WAAW,CACd0vB,MAAO,UACPhsF,QAAS,UACTH,QAAS,EACTC,MAAOgsF,EAAQ50F,SAGjB1G,KAAK68F,0BAA0BvB,GAE3Bt7F,KAAKm7F,QACP,MAAM,IAAInB,GAAoB,QAAS,WAAW,EAAO,IAI3D,MAAM8C,EAAS98F,KAAK+8F,gBAAgBzB,GAEpC,IAAK,IAAI9mF,EAAI,EAAGA,EAAIsoF,EAAOp2F,OAAQ8N,IAAK,CACtC,GAAIxU,KAAKm7F,QACP,MAAM,IAAInB,GAAoB,QAAS,WAAW,EAAO,UAIrDh6F,KAAKg9F,qBAAqBF,EAAOtoF,GAAIA,GAE3CxU,KAAK8rE,WAAW,CACd0vB,MAAO,YACPnsF,QAASmF,EAAI,EACblF,MAAOwtF,EAAOp2F,OACd8I,QAAS,UAAUgF,EAAI,KAAKsoF,EAAOp2F,aAEvC,CAmBA,OAhBA1G,KAAK8rE,WAAW,CACd0vB,MAAO,aACPhsF,QAAS,YACTH,QAASytF,EAAOp2F,OAChB4I,MAAOwtF,EAAOp2F,eAGV1G,KAAKi9F,SAASH,EAAOp2F,OAAQ40F,EAAQ50F,QAE3C1G,KAAK8rE,WAAW,CACd0vB,MAAO,YACPhsF,QAAS,YAAY8rF,EAAQ50F,aAC7B2I,QAASisF,EAAQ50F,OACjB4I,MAAOgsF,EAAQ50F,SAGV,CAAEq1F,SAAS,EAAMpvF,WAAY2uF,EAAQ50F,OAC9C,CAAE,MAAO6iE,GACP,MAAMkyB,EAAalyB,aAAiBywB,GAChCzwB,EACA,IAAIywB,GACFzwB,EAAM/5D,SAAW,SACjB,iBACA,EACA,SAGN,MADAxP,KAAKiR,QAAQwqF,GACPA,CACR,CACF,CAOAoB,yBAAAA,CAA0BvB,GACxBA,EAAQpyE,KAAK,CAACvW,EAAGC,KACf,MAAMsqF,EAAcvqF,EAAEpB,UAAYoB,EAAEpB,SAASE,WAAc,EACrD0rF,EAAcvqF,EAAErB,UAAYqB,EAAErB,SAASE,WAAc,EAC3D,OAAO0rF,EAAaD,GAExB,CAQAH,eAAAA,CAAgBzB,GACd,MAAMwB,EAAS,GACf,IAAK,IAAItoF,EAAI,EAAGA,EAAI8mF,EAAQ50F,OAAQ8N,GAAKxU,KAAKo8F,UAC5CU,EAAO91E,KAAKs0E,EAAQt3E,MAAMxP,EAAGA,EAAIxU,KAAKo8F,YAExC,OAAOU,CACT,CAUA,0BAAME,CAAqBr5C,EAAOy5C,GAChC,IAAIC,EAEJ,IAAK,IAAIC,EAAU,EAAGA,GAAWt9F,KAAKq8F,WAAYiB,IAChD,IACE,aAAat9F,KAAKu9F,YAAY55C,EAAOy5C,EACvC,CAAE,MAAO7zB,GAIP,GAHA8zB,EAAY9zB,EAGRA,aAAiBywB,KACA,gBAAfzwB,EAAM0wB,MACS,cAAf1wB,EAAM0wB,MACS,YAAf1wB,EAAM0wB,MACR,MAAM1wB,EAKV,GAAI+zB,EAAUt9F,KAAKq8F,WAAY,CAE7B,MAAMpuE,EAAQjuB,KAAKs8F,WAAartF,KAAKmS,IAAI,EAAGk8E,EAAU,SAChDt9F,KAAKw9F,MAAMvvE,GAEjBjuB,KAAK8rE,WAAW,CACd0vB,MAAO,WACPhsF,QAAS,MAAM4tF,EAAU,gBAAgBE,KAAWt9F,KAAKq8F,iBACzDhtF,QAAS+tF,EACTE,QAASA,GAEb,CACF,CAIF,MAAMD,aAAqBrD,GACvBqD,EACA,IAAIrD,GACF,MAAMoD,EAAU,cAAcp9F,KAAKq8F,eACnC,uBACA,EACA,iBAER,CAUA,iBAAMkB,CAAY55C,EAAOy5C,GACvB,MAAMK,QAAiBz9F,KAAK09F,kBAAkB/5C,GAE9C,IACE,MAAMy3C,QAAiBO,EAAAA,GAAAA,GAAc,gCAAiC,CACpE3uE,OAAQ,OACR2wE,QAAS,CAAE,eAAgB,oBAC3Bxa,KAAMruD,KAAKC,UAAU,CACnBqoE,QAAS79F,OAAO69F,GAChBb,UAAWv8F,KAAKu8F,UAChB78F,KAAMikD,EACN85C,eAIJ,IAAKrC,EAAS56E,GAAI,CAChB,IAAIo7E,EAAe,GACnB,IACE,MAAMC,QAAkBT,EAASU,OACjCF,EAAeC,EAAUtyB,OAAS,EACpC,CAAE,MACA,CAEF,MAAMvpE,KAAK49F,gBAAgBxC,EAASvsF,OAAQ+sF,EAC9C,CAEA,MAAM5yE,QAAeoyE,EAASU,OAE9B,IAAK9yE,EAAO+yE,QACV,MAAM,IAAI/B,GACRhxE,EAAOugD,OAAS,SAChB,uBACA,EACA,SAIJ,OAAOvgD,CACT,CAAE,MAAOugD,GACP,GAAIA,aAAiBywB,GACnB,MAAMzwB,EAGR,GAAIA,aAAiBixB,WAAajxB,EAAM/5D,QAAQ+mB,SAAS,SACvD,MAAM,IAAIyjE,GACR,SACA,iBACA,EACA,cAGJ,MAAM,IAAIA,GACRzwB,EAAM/5D,SAAW,SACjB,uBACA,EACA,QAEJ,CACF,CAUA,cAAMytF,CAASY,EAAalxF,GAC1B,IACE,MAAMyuF,QAAiBO,EAAAA,GAAAA,GAAc,mCAAoC,CACvE3uE,OAAQ,OACR2wE,QAAS,CAAE,eAAgB,oBAC3Bxa,KAAMruD,KAAKC,UAAU,CACnBwnE,UAAWv8F,KAAKu8F,UAChBsB,cACAlxF,iBAIJ,IAAKyuF,EAAS56E,GAAI,CAChB,IAAIo7E,EAAe,GACnB,IACE,MAAMC,QAAkBT,EAASU,OACjCF,EAAeC,EAAUtyB,OAAS,EACpC,CAAE,MACA,CAEF,MAAMvpE,KAAK49F,gBAAgBxC,EAASvsF,OAAQ+sF,EAC9C,CAEA,MAAM5yE,QAAeoyE,EAASU,OAE9B,IAAK9yE,EAAO+yE,QACV,MAAM,IAAI/B,GACRhxE,EAAOugD,OAAS,SAChB,mBACA,EACA,SAIJ,OAAOvgD,CACT,CAAE,MAAOugD,GACP,GAAIA,aAAiBywB,GACnB,MAAMzwB,EAER,MAAM,IAAIywB,GACRzwB,EAAM/5D,SAAW,SACjB,mBACA,EACA,QAEJ,CACF,CAOAgtF,iBAAAA,GACE,MAAO,WAAW92F,KAAKwuC,SAASjlC,KAAK6uF,SAASh6E,SAAS,IAAIE,MAAM,IACnE,CAQA,uBAAM05E,CAAkBh+F,GACpB,MAAMg4B,EAAO5C,KAAKC,UAAUr1B,GACtBq+F,EAAU,IAAIC,YACdC,EAAaF,EAAQG,OAAOxmE,GAIlC,GAAsB,qBAAXymE,QAA0BA,OAAOC,OAAQ,CAClD,MAAMC,QAAmBF,OAAOC,OAAOE,OAAO,UAAWL,GACnDM,EAAYx4F,MAAMU,KAAK,IAAI+3F,WAAWH,IAC5C,OAAOE,EAAU1pF,IAAIjC,GAAKA,EAAEkR,SAAS,IAAI/e,SAAS,EAAG,MAAM4hC,KAAK,GAClE,CAGA,IAAIzzB,EAAK,WACLC,EAAK,WACT,IAAK,IAAIqB,EAAI,EAAGA,EAAIypF,EAAWv3F,OAAQ8N,IACrCtB,EAAKjE,KAAKwvF,KAAKvrF,EAAK+qF,EAAWzpF,GAAI,YAAgB,EACnDrB,EAAKlE,KAAKwvF,KAAKtrF,EAAK8qF,EAAWzpF,GAAI,YAAuB,EAE5D,OAAOtB,EAAG4Q,SAAS,IAAI/e,SAAS,EAAG,KAAOoO,EAAG2Q,SAAS,IAAI/e,SAAS,EAAG,IACxE,CAUF64F,eAAAA,CAAgB/uF,EAAQsrF,EAAU,IAChC,OAAQtrF,GACN,KAAK,IACH,OAAO,IAAImrF,GACT,aACA,eACA,EACA,cAEJ,KAAK,IACH,OAAO,IAAIA,GACT,aACA,aACA,EACA,cAEJ,KAAK,IACH,OAAO,IAAIA,GACT,WAAWG,IACX,gBACA,EACA,cAEJ,KAAK,IACH,OAAO,IAAIH,GACT,QACA,qBACA,EACA,aAEJ,KAAK,IACH,OAAO,IAAIA,GACT,QACA,mBACA,EACA,aAEJ,KAAK,IACL,QACE,OAAO,IAAIA,GACT,UAAUG,GAAWtrF,IACrB,gBACA,EACA,SAGR,CAQA2uF,KAAAA,CAAMkB,GACJ,OAAO,IAAIloD,QAAQvT,GAAW7U,WAAW6U,EAASy7D,GACpD,CAKAzC,KAAAA,GACEj8F,KAAKm7F,SAAU,CACjB,CAMAv9C,KAAAA,GACE59C,KAAKm7F,SAAU,EACfn7F,KAAKu8F,UAAYv8F,KAAKw8F,mBACxB,EAGF,UC1dA,MAAMmC,GAMJv8E,WAAAA,CAAYtU,EAAU,CAAC,GACrB9N,KAAK8rE,WAAah+D,EAAQg+D,YAAc,MAAS,GACjD9rE,KAAK48F,UAAY,IACnB,CAcA,oBAAMgC,GAEJ5+F,KAAK48F,UAAY,IAAInC,GAAe,CAClC3uB,WAAa/oD,GAAM/iB,KAAK8rE,WAAW,IAAK/oD,EAAGy4E,MAAO,eAGpD,MAAMF,QAAgBt7F,KAAK48F,UAAUhC,iBAAgB,GAGrD56F,KAAK8rE,WAAW,CAAE0vB,MAAO,WAAYhsF,QAAS,gBAE9C,MAAMY,EAAa,CACjBgjF,UAAW1tF,KAAKwuC,MAChBjnC,QAAS4xF,GAAAA,GACTn/F,KAAM,CACJo/F,UAAWxD,EAAQ50F,OACnBq4F,MAAO,CAAC,EACRC,SAAU,CAAC,IAKf,IAAK,MAAMC,KAAU3D,EACnBlrF,EAAW1Q,KAAKq/F,MAAME,EAAOluF,IAAM,CACjCQ,SAAU0tF,EAAO1tF,SACjBzM,MAAOm6F,EAAOn6F,OAAS,MAK3B,MAAMk6F,QAAiBh/F,KAAKk/F,gBAC5B9uF,EAAW1Q,KAAKs/F,SAAWA,EAG3Bh/F,KAAK8rE,WAAW,CAAE0vB,MAAO,cAAehsF,QAAS,cACjDxP,KAAKm/F,eAAe/uF,GAEpB,MAAMgvF,EAAgBpxF,OAAOC,KAAK+wF,GAAUt4F,OAC5C,MAAO,CAAEq1F,SAAS,EAAM+C,UAAWxD,EAAQ50F,OAAQ04F,gBACrD,CAOA,mBAAMF,GACJ,IACE,MAAM9D,QAAiBO,EAAAA,GAAAA,GAAc,8BACrC,IAAKP,EAAS56E,GAEZ,OADAuiB,QAAQC,KAAK,4BAA6Bo4D,EAASvsF,QAC5C,CAAC,EAEV,MAAMnP,QAAa07F,EAASU,OAE5B,OAAOp8F,EAAKs/F,UAAY,CAAC,CAC3B,CAAE,MAAOz1B,GAEP,OADAxmC,QAAQC,KAAK,4BAA6BumC,GACnC,CAAC,CACV,CACF,CAOA41B,cAAAA,CAAez/F,GAEb,MAAMo8F,EAAOhnE,KAAKC,UAAUr1B,EAAM,KAAM,GAGlC2/F,EAAO,IAAIC,KAAK,CAACxD,GAAO,CAAEx8F,KAAM,qBAGhCigG,EAAMC,IAAIC,gBAAgBJ,GAG1B1sF,EAAI+3B,SAASg1D,cAAc,KACjC/sF,EAAEgtF,KAAOJ,EAET5sF,EAAEitF,SAAW,kBAAiB,IAAIl6F,MAAOm6F,cAAc/4E,MAAM,KAAK,UAGlE4jB,SAASy4C,KAAK2c,YAAYntF,GAC1BA,EAAEotF,QAGFr1D,SAASy4C,KAAK6c,YAAYrtF,GAC1B6sF,IAAIS,gBAAgBV,EACtB,CAKAtD,KAAAA,GACMj8F,KAAK48F,WACP58F,KAAK48F,UAAUX,OAEnB,CAMAC,SAAAA,GACE,QAAOl8F,KAAK48F,WAAY58F,KAAK48F,UAAUV,WACzC,EAGF,UCzIA,MAAMgE,GAUJ99E,WAAAA,CAAYtU,EAAU,CAAC,GACrB9N,KAAKo8F,UAAYtuF,EAAQsuF,WAAa,GACtCp8F,KAAKq8F,WAAavuF,EAAQuuF,YAAc,EACxCr8F,KAAKs8F,WAAaxuF,EAAQwuF,YAAc,IACxCt8F,KAAK8rE,WAAah+D,EAAQg+D,YAAc,MAAS,GACjD9rE,KAAKiR,QAAUnD,EAAQmD,SAAW,MAAS,GAC3CjR,KAAKm7F,SAAU,CACjB,CAQA,aAAMv+D,CAAQxsB,GAIZ,GAHApQ,KAAKm7F,SAAU,GAGV/qF,IAAeA,EAAW1Q,KAC7B,MAAM,IAAIs6F,GACR,WACA,kBACA,EACA,cAIJ,MAAM,MAAE+E,EAAQ,CAAC,EAAC,SAAEC,EAAW,CAAC,GAAM5uF,EAAW1Q,KAC3CygG,EAAcnyF,OAAO+oD,QAAQgoC,GAC7BqB,EAAiBpyF,OAAO+oD,QAAQioC,GAEhCryF,EAAawzF,EAAYz5F,OACzB25F,EAAgBD,EAAe15F,OAC/B45F,EAAa3zF,EAAa0zF,EAEhC,IAAIE,EAAgB,EAChBC,EAAmB,EACnBC,EAAc,EACdC,EAAiB,EAErB,IAEE1gG,KAAK8rE,WAAW,CACd0vB,MAAO,kBACPhsF,QAAS,cACTH,QAAS,EACTC,MAAOgxF,IAGT,MAAMK,EAAa3gG,KAAK+8F,gBAAgBoD,EAAangG,KAAKo8F,WAE1D,IAAK,IAAI5nF,EAAI,EAAGA,EAAImsF,EAAWj6F,OAAQ8N,IAAK,CAC1C,GAAIxU,KAAKm7F,QACP,MAAM,IAAInB,GAAoB,QAAS,WAAW,EAAO,IAG3D,MAAMr2C,EAAQg9C,EAAWnsF,GACnBosF,EAAY5yF,OAAO6yF,YAAYl9C,GAE/B36B,QAAehpB,KAAKg9F,qBAAqB,QAAS4D,GACxDL,GAAiBv3E,EAAO83E,cACxBL,GAAez3E,EAAO+3E,YAEtB/gG,KAAK8rE,WAAW,CACd0vB,MAAO,kBACPhsF,QAAS,YAAY+wF,KAAiB5zF,OACtC0C,QAASkxF,EACTjxF,MAAOgxF,EACPlxF,WAAamxF,EAAgBD,EAAc,IAE/C,CAGAtgG,KAAK8rE,WAAW,CACd0vB,MAAO,qBACPhsF,QAAS,cACTH,QAASkxF,EACTjxF,MAAOgxF,IAGT,MAAMU,EAAgBhhG,KAAK+8F,gBAAgBqD,EAAgBpgG,KAAKo8F,WAEhE,IAAK,IAAI5nF,EAAI,EAAGA,EAAIwsF,EAAct6F,OAAQ8N,IAAK,CAC7C,GAAIxU,KAAKm7F,QACP,MAAM,IAAInB,GAAoB,QAAS,WAAW,EAAO,IAG3D,MAAMr2C,EAAQq9C,EAAcxsF,GACtBosF,EAAY5yF,OAAO6yF,YAAYl9C,GAE/B36B,QAAehpB,KAAKg9F,qBAAqB,WAAY4D,GAC3DJ,GAAoBx3E,EAAO83E,cAC3BJ,GAAkB13E,EAAO+3E,YAEzB/gG,KAAK8rE,WAAW,CACd0vB,MAAO,qBACPhsF,QAAS,YAAYgxF,KAAoBH,OACzChxF,QAASkxF,EAAgBC,EACzBlxF,MAAOgxF,EACPlxF,WAAY,GAAMoxF,EAAmBH,EAAiB,IAE1D,CAWA,OARArgG,KAAK8rE,WAAW,CACd0vB,MAAO,YACPhsF,QAAS,OACTH,QAASixF,EACThxF,MAAOgxF,EACPlxF,WAAY,MAGP,CACL2sF,SAAS,EACTwE,gBACAC,mBACAC,cACAC,iBACAO,gBAAiB7wF,EAAWgjF,UAGhC,CAAE,MAAO7pB,GACP,MAAMkyB,EAAalyB,aAAiBywB,GAChCzwB,EACA,IAAIywB,GACFzwB,EAAM/5D,SAAW,OACjB,iBACA,EACA,SAGN,MADAxP,KAAKiR,QAAQwqF,GACPA,CACR,CACF,CAKAsB,eAAAA,CAAgBhmC,EAASqlC,GACvB,MAAMU,EAAS,GACf,IAAK,IAAItoF,EAAI,EAAGA,EAAIuiD,EAAQrwD,OAAQ8N,GAAK4nF,EACvCU,EAAO91E,KAAK+vC,EAAQ/yC,MAAMxP,EAAGA,EAAI4nF,IAEnC,OAAOU,CACT,CAKA,0BAAME,CAAqB19F,EAAMI,GAC/B,IAAI29F,EAEJ,IAAK,IAAIC,EAAU,EAAGA,GAAWt9F,KAAKq8F,WAAYiB,IAChD,IACE,aAAat9F,KAAKu9F,YAAYj+F,EAAMI,EACtC,CAAE,MAAO6pE,GAGP,GAFA8zB,EAAY9zB,EAERA,aAAiBywB,KACA,gBAAfzwB,EAAM0wB,MACS,cAAf1wB,EAAM0wB,MACS,YAAf1wB,EAAM0wB,MACR,MAAM1wB,EAIV,GAAI+zB,EAAUt9F,KAAKq8F,WAAY,CAC7B,MAAMpuE,EAAQjuB,KAAKs8F,WAAartF,KAAKmS,IAAI,EAAGk8E,EAAU,SAChDt9F,KAAKw9F,MAAMvvE,EACnB,CACF,CAGF,MAAMovE,CACR,CAKA,iBAAME,CAAYj+F,EAAMI,GACtB,IACE,MAAM07F,QAAiBO,EAAAA,GAAAA,GAAc,kCAAmC,CACtE3uE,OAAQ,OACR2wE,QAAS,CAAE,eAAgB,oBAC3Bxa,KAAMruD,KAAKC,UAAU,CAAEz1B,OAAMI,WAG/B,IAAK07F,EAAS56E,GAAI,CAChB,IAAIo7E,EAAe,GACnB,IACE,MAAMC,QAAkBT,EAASU,OACjCF,EAAeC,EAAUtyB,OAAS,EACpC,CAAE,MACA,CAEF,MAAMvpE,KAAK49F,gBAAgBxC,EAASvsF,OAAQ+sF,EAC9C,CAEA,MAAM5yE,QAAeoyE,EAASU,OAE9B,IAAK9yE,EAAO+yE,QACV,MAAM,IAAI/B,GACRhxE,EAAOugD,OAAS,SAChB,wBACA,EACA,SAIJ,OAAOvgD,CACT,CAAE,MAAOugD,GACP,GAAIA,aAAiBywB,GACnB,MAAMzwB,EAER,GAAIA,aAAiBixB,WAAajxB,EAAM/5D,QAAQ+mB,SAAS,SACvD,MAAM,IAAIyjE,GACR,SACA,iBACA,EACA,cAGJ,MAAM,IAAIA,GACRzwB,EAAM/5D,SAAW,SACjB,wBACA,EACA,QAEJ,CACF,CAKAouF,eAAAA,CAAgB/uF,EAAQsrF,EAAU,IAChC,OAAQtrF,GACN,KAAK,IACH,OAAO,IAAImrF,GACT,aACA,eACA,EACA,cAEJ,KAAK,IACH,OAAO,IAAIA,GACT,aACA,aACA,EACA,cAEJ,KAAK,IACH,OAAO,IAAIA,GACT,WAAWG,IACX,gBACA,EACA,aAEJ,KAAK,IACL,QACE,OAAO,IAAIH,GACT,UAAUG,GAAWtrF,IACrB,gBACA,EACA,SAGR,CAKA2uF,KAAAA,CAAMkB,GACJ,OAAO,IAAIloD,QAAQvT,GAAW7U,WAAW6U,EAASy7D,GACpD,CAKAzC,KAAAA,GACEj8F,KAAKm7F,SAAU,CACjB,EAGF,UC3RA1uB,GAAQzH,SAASuQ,GAAY,GAAS,GAAQ0V,GAAemC,GAAa5U,GAAcR,GAAa,IACrG,MAAM,GAAS,MACf,SAAS,GAAYlzE,GACnB,OAAOvF,OAAOuF,GAAOC,SAAS,EAAG,IACnC,CACA,SAASm8F,GAAgBj8F,GACvB,MAAO,GAAGA,EAAKC,iBAAiB,GAAYD,EAAKE,WAAa,MAAM,GAAYF,EAAKG,YACvF,CACA,SAAS+7F,KACP,MAAMn6F,EAAU,IAAItB,KACpBsB,EAAQrB,SAAS,EAAG,EAAG,EAAG,GAC1B,MAAMoB,EAAY,IAAIrB,KAAKsB,EAAQL,UAAY,EAAI,IACnD,MAAO,CAACu6F,GAAgBn6F,GAAYm6F,GAAgBl6F,GACtD,CACA,QACE5H,KAAM,eACNgiG,WAAY,CACVtH,SAAQ,GACRC,KAAI,GACJsH,kBAAiB,GAEnB,IAAA3hG,GACE,MAAO,CACLsQ,SAAS,EACTC,YAAY,EACZE,SAAS,EACTI,WAAW,EACX7D,UAAW,CAAC,EACZO,QAAS,MAET4D,WAAY,CACVywF,QAAQ,EACRC,QAAQ,GAEVn0F,aAAc,UACdG,wBAAwB,EACxBG,eAAgByzF,KAEhBK,cAAe,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAE7FC,WAAY,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAE1FC,YAAa,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAEtG3yF,cAAc,EACd4yF,gBAAiB,GAEjBxyF,mBAAoB,CAClBE,QAAS,EACTC,MAAO,EACPE,QAAS,GACTJ,WAAY,GAEdO,gBAAiB,KACjBiyF,oBAAqB,KAErBC,iBAAkB,KAClBC,uBAAwB,KACxBC,wBAAyB,KAE7B,EACAniG,SAAU,CAER,gBAAAuO,GACE,MAAM6zF,EAAQhiG,KAAK0M,UAAUwB,cAAgB,CAAC,EAC9C,MAAO,CACL4wC,OAAQ9wC,OAAOC,KAAK+zF,GACpB1oE,SAAU,CAAC,CACT55B,KAAMsO,OAAOse,OAAO01E,GACpB5oE,gBAAiBp5B,KAAKwhG,cAAcx9E,MAAM,EAAGhW,OAAOC,KAAK+zF,GAAOt7F,QAChEo4B,YAAa,IAGnB,EAEA,aAAAnwB,GACE,MAAMszF,EAAkBjiG,KAAK4O,oBAC7B,MAAO,CACLkwC,OAAQ9wC,OAAOC,KAAKg0F,GACpB3oE,SAAU,CAAC,CACT55B,KAAMsO,OAAOse,OAAO21E,GACpB7oE,gBAAiBp5B,KAAKyhG,WAAWz9E,MAAM,EAAGhW,OAAOC,KAAKg0F,GAAiBv7F,QACvEo4B,YAAa,IAGnB,EAEA,mBAAAlwB,GACE,MAAMozF,EAAQhiG,KAAK0M,UAAUgC,WAAa,CAAC,EACrCuzF,EAAkB,CAAC,EACzB,IAAK,MAAOpzF,EAAQR,KAAUL,OAAO+oD,QAAQirC,GAAQ,CACnD,MAAME,EAA0B,UAAXrzF,EAAqB7O,KAAKhB,GAAG,qBAAuBgB,KAAKhB,GAAG,0BACjFijG,EAAgBC,IAAiBD,EAAgBC,IAAiB,GAAK7zF,CACzE,CACA,OAAO4zF,CACT,EAEA,iBAAAE,GACE,MAAMC,EAAQpiG,KAAK0M,UAAU21F,aAAe,CAAC,EACvCC,EAAUF,EAAME,SAAW,CAAC,EAClC,OAAOA,EAAQtiG,KAAKoN,eAAiB,CACnCm1F,OAAQ,GAEZ,EAEA,cAAAC,GACE,MAAMJ,EAAQpiG,KAAK0M,UAAU21F,aAAe,CAAC,EAC7C,OAAOD,EAAMtjD,QAAU,EACzB,EAEA,qBAAA2jD,GACE,MAAMC,EAAQ,IAAIh1E,IAIlB,OAHA1tB,KAAKwiG,eAAez1E,QAAQzf,IAC1BtN,KAAK2iG,uBAAuBr1F,GAAOyf,QAAQ9nB,GAAQy9F,EAAMphG,IAAI2D,EAAKM,SAE7Dm9F,EAAMr1F,KAAO,CACtB,EAEA,kBAAAu1F,GACE,OAAO5iG,KAAKwiG,eAAe3tF,IAAIvH,GAAStN,KAAK6iG,qBAAqBv1F,GACpE,EAEA,YAAAM,GACE,MAAMw0F,EAAQpiG,KAAK0M,UAAU21F,aAAe,CAAC,EAC7C,OAAQD,EAAMtjD,QAAU,IAAIp4C,OAAS,CACvC,EAEA,oBAAA+G,GACE,OAAO3N,OAAOC,WAAa,IAAM,QAAU,KAC7C,EAEA,oBAAA8N,GACE,MAAMu0F,EAAQpiG,KAAK0M,UAAU21F,aAAe,CAAC,EACvCE,EAASviG,KAAKmiG,kBAAkBI,QAAU,GAC1CO,EAAa,UACnB,MAAO,CACLhkD,OAAQ9+C,KAAK4iG,mBACbtpE,SAAU,CAAC,CACThsB,MAAOtN,KAAKhB,GAAG,0BACfU,KAAM0iG,EAAM9yF,OAAS,GACrB+pB,YAAaypE,EACb1pE,gBAAiBp5B,KAAK+iG,UAAUD,EAAY,IAC5CE,qBAAsBF,EACtBG,iBAAkBH,EAClBhkE,YAAa,EACbokE,YAAa,EACbC,iBAAkB,EAClB34D,QAAS,IACT3L,MAAM,MACF0jE,EAAO1tF,IAAI,CAACrW,EAAME,KACtB,MAAMgkB,EAAQ1iB,KAAKojG,cAAc1kG,GACjC,MAAO,CACL4O,MAAOtN,KAAKqjG,sBAAsB7kG,GAClCkB,KAAMlB,EAAKkB,MAAQ,GACnB25B,YAAa3W,EACb0W,gBAAiBp5B,KAAK+iG,UAAUrgF,EAAO,KACvCsgF,qBAAsBtgF,EACtBugF,iBAAkBvgF,EAClBoc,YAAa,EACbokE,YAAa,EACbC,iBAAkB,EAClB34D,QAAS,IACT3L,MAAM,MAId,EAEA,gBAAA9wB,GACE,MAAM27E,EAAY,UAClB,MAAO,CACL5uD,YAAY,EACZJ,qBAAqB,EACrBJ,YAAa,CACXC,KAAM,QACNC,WAAW,GAEbK,QAAS,CACP6wB,OAAQ,CACNh1B,SAAS,EACT64B,SAAU,SACVzQ,OAAQ,CACNy/B,eAAe,EACfD,SAAU,EACVD,UAAW,EACX/pD,QAAS,GACT5R,MAAOgnE,IAGXxG,QAAS,CACP9pD,gBAAiB,qBACjBuvD,WAAY,OACZtC,UAAW,OACX/xD,QAAS,GACTsJ,aAAc,EACdumD,eAAe,EACfvwC,UAAW,CACTpmC,MAAOggB,IACL,MAAM9uB,EAAQ8uB,IAAQ,IAAIotB,UAC1B,OAAO56C,KAAKwiG,eAAe9jG,IAAU,IAEvC4O,MAAOksB,IACL,MAAMoO,EAASpO,EAAQoO,QAAU,CAAC,EAC5B9iC,OAAqBgP,IAAb8zB,EAAOjhB,EAAkBihB,EAAOjhB,EAAI6S,EAAQqhB,IAC1D,MAAO,IAAIrhB,EAAQjK,QAAQjiB,UAAU9H,OAAOV,GAAS,GAAG8H,oBAAoB5M,KAAKhB,GAAG,+BAK5Fg8B,OAAQ,CACNtlB,EAAG,CACDshB,KAAM,CACJN,SAAS,GAEXhB,MAAO,CACLhT,MAAOgnE,EACPpwB,cAAe,EACfthC,UAAU,IAGdrR,EAAG,CACDiQ,aAAa,EACbI,KAAM,CACJtU,MAAO,6BAETgT,MAAO,CACLhT,MAAOgnE,EACPgC,UAAW,EACX9mE,SAAU9f,GAASU,OAAOV,GAAO8H,oBAK3C,EAEA,YAAAwB,GACE,MAAO,CACL0sB,YAAY,EACZJ,qBAAqB,EACrBiuB,OAAQ,MACR6C,YAAa,EACbyG,OAAQ,CACN39B,QAAS,IAEXuG,QAAS,CACP6wB,OAAQ,CACNh1B,SAAS,GAEXwsD,QAAS,CACP9pD,gBAAiB,qBACjBuvD,WAAY,OACZtC,UAAW,OACX/xD,QAAS,GACTsJ,aAAc,EACdumD,eAAe,EACf9vB,EAAG,IACHzgB,UAAW,CACTtmC,MAAOksB,IACL,MAAM10B,EAAQ00B,EAAQqhB,IAChBvrC,EAAQkqB,EAAQjK,QAAQ7vB,KAAKq1C,OAAO,CAACpiC,EAAGC,IAAMD,EAAIC,EAAG,GACrDxD,GAActK,EAAQwK,EAAQ,KAAKg0F,QAAQ,GACjD,MAAO,IAAIx+F,EAAM8H,qBAAqBwC,UAK9C0kB,UAAW,CACTi3B,eAAe,EACfK,cAAc,GAGpB,EAEA,sBAAA77C,GACE,IAAKvP,KAAK+O,eAAiB/O,KAAK4hG,oBAAqB,MAAO,GAC5D,GAAwC,IAApC5hG,KAAKmP,mBAAmBE,SAAwD,IAAvCrP,KAAKmP,mBAAmBC,WAAkB,MAAO,GAC9F,MAAMinC,EAAU3wC,KAAKwuC,MAAQl0C,KAAK4hG,oBAC5BhtD,EAAW50C,KAAKmP,mBAAmBC,WAAa,IACtD,GAAIwlC,GAAY,EAAG,MAAO,GAC1B,MAAM2uD,EAAiBltD,EAAUzB,EAC3BT,EAAYovD,EAAiBltD,EACnC,GAAIlC,GAAa,EAAG,OAAOn0C,KAAKhB,GAAG,6BACnC,MAAMwkG,EAAUv0F,KAAKsrD,KAAKpmB,EAAY,KACtC,GAAIqvD,EAAU,GAAI,OAAOxjG,KAAKhB,GAAG,oBAAqB,CACpDqP,MAAOm1F,IAET,MAAMC,EAAUx0F,KAAKsrD,KAAKipC,EAAU,IACpC,GAAIC,EAAU,GAAI,OAAOzjG,KAAKhB,GAAG,oBAAqB,CACpDqP,MAAOo1F,IAET,MAAMC,EAAQz0F,KAAK2Z,MAAM66E,EAAU,IAC7BE,EAAmBF,EAAU,GACnC,OAAOzjG,KAAKhB,GAAG,yBAA0B,CACvC0kG,QACAD,QAASE,GAEb,EAEA,gBAAA30F,GACE,MAAM40F,EAAW,CACf,SAAY5jG,KAAKhB,GAAG,2BACpB,QAAWgB,KAAKhB,GAAG,0BACnB,UAAagB,KAAKhB,GAAG,4BACrB,WAAcgB,KAAKhB,GAAG,6BACtB,SAAYgB,KAAKhB,GAAG,2BACpB,YAAegB,KAAKhB,GAAG,8BACvB,gBAAmBgB,KAAKhB,GAAG,iCAC3B,mBAAsBgB,KAAKhB,GAAG,oCAC9B,UAAagB,KAAKhB,GAAG,4BACrB,SAAYgB,KAAKhB,GAAG,4BAEtB,OAAO4kG,EAAS5jG,KAAK2hG,kBAAoB3hG,KAAK2hG,eAChD,GAEF,OAAApgG,GACEvB,KAAKyM,gBACP,EACApM,QAAS,CAEP,aAAAmO,CAAc9P,GACZ,OAAOsB,KAAKwhG,cAAc9iG,EAAQsB,KAAKwhG,cAAc96F,OACvD,EAEA,iBAAAoI,CAAkBpQ,GAChB,OAAOsB,KAAKyhG,WAAW/iG,EAAQsB,KAAKyhG,WAAW/6F,OACjD,EAEA,aAAA08F,CAAc1kG,GACZ,OAAOsB,KAAK0hG,YAAYhjG,EAAQsB,KAAK0hG,YAAYh7F,OACnD,EAEA,qBAAA28F,CAAsBd,GACpB,OAAIA,GAAQsB,SAA4B,cAAjBtB,GAAQnjG,KACtBY,KAAKhB,GAAG,2BAEVujG,GAAQnjG,MAAQY,KAAKhB,GAAG,oBACjC,EAEA,SAAA+jG,CAAU9vF,EAAKW,GACb,MAAMkgF,GAAc7gF,GAAO,IAAIyN,QAAQ,IAAK,IAC5C,GAA0B,IAAtBozE,EAAWptF,OACb,MAAO,qBAAqBkN,KAE9B,MAAMN,EAAIqN,SAASmzE,EAAW9vE,MAAM,EAAG,GAAI,IACrCzQ,EAAIoN,SAASmzE,EAAW9vE,MAAM,EAAG,GAAI,IACrCpR,EAAI+N,SAASmzE,EAAW9vE,MAAM,EAAG,GAAI,IAC3C,MAAO,QAAQ1Q,MAAMC,MAAMX,MAAMgB,IACnC,EAEA,sBAAA+uF,CAAuBr1F,GACrB,MAAM80B,EAAU7iC,OAAO+N,GAAS,IAAIhI,MAAM,uBAAyB,GACnE,OAAO88B,EAAQvtB,IAAIrW,IACjB,MAAO+G,EAAME,EAAOrB,GAAO5F,EAAKsoB,MAAM,KAAKjS,IAAIrP,QAC/C,MAAO,CACLD,OACAE,QACArB,QAGN,EAEA,oBAAAy+F,CAAqBv1F,GACnB,MAAMw2F,EAAQ9jG,KAAK2iG,uBAAuBr1F,GAC1C,GAAqB,IAAjBw2F,EAAMp9F,OAAc,OAAO4G,EAC/B,MAAMy2F,EAAmB,CAAC9+F,EAAM++F,KAC9B,MAAMC,EAAW,GAAGh/F,EAAKQ,SAASR,EAAKb,MACvC,OAAO4/F,EAAc,GAAG/+F,EAAKM,QAAQ0+F,IAAaA,GAEpD,GAAqB,IAAjBH,EAAMp9F,OACR,OAAOq9F,EAAiBD,EAAM,GAAI9jG,KAAKyiG,uBAEzC,MAAO17F,EAAWC,GAAW88F,EAC7B,IAAK9jG,KAAKyiG,sBACR,MAAO,GAAGsB,EAAiBh9F,GAAW,MAAUg9F,EAAiB/8F,GAAS,KAE5E,MAAMk9F,EAAWn9F,EAAUxB,OAASyB,EAAQzB,KAAOw+F,EAAiB/8F,GAAS,GAAS+8F,EAAiB/8F,GAAS,GAChH,MAAO,GAAG+8F,EAAiBh9F,GAAW,MAASm9F,GACjD,EAEA,mBAAA/2F,GACEnN,KAAKuN,wBAAyB,CAChC,EAEA,0BAAAI,CAA2B7I,GACpBiB,MAAM6O,QAAQ9P,IAA2B,IAAjBA,EAAM4B,QAAiB5B,EAAM,IAAOA,EAAM,KAGvE9E,KAAKuN,wBAAyB,EAC9BvN,KAAKyM,iBACP,EAEA,uBAAA03F,GAIE,OAHKp+F,MAAM6O,QAAQ5U,KAAK0N,iBAAkD,IAA/B1N,KAAK0N,eAAehH,SAC7D1G,KAAK0N,eAAiByzF,MAEjB,CACLp6F,UAAW/G,KAAK0N,eAAe,GAC/B1G,QAAShH,KAAK0N,eAAe,GAEjC,EAEA,oBAAMjB,GACJzM,KAAKgQ,SAAU,EACf,IACE,MAAM,UACJjJ,EAAS,QACTC,GACEhH,KAAKmkG,0BACHryC,EAAS,IAAI4pC,gBAAgB,CACjC0I,OAAQ,OACRC,eAAgB9kG,QAAO,IAAImG,MAAO4+F,qBAClCC,eAAgB,KAChBC,iBAAkB,IAClBC,eAAgB19F,EAChB29F,aAAc19F,IAEVo0F,QAAiB,EAAAO,GAAA,GAAc,oBAAoB7pC,EAAOhuC,aAAc,CAC5EkJ,OAAQ,QAEV,IAAIouE,EAAS56E,GAIX,MAAM,IAAIkmB,MAAM,WAJD,CACf,MAAMhnC,QAAa07F,EAASU,OAC5B97F,KAAK0M,UAAYhN,CACnB,CAGF,CAAE,MAAO6pE,GACPxmC,QAAQwmC,MAAM,YAAaA,GAC3BvpE,KAAK2kG,SAASp7B,MAAMvpE,KAAKhB,GAAG,8BAC9B,CAAE,QACAgB,KAAKgQ,SAAU,CACjB,CACF,EAEA,kBAAME,GACJ,GAAIlQ,KAAK+O,aACP/O,KAAK2kG,SAASC,QAAQ5kG,KAAKhB,GAAG,sCADhC,CAIAgB,KAAKiQ,YAAa,EAClBjQ,KAAK+O,cAAe,EACpB/O,KAAK2P,gBAAkB,KACvB3P,KAAK4hG,oBAAsBl8F,KAAKwuC,MAChCl0C,KAAKmP,mBAAqB,CACxBE,QAAS,EACTC,MAAO,EACPE,QAAS,GACTJ,WAAY,GAIdpP,KAAK6hG,iBAAmB,IAAI,GAAe,CACzC/1B,WAAYl3B,GAAY50C,KAAK6kG,eAAejwD,GAC5C3jC,QAASs4D,GAASvpE,KAAK8kG,YAAYv7B,KAErC,IACE,MAAMvgD,QAAehpB,KAAK6hG,iBAAiBlF,UAG3C38F,KAAK2kG,SAAS5I,QAAQ/7F,KAAKhB,GAAG,2BAA4B,CACxDqP,MAAO2a,EAAOrc,WAAWC,oBAI3BwhB,WAAW,KACTpuB,KAAKyM,kBACJ,IACL,CAAE,MAAO88D,GAEP,GAAmB,YAAfA,EAAM0wB,KAAoB,CAC5B,MAAM8K,EAAex7B,EAAM35D,WAAa,GAAG25D,EAAM/5D,WAAW+5D,EAAM35D,aAAe25D,EAAM/5D,QACvFxP,KAAK2kG,SAASp7B,MAAMw7B,GACpB/kG,KAAK2P,gBAAkB,CACrBH,QAAS+5D,EAAM/5D,QACfI,WAAY25D,EAAM35D,WAClBC,YAAa05D,EAAM15D,YAEvB,CACF,CAAE,QACA7P,KAAKiQ,YAAa,EAClBjQ,KAAK+O,cAAe,EACpB/O,KAAK6hG,iBAAmB,KACxB7hG,KAAK4hG,oBAAsB,IAC7B,CA7CA,CA8CF,EAEA,gBAAMxxF,GACJ,GAAIpQ,KAAK+O,aACP/O,KAAK2kG,SAASC,QAAQ5kG,KAAKhB,GAAG,sCADhC,CAIAgB,KAAKmQ,SAAU,EACfnQ,KAAK+O,cAAe,EACpB/O,KAAK2P,gBAAkB,KACvB3P,KAAK4hG,oBAAsBl8F,KAAKwuC,MAChCl0C,KAAKmP,mBAAqB,CACxBE,QAAS,EACTC,MAAO,EACPE,QAAS,GACTJ,WAAY,GAIdpP,KAAK8hG,uBAAyB,IAAI,GAAgB,CAChDh2B,WAAYl3B,GAAY50C,KAAK6kG,eAAejwD,KAE9C,IACE,MAAM5rB,QAAehpB,KAAK8hG,uBAAuBlD,iBAG3CoG,EAAch8E,EAAOo2E,cAAgB,EAAIp/F,KAAKhB,GAAG,sCAAuC,CAC5F8/F,UAAW91E,EAAO81E,UAAUlyF,iBAC5BwyF,cAAep2E,EAAOo2E,gBACnBp/F,KAAKhB,GAAG,0BAA2B,CACtCqP,MAAO2a,EAAO81E,UAAUlyF,mBAE1B5M,KAAK2kG,SAAS5I,QAAQiJ,EACxB,CAAE,MAAOz7B,GAEP,GAAmB,YAAfA,EAAM0wB,KAAoB,CAC5B,MAAM8K,EAAex7B,EAAM35D,WAAa,GAAG25D,EAAM/5D,WAAW+5D,EAAM35D,aAAe25D,EAAM/5D,QACvFxP,KAAK2kG,SAASp7B,MAAMw7B,GACpB/kG,KAAK2P,gBAAkB,CACrBH,QAAS+5D,EAAM/5D,QACfI,WAAY25D,EAAM35D,WAClBC,YAAa05D,EAAM15D,YAEvB,CACF,CAAE,QACA7P,KAAKmQ,SAAU,EACfnQ,KAAK+O,cAAe,EACpB/O,KAAK8hG,uBAAyB,KAC9B9hG,KAAK4hG,oBAAsB,IAC7B,CA3CA,CA4CF,EAEA,iBAAApxF,GACMxQ,KAAKuQ,WACTvQ,KAAKU,MAAMukG,UAAUlF,OACvB,EAEA,sBAAMzvF,CAAiBm8B,GACrB,MAAMy4D,EAAOz4D,EAAM9mB,OAAOo5E,MAAM,GAChC,GAAKmG,EACL,GAAKA,EAAK9lG,KAAKqlB,SAAS,SAAxB,CAMA,UACQzkB,KAAKmlG,SAASnlG,KAAKhB,GAAG,mCAAoCgB,KAAKhB,GAAG,iCAAkC,CACxGomG,kBAAmBplG,KAAKhB,GAAG,8BAC3BqmG,iBAAkBrlG,KAAKhB,GAAG,kCAC1BM,KAAM,kBAEFU,KAAKslG,YAAYJ,EACzB,CAAE,MAAO37B,GACO,WAAVA,GACFxmC,QAAQwmC,MAAM,UAAWA,EAE7B,CAGA98B,EAAM9mB,OAAO7gB,MAAQ,EAjBrB,MAFE9E,KAAK2kG,SAASp7B,MAAMvpE,KAAKhB,GAAG,4BAoBhC,EAEA,iBAAMsmG,CAAYJ,GAChB,GAAIllG,KAAK+O,aACP/O,KAAK2kG,SAASC,QAAQ5kG,KAAKhB,GAAG,sCADhC,CAIAgB,KAAKuQ,WAAY,EACjBvQ,KAAK+O,cAAe,EACpB/O,KAAK2P,gBAAkB,KACvB3P,KAAK4hG,oBAAsBl8F,KAAKwuC,MAChCl0C,KAAKmP,mBAAqB,CACxBE,QAAS,EACTC,MAAO,EACPE,QAAS,GACTJ,WAAY,GAEd,IAEE,MAAMm2F,QAAoBL,EAAKxtE,OAC/B,IAAItnB,EACJ,IACEA,EAAa0kB,KAAK+S,MAAM09D,EAC1B,CAAE,MAAOC,GACP,MAAM,IAAI9+D,MAAM1mC,KAAKhB,GAAG,+BAC1B,CAGAgB,KAAK+hG,wBAA0B,IAAI,GAAiB,CAClD3F,UAAW,IAEXtwB,WAAYl3B,GAAY50C,KAAK6kG,eAAejwD,GAC5C3jC,QAASs4D,GAASvpE,KAAK8kG,YAAYv7B,KAErC,MAAMvgD,QAAehpB,KAAK+hG,wBAAwBnlE,QAAQxsB,GAG1DpQ,KAAKuQ,WAAY,EACjBvQ,KAAK+O,cAAe,EACpB/O,KAAK+hG,wBAA0B,KAC/B/hG,KAAK4hG,oBAAsB,KAG3B5hG,KAAK2kG,SAAS5I,QAAQ/7F,KAAKhB,GAAG,2BAA4B,CACxD+/F,MAAO/1E,EAAOu3E,cACdvB,SAAUh2E,EAAOw3E,0BAIb,IAAIhqD,QAAQvT,GAAW7U,WAAW6U,EAAS,YAC3CjjC,KAAKkQ,cACb,CAAE,MAAOq5D,GAQP,GAPAxmC,QAAQwmC,MAAM,UAAWA,GAGzBvpE,KAAKuQ,WAAY,EACjBvQ,KAAK+O,cAAe,EACpB/O,KAAK+hG,wBAA0B,KAC/B/hG,KAAK4hG,oBAAsB,KACR,YAAfr4B,EAAM0wB,KAAoB,CAC5B,MAAM8K,EAAex7B,EAAM35D,WAAa,GAAG25D,EAAM/5D,WAAW+5D,EAAM35D,aAAe25D,EAAM/5D,QACvFxP,KAAK2kG,SAASp7B,MAAMvpE,KAAKhB,GAAG,2BAA6B,KAAO+lG,GAChE/kG,KAAK2P,gBAAkB,CACrBH,QAAS+5D,EAAM/5D,QACfI,WAAY25D,EAAM35D,WAClBC,YAAa05D,EAAM15D,YAEvB,CACF,CA9DA,CA+DF,EAEA,UAAAhD,CAAWumF,GACT,IAAKA,EAAW,OAAOpzF,KAAKhB,GAAG,qBAC/B,MAAMiG,EAAO,IAAIS,KAAK0tF,GACtB,OAAOnuF,EAAK2H,eAAe,QAAS,CAClCrH,KAAM,UACNE,MAAO,UACPrB,IAAK,UACL4tF,KAAM,UACND,OAAQ,WAEZ,EAEA,aAAAtjF,CAAc3J,EAAOwK,GACnB,OAAKA,GAAmB,IAAVA,EACPL,KAAKC,MAAMpK,EAAQwK,EAAQ,KADA,CAEpC,EAEA,UAAAvC,CAAWqmF,GACT,IAAKA,EAAW,MAAO,GACvB,MAAMl/C,EAAMxuC,KAAKwuC,MACX0a,EAAO1a,EAAMk/C,EACbqQ,EAAUx0F,KAAK2Z,MAAMgmC,EAAO,KAC5B80C,EAAQz0F,KAAK2Z,MAAMgmC,EAAO,MAC1B62C,EAAOx2F,KAAK2Z,MAAMgmC,EAAO,OAC/B,OAAI62C,EAAO,EAAUzlG,KAAKhB,GAAG,oBAAqB,CAChDqP,MAAOo3F,IAEL/B,EAAQ,EAAU1jG,KAAKhB,GAAG,qBAAsB,CAClDqP,MAAOq1F,IAELD,EAAU,EAAUzjG,KAAKhB,GAAG,uBAAwB,CACtDqP,MAAOo1F,IAEFzjG,KAAKhB,GAAG,oBACjB,EAEA,gBAAAkS,CAAiB5R,GACfU,KAAK6Q,WAAWvR,IAAQ,CAC1B,EAEA,cAAAomG,CAAepmG,EAAM4lG,GACnB,OAAIllG,KAAK6Q,WAAWvR,OACf4lG,GAAM3zF,UAAUo0F,WACdT,EAAK3zF,SAASo0F,SAASpvE,SAAS,UAAY2uE,EAAK3zF,SAASo0F,SAASpvE,SAAS,UACrF,EAEA,YAAAvpB,GACElN,OAAO8lG,KAAK,2DAA4D,SAC1E,EAEA,WAAAh1F,CAAYs0F,GACV,IAAKA,EAAM,OAAO,EAElB,GAAIA,EAAK3zF,UAAUo0F,UAAUpvE,SAAS,SAAU,OAAO,EAEvD,MAAMsvE,EAAWX,EAAK3zF,UAAUC,UAAY0zF,EAAKn0F,IAAM,GACjD+0F,EAAYD,EAASE,UAAUF,EAAS9a,YAAY,KAAO,GAAGhqE,cAC9DilF,EAAkB,CAAC,MAAO,OAAQ,MAAO,MAAO,MAAO,OAAQ,MAAO,MAAO,OAAQ,MAAO,OAAQ,OAAQ,QAClH,OAAOA,EAAgBzvE,SAASuvE,EAClC,EAEA,WAAA30F,CAAY+zF,GACV,IAAKA,EAAM,OAAO,EAElB,GAAIA,EAAK3zF,UAAUo0F,UAAUpvE,SAAS,SAAU,OAAO,EAEvD,MAAMsvE,EAAWX,EAAK3zF,UAAUC,UAAY0zF,EAAKn0F,IAAM,GACjD+0F,EAAYD,EAASE,UAAUF,EAAS9a,YAAY,KAAO,GAAGhqE,cAC9DklF,EAAkB,CAAC,MAAO,OAAQ,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,OACxG,OAAOA,EAAgB1vE,SAASuvE,EAClC,EAEA,gBAAAn1F,CAAiBu0F,GACVA,GAAMn0F,IACXjR,OAAO8lG,KAAK,SAAWV,EAAKn0F,GAAK,cAAe,SAClD,EAEA,cAAA8zF,CAAejwD,GACb50C,KAAK2hG,gBAAkB/sD,EAAS4mD,MAChCx7F,KAAKmP,mBAAmBK,QAAUolC,EAASplC,SAAW,GACtDxP,KAAKmP,mBAAmBE,QAAUulC,EAASvlC,SAAW,EAG/B,aAAnBulC,EAAS4mD,OAEXx7F,KAAKmP,mBAAmBG,MAAQslC,EAAStlC,OAAS,EAE9CslC,EAAStlC,OAASslC,EAAStlC,MAAQ,EACrCtP,KAAKmP,mBAAmBC,WAAaH,KAAK8C,IAAI,GAAI6iC,EAASvlC,QAAUulC,EAAStlC,MAAQ,IAGtFtP,KAAKmP,mBAAmBC,WAAaH,KAAK8C,IAAI,GAAuC,GAAnC9C,KAAKmZ,MAAMwsB,EAASvlC,QAAU,KAEtD,YAAnBulC,EAAS4mD,OAElBx7F,KAAKmP,mBAAmBC,WAAa,GACrCpP,KAAKmP,mBAAmBG,MAAQslC,EAAStlC,OAAStP,KAAKmP,mBAAmBG,OAC9C,cAAnBslC,EAAS4mD,OAElBx7F,KAAKmP,mBAAmBG,MAAQslC,EAAStlC,OAAS,EAC9CslC,EAAStlC,OAASslC,EAAStlC,MAAQ,IACrCtP,KAAKmP,mBAAmBC,WAAa,GAAKwlC,EAASvlC,QAAUulC,EAAStlC,MAAQ,KAEpD,eAAnBslC,EAAS4mD,MAElBx7F,KAAKmP,mBAAmBC,WAAa,GACT,aAAnBwlC,EAAS4mD,MAElBx7F,KAAKmP,mBAAmBC,WAAa,GACT,gBAAnBwlC,EAAS4mD,MAElBx7F,KAAKmP,mBAAmBC,WAAa,GACT,oBAAnBwlC,EAAS4mD,OAElBx7F,KAAKmP,mBAAmBG,MAAQslC,EAAStlC,OAAS,EAClDtP,KAAKmP,mBAAmBC,WAAawlC,EAASxlC,YAAc,GAChC,uBAAnBwlC,EAAS4mD,OAElBx7F,KAAKmP,mBAAmBG,MAAQslC,EAAStlC,OAAS,EAClDtP,KAAKmP,mBAAmBC,WAAawlC,EAASxlC,YAAc,IAChC,cAAnBwlC,EAAS4mD,MAElBx7F,KAAKmP,mBAAmBC,WAAa,IACT,aAAnBwlC,EAAS4mD,QAElBx7F,KAAKmP,mBAAmBK,QAAUolC,EAASplC,QAE/C,EAEA,WAAAs1F,CAAYv7B,GACVxmC,QAAQwmC,MAAM,UAAWA,GACzBvpE,KAAK2P,gBAAkB,CACrBH,QAAS+5D,EAAM/5D,QACfI,WAAY25D,EAAM35D,WAClBC,YAAa05D,EAAM15D,YAEvB,EAEA,eAAAH,GACM1P,KAAK6hG,mBACP7hG,KAAK6hG,iBAAiB5F,QACtBj8F,KAAK2kG,SAASxhE,KAAKnjC,KAAKhB,GAAG,iCAEzBgB,KAAK8hG,yBACP9hG,KAAK8hG,uBAAuB7F,QAC5Bj8F,KAAK2kG,SAASxhE,KAAKnjC,KAAKhB,GAAG,iCAEzBgB,KAAK+hG,0BACP/hG,KAAK+hG,wBAAwB9F,QAC7Bj8F,KAAK2kG,SAASxhE,KAAKnjC,KAAKhB,GAAG,gCAE/B,EAEA,cAAA8Q,GACE9P,KAAK2P,gBAAkB,KACnB3P,KAAKiQ,YACPjQ,KAAKiQ,YAAa,EAClBjQ,KAAK+O,cAAe,EACpB/O,KAAKG,UAAU,KACbH,KAAKkQ,kBAEElQ,KAAKmQ,UACdnQ,KAAKmQ,SAAU,EACfnQ,KAAK+O,cAAe,EACpB/O,KAAKG,UAAU,KACbH,KAAKoQ,eAGX,EAEA,YAAAL,GACE/P,KAAK2P,gBAAkB,IACzB,ICvzBJ,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,U,wMCRA,MAAM,GAAa,CAAC,WACb,SAAS,GAAO/R,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACjDgoG,EAAyB,KAC/B,OAAO,WAAc,QAAoB,MAAO,CAC9C1oG,OAAO,QAAgB,CAAC,gBAAiB,CACvC,UAAWQ,EAAMmoG,UAEnB9nG,OAAO,QAAgB,CACrB4B,MAAOnC,EAAOmC,SAEf,EAAC,QAAoB,MAAO,CAC7BzC,MAAO,wBACPoB,QAASf,EAAO,KAAOA,EAAO,GAAK,IAAIqB,IAASjB,EAASmoG,gBAAkBnoG,EAASmoG,kBAAkBlnG,KACrG,EAAC,QAAoB,OAAQ,CAC9B1B,OAAO,QAAgB,CAAC,sBAAuB,CAC7C,kBAAmBM,EAAOgI,gBAE3B,QAAiB7H,EAASooG,cAAe,IAAI,QAAanoG,EAA8B,CACzFa,KAAM,eACNvB,MAAO,2BACH,QAAa,KAAa,CAC9B4B,KAAM,iBACL,CACDI,SAAS,QAAS,IAAM,EAAC,SAAgB,QAAoB,MAAO,CAClEhC,MAAO,yBACPoB,QAASf,EAAO,KAAOA,EAAO,IAAK,QAAe,OAAU,CAAC,WAC5D,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYC,EAAOgQ,QAASopC,KAC/E,WAAc,QAAoB,MAAO,CAC9Cz4C,IAAKy4C,EAAOpyC,MACZtH,OAAO,QAAgB,CAAC,uBAAwB,CAC9C,cAAeM,EAAOgI,aAAeoxC,EAAOpyC,SAE9ClG,QAASC,GAAUZ,EAASqoG,aAAapvD,EAAOpyC,QAC/C,EAAC,QAAYlH,EAAK2oG,OAAQ,SAAU,CACrCrvD,OAAQA,GACP,IAAM,CAACA,EAAOsvD,cAAe,WAAc,QAAaN,EAAwB,CACjFznG,IAAK,EACLa,KAAM43C,EAAOsvD,YACbhpG,OAAO,QAAgB,CAAC,cAAe05C,EAAOuvD,aAC7C,KAAM,EAAG,CAAC,OAAQ,WAAavvD,EAAOn4C,OAAQ,WAAc,QAAab,EAA8B,CACxGO,IAAK,EACLM,KAAMm4C,EAAOn4C,KACbvB,OAAO,QAAgB,CAAC,cAAe05C,EAAOuvD,aAC7C,KAAM,EAAG,CAAC,OAAQ,YAAa,QAAoB,IAAI,IAAO,QAAoB,OAAQ,MAAM,QAAiBvvD,EAAO5pC,OAAQ,KAAK,IAAQ,GAAI,MAClJ,OAAQ,KAAM,CAAC,CAAC,KAAQtP,EAAMmoG,YAClC7jG,EAAG,KACA,EACP,CC9CA,QACElD,KAAM,eACNgiG,WAAY,CACVsF,YAAW,MAEbrnG,MAAO,CACLyG,WAAY,CACVxG,KAAM,CAACC,OAAQiG,QACfhG,QAAS,IAEXsO,QAAS,CACPxO,KAAMyG,MACNswF,UAAU,GAGZsQ,YAAa,CACXrnG,KAAMC,OACNC,QAAS,IAEXS,MAAO,CACLX,KAAMC,OACNC,QAAS,UAGbwG,MAAO,CAAC,oBAAqB,UAC7B,IAAAtG,GACE,MAAO,CACLymG,QAAQ,EAEZ,EACAvmG,SAAU,CACR,mBAAAgnG,GACE,OAAO5mG,KAAK2mG,aAAe3mG,KAAKhB,GAAG,gBACrC,EACA,YAAAqnG,GACE,MAAMQ,EAAW7mG,KAAK8N,QAAQ64C,KAAKmgD,GAAOA,EAAIhiG,QAAU9E,KAAK8F,YAC7D,OAAO+gG,EAAWA,EAASv5F,MAAQtN,KAAK4mG,mBAC1C,GAEF,OAAArlG,GACEmpC,SAASlpC,iBAAiB,QAASxB,KAAK+mG,mBAC1C,EACA,aAAAC,GACEt8D,SAAShpC,oBAAoB,QAAS1B,KAAK+mG,mBAC7C,EACA1mG,QAAS,CACP,cAAA+lG,GACEpmG,KAAKmmG,QAAUnmG,KAAKmmG,MACtB,EACA,YAAAG,CAAaxhG,GACX9E,KAAKM,MAAM,oBAAqBwE,GAChC9E,KAAKM,MAAM,SAAUwE,GACrB9E,KAAKmmG,QAAS,CAChB,EACA,kBAAAY,CAAmBh0F,GACZ/S,KAAKinG,IAAIhmG,SAAS8R,EAAE4S,UACvB3lB,KAAKmmG,QAAS,EAElB,ICtDJ,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,UCRA,MAAM,GAAa,CACjB3oG,MAAO,mBAEH,GAAa,CACjBA,MAAO,eAEH,GAAa,CACjBA,MAAO,eAEH,GAAa,CACjBA,MAAO,kBAEH,GAAa,CACjBA,MAAO,gBAEH,GAAa,CACjBA,MAAO,eAEH,GAAa,CACjBiB,IAAK,EACLjB,MAAO,uBAEH,GAAa,CACjBA,MAAO,gBAEH,GAAa,CACjBiB,IAAK,EACLjB,MAAO,iBAEH,GAAc,CAAC,cAAe,gBAC9B,GAAc,CAClBA,MAAO,eAEH,GAAc,CAClBA,MAAO,cAEH,GAAc,CAClBA,MAAO,gBAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBiB,IAAK,EACLjB,MAAO,aAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBiB,IAAK,EACLjB,MAAO,aAEH,GAAc,CAAC,SACf,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBiB,IAAK,EACLjB,MAAO,aAEH,GAAc,CAAC,SACf,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAClBA,MAAO,aAEH,GAAc,CAAC,SACf,GAAc,CAClBiB,IAAK,EACLjB,MAAO,aAEH,GAAc,CAAC,SACf,GAAc,CAClBiB,IAAK,EACLjB,MAAO,cAEH,GAAc,CAClBA,MAAO,cAEH,GAAc,CAClBA,MAAO,gBAEH,GAAc,CAClBiB,IAAK,EACLjB,MAAO,aAEH,GAAc,CAClBA,MAAO,uBAEH,GAAc,CAClBiB,IAAK,EACLjB,MAAO,eACPa,MAAO,CACL,aAAc,MAGZ,GAAc,CAAC,aACf,GAAc,CAClBb,MAAO,gBAEH,GAAc,CAClBA,MAAO,eAEH,GAAc,CAClBA,MAAO,gBAEF,SAAS,GAAOI,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACjD2D,EAAwB,KACxBqlG,EAA0B,GAC1Bn7F,EAAuB,KACvBm6F,EAAyB,KACzBiB,EAAoB,KACpBC,EAAuB,MACvB96F,EAAyB,KACzB+6F,EAAuB,MACvBC,EAAuB,MACvBC,EAA0B,MAC1BC,EAAsB,MACtBC,EAA6B,MAC7BC,EAAqB,MACrBv7F,EAAuB,KACvBw7F,EAAkC,MAClCC,EAA6B,MAC7Bp7F,EAAqB,IAC3B,OAAO,UAAiB,WAAc,QAAoB,MAAO,GAAY,EAAC,QAAoB,MAAO,GAAY,EAAC,QAAoB,KAAM,GAAY,EAAC,SAAiB,QAAiB5O,EAAKoB,GAAG,oBAAsB,IAAK,IAAI,QAAa6C,EAAuB,CACxQM,QAASvE,EAAKoB,GAAG,0BACjBoD,UAAW,SACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,gBAET8E,EAAG,GACF,EAAG,CAAC,eAAe,QAAoB,MAAO,GAAY,EAAC,QAAa4kG,EAAyB,CAClGphG,WAAY9H,EAAM6pG,cAClB,sBAAuBhqG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAM6pG,cAAgBhpG,GACjFiP,QAAS7P,EAAS6pG,cAClBnB,YAAa/oG,EAAKoB,GAAG,+BACrBiB,MAAO,SACN,KAAM,EAAG,CAAC,aAAc,UAAW,iBAAiB,QAAa8L,EAAsB,CACxFzM,KAAM,UACNV,QAASf,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAM+pG,eAAgB,GACnEvqG,MAAO,WACN,CACDgC,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,OACNV,MAAO,CACL,eAAgB,UAEhB,QAAiB,KAAM,QAAiBT,EAAKoB,GAAG,yBAA0B,KAC9EsD,EAAG,UACI,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYrE,EAAS+pG,iBAAkBxB,KAC9F,WAAc,QAAoB,MAAO,CAC9C/nG,IAAK+nG,EAAY1hG,MACjBtH,MAAO,iBACN,EAAC,QAAoB,MAAO,GAAY,EAAC,QAAoB,MAAO,GAAY,EAAC,QAAa0oG,EAAwB,CACvH5mG,KAAMknG,EAAY1hG,MAClBtH,OAAO,QAAgB,CAAC,aAAcS,EAASgqG,oBAAoBzB,EAAY1hG,UAC9E,KAAM,EAAG,CAAC,OAAQ,WAAW,QAAoB,OAAQ,MAAM,QAAiB0hG,EAAYl5F,OAAQ,IAAI,QAAa65F,EAAmB,CACzI95F,KAAM,QACN/N,KAAM,OACN9B,MAAO,iBACN,CACDgC,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBvB,EAASiqG,eAAe1B,EAAY1hG,OAAO4B,QAAS,KAC/GpE,EAAG,GACF,QAASrE,EAASkqG,eAAe3B,EAAY1hG,SAAU,WAAc,QAAoB,MAAO,GAAY,EAAC,QAAoB,OAAQ,IAAY,QAAiBlH,EAAKoB,GAAG,0BAA2B,IAAI,QAAaooG,EAAsB,CACjPthG,WAAY7H,EAASmqG,YAAY5B,EAAY1hG,OAAOujG,YAAY7uC,QAChE,sBAAuB36D,GAAUZ,EAASmqG,YAAY5B,EAAY1hG,OAAOujG,YAAY7uC,QAAU36D,EAC/FwO,KAAM,QACN/J,SAAUrF,EAASqqG,cAClB,KAAM,EAAG,CAAC,aAAc,sBAAuB,iBAAkB,QAAoB,IAAI,KAASrqG,EAASiqG,eAAe1B,EAAY1hG,OAAO4B,OAAS,IAAK,WAAc,QAAoB,MAAO,GAAY,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYzI,EAASiqG,eAAe1B,EAAY1hG,OAAQ,CAACwJ,EAAS5P,MACrU,WAAc,QAAoB,MAAO,CAC9CD,IAAK6P,EAAQlP,MAAQV,EACrBlB,OAAO,QAAgB,CAAC,eAAgB,CAACgpG,EAAY1hG,MAAO,CAC1D,UAAawJ,EAAQkrD,QACrB,MAASlrD,EAAQi6F,UAEnBC,YAAa3pG,GAAUZ,EAASwqG,oBAAoB5pG,EAAQ2nG,EAAY1hG,MAAOpG,GAC/EgqG,aAAc7pG,GAAUZ,EAAS0qG,qBAAqBnC,EAAY1hG,MAAOpG,IACxE,EAAC,QAAoB,MAAO,CAC7BlB,MAAO,YACPorG,SAAS,EACTxqG,IAAK,QAAQooG,EAAY1hG,SAASpG,KACjC,KAAM,MAAM,QAAoB,MAAO,GAAa,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAoB,OAAQ,IAAa,QAAiB4P,EAAQlP,MAAQxB,EAAKoB,GAAG,6BAA8B,GAAIsP,EAAQi6F,QAAS,WAAc,QAAapB,EAAmB,CAClR1oG,IAAK,EACL4O,KAAM,QACN/N,KAAM,WACL,CACDE,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,0BAA2B,KAC9FsD,EAAG,MACC,QAAoB,IAAI,MAAS,QAAa8kG,EAAsB,CACxEthG,WAAYwI,EAAQkrD,QACpB,sBAAuB36D,GAAUyP,EAAQkrD,QAAU36D,EACnDwO,KAAM,QACNzO,QAASf,EAAO,KAAOA,EAAO,IAAK,QAAe,OAAU,CAAC,UAC7DyF,SAAUrF,EAASqqG,cAClB,KAAM,EAAG,CAAC,aAAc,sBAAuB,gBAAgB,QAAoB,MAAO,GAAa,EAAC,QAAoB,MAAO,GAAa,CAAuB,aAAtB9B,EAAY1hG,QAAwB,WAAc,QAAoB,KAAW,CACnOrG,IAAK,GACJ,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAaP,EAA8B,CACtFa,KAAM,QACNvB,MAAO,eACL,QAAoB,OAAQ,GAAa,SAAU,QAAiBS,EAAS4qG,SAASv6F,EAAQw6F,WAAY,KAAMx6F,EAAQy6F,SAAU,WAAc,QAAoB,MAAO,GAAa,EAAC,QAAa7qG,EAA8B,CACtOa,KAAM,WACNvB,MAAO,eACL,QAAoB,OAAQ,GAAa,aAAc,QAAiBS,EAAS4qG,SAASv6F,EAAQy6F,SAAU,OAAQ,QAAoB,IAAI,IAAQ,KAA6B,SAAtBvC,EAAY1hG,QAAoB,WAAc,QAAoB,MAAO,GAAa,EAAC,QAAa5G,EAA8B,CAC/Ra,KAAM,OACNvB,MAAO,eACL,QAAoB,OAAQ,CAC9BA,MAAO,YACPgQ,MAAOc,EAAQ06F,YACd,QAAiB16F,EAAQ06F,WAAaprG,EAAKoB,GAAG,qBAAsB,EAAG,OAAwC,OAAtBwnG,EAAY1hG,QAAkB,WAAc,QAAoB,KAAW,CACrKrG,IAAK,GACJ,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAaP,EAA8B,CACtFa,KAAM,SACNvB,MAAO,eACL,QAAoB,OAAQ,IAAa,QAAiB8Q,EAAQ26F,YAAcrrG,EAAKoB,GAAG,qBAAsB,KAAMsP,EAAQ46F,WAAY,WAAc,QAAoB,MAAO,GAAa,EAAC,QAAahrG,EAA8B,CAC5Oa,KAAM,OACNvB,MAAO,eACL,QAAoB,OAAQ,CAC9BA,MAAO,YACPgQ,MAAOc,EAAQ46F,WACd,QAAiB56F,EAAQ46F,UAAW,EAAG,QAAkB,QAAoB,IAAI,IAAQ,KAA6B,YAAtB1C,EAAY1hG,QAAuB,WAAc,QAAoB,KAAW,CACjLrG,IAAK,GACJ,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAaP,EAA8B,CACtFa,KAAM,QACNvB,MAAO,eACL,QAAoB,OAAQ,GAAa,SAAU,QAAiBS,EAAS4qG,SAASv6F,EAAQw6F,WAAY,MAAM,QAAoB,MAAO,GAAa,EAAC,QAAa5qG,EAA8B,CACtMa,KAAM,UACNvB,MAAO,eACL,QAAoB,OAAQ,GAAa,aAAc,QAAiBS,EAAS4qG,SAASv6F,EAAQ66F,YAAa,KAAM76F,EAAQ86F,UAAW,WAAc,QAAajC,EAAmB,CACxL1oG,IAAK,EACL4O,KAAM,QACN/N,KAAM,WACL,CACDE,SAAS,QAAS,IAAM,IAAK3B,EAAO,MAAQA,EAAO,IAAM,EAAC,QAAiB,SAAU,OACrFyE,EAAG,MACC,QAAoB,IAAI,IAAQ,KAA6B,gBAAtBkkG,EAAY1hG,QAA2B,WAAc,QAAoB,KAAW,CAC/HrG,IAAK,GACJ,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAaP,EAA8B,CACtFa,KAAM,WACNvB,MAAO,eACL,QAAoB,OAAQ,IAAa,QAAiB8Q,EAAQ+6F,MAAQzrG,EAAKoB,GAAG,qBAAsB,KAAMsP,EAAQg7F,YAAa,WAAc,QAAanC,EAAmB,CACnL1oG,IAAK,EACL4O,KAAM,QACN/N,KAAM,WACL,CACDE,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,0BAA2B,KAC9FsD,EAAG,MACC,QAAoB,IAAI,IAAQ,KAA6B,WAAtBkkG,EAAY1hG,QAAsB,WAAc,QAAoB,KAAW,CAC1HrG,IAAK,GACJ,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAaP,EAA8B,CACtFa,KAAM,SACNvB,MAAO,eACL,QAAoB,OAAQ,CAC9BA,MAAO,YACPgQ,MAAOc,EAAQi7F,UACd,QAAiBj7F,EAAQi7F,SAAW3rG,EAAKoB,GAAG,qBAAsB,EAAG,MAAgBsP,EAAQ06F,YAAa,WAAc,QAAoB,MAAO,GAAa,EAAC,QAAa9qG,EAA8B,CAC7Ma,KAAM,OACNvB,MAAO,eACL,QAAoB,OAAQ,CAC9BA,MAAO,YACPgQ,MAAOc,EAAQ06F,YACd,QAAiB16F,EAAQ06F,WAAY,EAAG,QAAkB,QAAoB,IAAI,IAAQ,MAAO,QAAoB,IAAI,KAAS16F,EAAQk7F,OAAOhwC,UAAW,WAAc,QAAoB,MAAO,GAAa,EAAC,QAAaltD,EAAwB,CACzP8C,WAAYnR,EAASwrG,mBAAmBn7F,GACxCO,OAAQ5Q,EAASyrG,eAAep7F,GAChC,eAAgB,GACf,KAAM,EAAG,CAAC,aAAc,YAAY,QAAoB,OAAQ,IAAa,QAAiBrQ,EAAS0rG,aAAar7F,IAAW,OAAQ,QAAoB,IAAI,MAAS,QAAoB,MAAO,GAAa,EAAC,QAAavC,EAAsB,CACrP2rB,KAAM,GACNp4B,KAAM,UACN+N,KAAM,QACNzO,QAASC,GAAUZ,EAAS2rG,iBAAiBpD,EAAY1hG,MAAOpG,IAC/D,CACDc,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,MACNV,MAAO,CACL,eAAgB,UAEhB,SAAiB,QAAiBT,EAAKoB,GAAG,qBAAsB,KACpEsD,EAAG,GACF,EAAG,CAAC,aAAa,QAAayJ,EAAsB,CACrD2rB,KAAM,GACNp4B,KAAM,UACN+N,KAAM,QACNzO,QAASC,GAAUZ,EAAS4rG,eAAerD,EAAY1hG,MAAOpG,IAC7D,CACDc,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,OACNV,MAAO,CACL,eAAgB,UAEhB,SAAiB,QAAiBT,EAAKoB,GAAG,sBAAuB,KACrEsD,EAAG,GACF,EAAG,CAAC,aAAa,QAAayJ,EAAsB,CACrD2rB,KAAM,GACNp4B,KAAM,SACN+N,KAAM,QACNzO,QAASC,GAAUZ,EAAS6rG,cAActD,EAAY1hG,MAAOpG,GAC7DuD,SAAUqM,EAAQi6F,OACjB,CACD/oG,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,YACNV,MAAO,CACL,eAAgB,UAEhB,SAAiB,QAAiBT,EAAKoB,GAAG,wBAAyB,KACvEsD,EAAG,GACF,EAAG,CAAC,UAAW,gBAAiB,GAAI,MACrC,WAAY,WAAc,QAAoB,MAAO,GAAa,EAAC,QAAapE,EAA8B,CAChHa,KAAM,QACNvB,MAAO,gBACL,QAAoB,OAAQ,MAAM,QAAiBI,EAAKoB,GAAG,uBAAwB,CACrFM,KAAMknG,EAAYl5F,SACf,UACH,OAAO,QAAanB,EAAsB,CAC5CrG,WAAY9H,EAAM+pG,cAClB,sBAAuBlqG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAM+pG,cAAgBlpG,GACnF2O,MAAO5P,EAAKoB,GAAG,4BACfxB,MAAO,iBACP,mBAAoB,GACpBusG,SAAU9rG,EAAS+rG,cAClB,CACD5mB,QAAQ,QAAS,IAAM,EAAC,QAAar3E,EAAsB,CACzDnN,QAASf,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAM+pG,eAAgB,IACpE,CACDvoG,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,qBAAsB,KACzFsD,EAAG,IACyB,SAA1BtE,EAAMisG,WAAW3qG,OAAmB,WAAc,QAAayM,EAAsB,CACvFtN,IAAK,EACLa,KAAM,UACNV,QAASX,EAASisG,mBACjB,CACD1qG,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,yBAA0B,KAC7FsD,EAAG,GACF,EAAG,CAAC,cAAe,QAAoB,IAAI,KAC9C9C,SAAS,QAAS,IAAM,EAAC,QAAakoG,EAAoB,CACxDyC,MAAOnsG,EAAMisG,WACb,iBAAkB,MAClB7rG,IAAK,UACLgsG,MAAOnsG,EAASosG,UACf,CACD7qG,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,8BACfyjC,KAAM,QACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAa8nG,EAAsB,CAC1DxhG,WAAY9H,EAAMisG,WAAW3qG,KAC7B,sBAAuBzB,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMisG,WAAW3qG,KAAOT,GACnF8nG,YAAa/oG,EAAKoB,GAAG,oCACrBX,MAAO,CACL,MAAS,QAEXiF,SAAUrF,EAASqsG,qBAClB,CACD9qG,SAAS,QAAS,IAAM,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYxB,EAAMusG,gBAAiBC,KAC3G,WAAc,QAAanD,EAAsB,CACtD5oG,IAAK+rG,EAAG1lG,MACRwI,MAAOk9F,EAAGl9F,MACVxI,MAAO0lG,EAAG1lG,OACT,CACDtF,SAAS,QAAS,IAAM,EAAC,QAAoB,OAAQ,GAAa,EAAC,QAAa0mG,EAAwB,CACtG5mG,KAAMkrG,EAAG1lG,MACTtH,OAAO,QAAgB,CAAC,qBAAsBS,EAASgqG,oBAAoBuC,EAAG1lG,UAC7E,KAAM,EAAG,CAAC,OAAQ,WAAW,QAAoB,OAAQ,MAAM,QAAiB0lG,EAAGl9F,OAAQ,OAC9FhL,EAAG,GACF,KAAM,CAAC,QAAS,YACjB,QACJA,EAAG,GACF,EAAG,CAAC,aAAc,cAAe,eACpCA,EAAG,GACF,EAAG,CAAC,UAAqC,SAA1BtE,EAAMisG,WAAW3qG,OAAmB,WAAc,QAAoB,MAAO,GAAa,EAAC,QAAapB,EAA8B,CACtJa,KAAM,cACNV,MAAO,CACL,eAAgB,UAEhB,QAAoB,OAAQ,CAC9BosG,UAAW7sG,EAAKoB,GAAG,2BAClB,KAAM,EAAG,SAAmB,WAAc,QAAoB,KAAW,CAC1EP,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxC9kE,KAAM,QACL,CACDn1B,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,+BAAiC,IAAK,IAAI,QAAa6C,EAAuB,CAC7IM,QAASvE,EAAKoB,GAAG,qCACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,uBACNvB,MAAO,0BAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAW7qG,KAC7B,sBAAuBvB,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMisG,WAAW7qG,KAAOP,GACnF8nG,YAAa/oG,EAAKoB,GAAG,qCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,IACyB,aAA1BtE,EAAMisG,WAAW3qG,OAAuB,WAAc,QAAoB,KAAW,CACvFb,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACfyjC,KAAM,YACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWnB,SAC7B,sBAAuBjrG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMisG,WAAWnB,SAAWjqG,GACvFS,KAAM,WACN,gBAAiB,GACjBqnG,YAAa/oG,EAAKoB,GAAG,kCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,yBACfyjC,KAAM,UACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWlB,OAC7B,sBAAuBlrG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMisG,WAAWlB,OAASlqG,GACrFS,KAAM,WACN,gBAAiB,GACjBqnG,YAAa/oG,EAAKoB,GAAG,gCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,0BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWS,SAC7B,sBAAuB7sG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMisG,WAAWS,SAAW7rG,GACvF8nG,YAAa/oG,EAAKoB,GAAG,qCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAY,KAAiC,OAA1BtE,EAAMisG,WAAW3qG,OAAiB,WAAc,QAAoB,KAAW,CACvGb,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACfyjC,KAAM,YACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWf,SAC7B,sBAAuBrrG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMisG,WAAWf,SAAWrqG,GACvF8nG,YAAa/oG,EAAKoB,GAAG,kCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,wBAA0B,IAAK,IAAI,QAAa6C,EAAuB,CACtIM,QAASvE,EAAKoB,GAAG,0BACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWU,UAC7B,sBAAuB9sG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMisG,WAAWU,UAAY9rG,GACxF8nG,YAAa/oG,EAAKoB,GAAG,mCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,KACD,QAAailG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,wBACfyjC,KAAM,cACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWhB,WAC7B,sBAAuBprG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWhB,WAAapqG,GAC3F8nG,YAAa/oG,EAAKoB,GAAG,oCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,0BACfyjC,KAAM,UACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWW,OAC7B,sBAAuB/sG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWW,OAAS/rG,GACvF8nG,YAAa/oG,EAAKoB,GAAG,sCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,yBACfyjC,KAAM,eACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWY,YAC7B,sBAAuBhtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWY,YAAchsG,GAC5FS,KAAM,WACN,gBAAiB,GACjBqnG,YAAa/oG,EAAKoB,GAAG,qCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACfyjC,KAAM,mBACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWa,gBAC7B,sBAAuBjtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWa,gBAAkBjsG,GAChGS,KAAM,WACN,gBAAiB,GACjBqnG,YAAa/oG,EAAKoB,GAAG,yCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,wBAA0B,IAAK,IAAI,QAAa6C,EAAuB,CACtIM,QAASvE,EAAKoB,GAAG,0BACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMisG,WAAWc,UAC7B,sBAAuBltG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWc,UAAYlsG,IACzF,KAAM,EAAG,CAAC,iBACbyD,EAAG,KACD,QAAailG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,yBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMisG,WAAWT,MAAMhwC,QACnC,sBAAuB37D,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWT,MAAMhwC,QAAU36D,IAC7F,KAAM,EAAG,CAAC,iBACbyD,EAAG,GACF,EAAG,CAAC,UAAWtE,EAAMisG,WAAWT,OAAOhwC,UAAW,WAAc,QAAoB,KAAW,CAChG/6D,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAMisG,WAAWT,MAAMwB,QACnC,sBAAuBntG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWT,MAAMwB,QAAUnsG,GAC9FkT,IAAK,GACLgxD,KAAM,EACN2oB,UAAW,GACV,KAAM,EAAG,CAAC,iBACbppF,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAMisG,WAAWT,MAAMyB,UACnC,sBAAuBptG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWT,MAAMyB,UAAYpsG,GAChGkT,IAAK,GACLD,IAAK,IACLixD,KAAM,GACL,KAAM,EAAG,CAAC,iBACbzgE,EAAG,GACF,EAAG,CAAC,WAAY,MAAO,QAAoB,IAAI,IAAQ,KAAiC,YAA1BtE,EAAMisG,WAAW3qG,OAAsB,WAAc,QAAoB,KAAW,CACnJb,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACfyjC,KAAM,YACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWnB,SAC7B,sBAAuBjrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWnB,SAAWjqG,GACzFS,KAAM,WACN,gBAAiB,GACjBqnG,YAAa/oG,EAAKoB,GAAG,kCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,4BACfyjC,KAAM,aACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWd,UAC7B,sBAAuBtrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWd,UAAYtqG,GAC1FS,KAAM,WACN,gBAAiB,GACjBqnG,YAAa/oG,EAAKoB,GAAG,mCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,0BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWS,SAC7B,sBAAuB7sG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWS,SAAW7rG,GACzF8nG,YAAa/oG,EAAKoB,GAAG,qCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,0BAA4B,IAAK,IAAI,QAAa6C,EAAuB,CACxIM,QAASvE,EAAKoB,GAAG,sBACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMisG,WAAWb,QAC7B,sBAAuBvrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWb,QAAUvqG,IACvF,KAAM,EAAG,CAAC,iBACbyD,EAAG,KACD,QAAoB,MAAO,GAAa,EAAC,QAAapE,EAA8B,CACtFa,KAAM,uBACNV,MAAO,CACL,eAAgB,UAEhB,QAAiB,KAAM,QAAiBT,EAAKoB,GAAG,6BAA8B,MAAO,KAAiC,gBAA1BhB,EAAMisG,WAAW3qG,OAA0B,WAAc,QAAoB,KAAW,CACtLb,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,sBACfyjC,KAAM,QACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWZ,KAC7B,sBAAuBxrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWZ,KAAOxqG,GACrF8nG,YAAa/oG,EAAKoB,GAAG,kCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,yBACfyjC,KAAM,SACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWiB,MAC7B,sBAAuBrtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWiB,MAAQrsG,GACtFS,KAAM,WACN,gBAAiB,GACjBqnG,YAAa/oG,EAAKoB,GAAG,qCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,0BAA4B,IAAK,IAAI,QAAa6C,EAAuB,CACxIM,QAASvE,EAAKoB,GAAG,4BACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMisG,WAAWX,UAC7B,sBAAuBzrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWX,UAAYzqG,IACzF,KAAM,EAAG,CAAC,iBACbyD,EAAG,KACA,KAAiC,WAA1BtE,EAAMisG,WAAW3qG,OAAqB,WAAc,QAAoB,KAAW,CAC7Fb,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACfyjC,KAAM,WACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWV,QAC7B,sBAAuB1rG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWV,QAAU1qG,GACxF8nG,YAAa/oG,EAAKoB,GAAG,uCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWkB,SAC7B,sBAAuBttG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWkB,SAAWtsG,GACzF8nG,YAAa/oG,EAAKoB,GAAG,wCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWmB,SAC7B,sBAAuBvtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWmB,SAAWvsG,GACzFS,KAAM,WACN,gBAAiB,GACjBqnG,YAAa/oG,EAAKoB,GAAG,wCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,wBAA0B,IAAK,IAAI,QAAa6C,EAAuB,CACtIM,QAASvE,EAAKoB,GAAG,gCACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWjB,UAC7B,sBAAuBnrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWjB,UAAYnqG,GAC1F8nG,YAAa/oG,EAAKoB,GAAG,yCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,KACD,QAAailG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,4BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMisG,WAAWoB,YAC7B,sBAAuBxtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWoB,YAAcxsG,GAC5FS,KAAM,WACNgsG,SAAU,CACRC,QAAS,GAEX5E,YAAa/oG,EAAKoB,GAAG,uCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,oCAAsC,IAAK,IAAI,QAAa6C,EAAuB,CAClJM,QAASvE,EAAKoB,GAAG,sCACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMisG,WAAWuB,gBAC7B,sBAAuB3tG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWuB,gBAAkB3sG,IAC/F,KAAM,EAAG,CAAC,iBACbyD,EAAG,KACD,QAAailG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,yBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMisG,WAAWT,MAAMhwC,QACnC,sBAAuB37D,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWT,MAAMhwC,QAAU36D,IAC7F,KAAM,EAAG,CAAC,iBACbyD,EAAG,GACF,EAAG,CAAC,UAAWtE,EAAMisG,WAAWT,OAAOhwC,UAAW,WAAc,QAAoB,KAAW,CAChG/6D,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAMisG,WAAWT,MAAMwB,QACnC,sBAAuBntG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWT,MAAMwB,QAAUnsG,GAC9FkT,IAAK,GACLgxD,KAAM,EACN2oB,UAAW,GACV,KAAM,EAAG,CAAC,iBACbppF,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAMisG,WAAWT,MAAMyB,UACnC,sBAAuBptG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMisG,WAAWT,MAAMyB,UAAYpsG,GAChGkT,IAAK,GACLD,IAAK,IACLixD,KAAM,GACL,KAAM,EAAG,CAAC,iBACbzgE,EAAG,GACF,EAAG,CAAC,WAAY,MAAO,QAAoB,IAAI,IAAQ,MAAO,QAAoB,IAAI,IAAQ,OACjGA,EAAG,GACF,EAAG,CAAC,QAAS,YAChBA,EAAG,GACF,EAAG,CAAC,aAAc,QAAS,cAAc,QAAa6J,EAAsB,CAC7ErG,WAAY9H,EAAMytG,iBAClB,sBAAuB5tG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMytG,iBAAmB5sG,GACtF2O,MAAO5P,EAAKoB,GAAG,8BAA+B,CAC5CI,KAAMpB,EAAM0tG,gBAAgBtsG,MAAQ,KAEtC5B,MAAO,iBACPusG,SAAU9rG,EAAS0tG,iBAClB,CACDvoB,QAAQ,QAAS,IAAM,EAAC,QAAar3E,EAAsB,CACzDnN,QAASf,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMytG,kBAAmB,IACvE,CACDjsG,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,uBAAwB,KAC3FsD,EAAG,KACD,QAAayJ,EAAsB,CACrCzM,KAAM,UACNV,QAASX,EAAS2tG,oBACjB,CACDpsG,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,sBAAuB,KAC1FsD,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAaooG,EAA4B,CAChEiE,OAAQ,EACRt0E,OAAQ,IACP,CACD/3B,SAAS,QAAS,IAAM,EAAC,QAAamoG,EAAiC,CACrEr6F,MAAO1P,EAAKoB,GAAG,gCACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBtsG,MAAO,KACxFkD,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,gCACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBvB,EAAS6tG,oBAAoB9tG,EAAM+tG,qBAAsB,KACpHzpG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,0BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa2nG,EAAmB,CACvD7nG,KAAMtB,EAAM0tG,gBAAgBlyC,QAAU,UAAY,QACjD,CACDh6D,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBlyC,QAAU57D,EAAKoB,GAAG,qBAAuBpB,EAAKoB,GAAG,uBAAwB,KAC1JsD,EAAG,GACF,EAAG,CAAC,WACPA,EAAG,GACF,EAAG,CAAC,UAAWtE,EAAM0tG,gBAAgBnD,QAAS,WAAc,QAAaZ,EAAiC,CAC3GlpG,IAAK,EACL6O,MAAO1P,EAAKoB,GAAG,2BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa2nG,EAAmB,CACvD7nG,KAAM,WACL,CACDE,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,0BAA2B,KAC9FsD,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,YAAa,QAAoB,IAAI,GAAoC,aAA7BtE,EAAM+tG,qBAAqC,WAAc,QAAoB,KAAW,CACzIttG,IAAK,GACJ,EAAC,QAAakpG,EAAiC,CAChDr6F,MAAO1P,EAAKoB,GAAG,4BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBvB,EAAS4qG,SAAS7qG,EAAM0tG,gBAAgB5C,SAAU,KAAM,KACnHxmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,0BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBvB,EAAS4qG,SAAS7qG,EAAM0tG,gBAAgB3C,OAAQ,IAAK,KAChHzmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,0BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBhB,UAAY9sG,EAAKoB,GAAG,qBAAsB,KAC3HsD,EAAG,GACF,EAAG,CAAC,WAAY,KAAoC,SAA7BtE,EAAM+tG,qBAAiC,WAAc,QAAapE,EAAiC,CAC3HlpG,IAAK,EACL6O,MAAO1P,EAAKoB,GAAG,wBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD,cAAexpG,EAAM0tG,gBAAgB1C,WAAaprG,EAAKoB,GAAG,oBAC1DgtG,SAAU,IACT,KAAM,EAAG,CAAC,kBACb1pG,EAAG,GACF,EAAG,CAAC,WAA0C,OAA7BtE,EAAM+tG,qBAA+B,WAAc,QAAoB,KAAW,CACpGttG,IAAK,GACJ,EAAC,QAAakpG,EAAiC,CAChDr6F,MAAO1P,EAAKoB,GAAG,4BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD,cAAexpG,EAAM0tG,gBAAgBxC,SACrC8C,SAAU,IACT,KAAM,EAAG,CAAC,kBACb1pG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,wBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD,cAAexpG,EAAM0tG,gBAAgBf,WAAa/sG,EAAKoB,GAAG,oBAC1DgtG,SAAU,IACT,KAAM,EAAG,CAAC,kBACb1pG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,yBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBzC,YAAa,KAC9F3mG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,2BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBd,QAAS,KAC1FtoG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,wBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBX,UAAYntG,EAAKoB,GAAG,yBAA2BpB,EAAKoB,GAAG,6BAA8B,KACtKsD,EAAG,GACF,EAAG,CAAC,WAAY,KAAoC,YAA7BtE,EAAM+tG,qBAAoC,WAAc,QAAoB,KAAW,CAC/GttG,IAAK,GACJ,EAAC,QAAakpG,EAAiC,CAChDr6F,MAAO1P,EAAKoB,GAAG,4BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBvB,EAAS4qG,SAAS7qG,EAAM0tG,gBAAgB5C,SAAU,KAAM,KACnHxmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBvB,EAAS4qG,SAAS7qG,EAAM0tG,gBAAgBvC,UAAW,IAAK,KACnH7mG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,0BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBhB,UAAY9sG,EAAKoB,GAAG,qBAAsB,KAC3HsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,0BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBtC,QAAUxrG,EAAKoB,GAAG,yBAA2BpB,EAAKoB,GAAG,6BAA8B,KACpKsD,EAAG,GACF,EAAG,CAAC,WAAY,KAAoC,gBAA7BtE,EAAM+tG,qBAAwC,WAAc,QAAoB,KAAW,CACnHttG,IAAK,GACJ,EAAC,QAAakpG,EAAiC,CAChDr6F,MAAO1P,EAAKoB,GAAG,uBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBrC,MAAO,KACxF/mG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,0BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBpC,UAAY1rG,EAAKoB,GAAG,yBAA2BpB,EAAKoB,GAAG,6BAA8B,KACtKsD,EAAG,GACF,EAAG,CAAC,WAAY,KAAoC,WAA7BtE,EAAM+tG,qBAAmC,WAAc,QAAoB,KAAW,CAC9GttG,IAAK,GACJ,EAAC,QAAakpG,EAAiC,CAChDr6F,MAAO1P,EAAKoB,GAAG,4BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD,cAAexpG,EAAM0tG,gBAAgBnC,QACrCyC,SAAU,IACT,KAAM,EAAG,CAAC,kBACb1pG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,wBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD,cAAexpG,EAAM0tG,gBAAgB1C,WAAaprG,EAAKoB,GAAG,oBAC1DgtG,SAAU,IACT,KAAM,EAAG,CAAC,kBACb1pG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBP,UAAYvtG,EAAKoB,GAAG,qBAAsB,KAC3HsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,4BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD,cAAevpG,EAASguG,cAAcjuG,EAAM0tG,gBAAgB/N,SAC5Dr+F,KAAM,WACNgsG,SAAU,CACRC,QAAS,GAEXS,SAAU,IACT,KAAM,EAAG,CAAC,kBACb1pG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,oCACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,SAA2D,IAA1CxB,EAAM0tG,gBAAgBF,gBAA4B5tG,EAAKoB,GAAG,yBAA2BpB,EAAKoB,GAAG,6BAA8B,KACtLsD,EAAG,GACF,EAAG,CAAC,WAAY,MAAO,QAAoB,IAAI,GAAOtE,EAAM0tG,gBAAgBlC,OAAOhwC,UAAW,WAAc,QAAoB,KAAW,CAC5I/6D,IAAK,GACJ,EAAC,QAAakpG,EAAiC,CAChDr6F,MAAO1P,EAAKoB,GAAG,yBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBlC,OAAOwB,SAAW,MAAO,KAC1G1oG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,CAC9Dr6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBxB,EAAM0tG,gBAAgBlC,OAAOyB,WAAa,IAAK,KAC1G3oG,EAAG,GACF,EAAG,CAAC,WAAW,QAAaqlG,EAAiC,KAAM,CACpEr6F,OAAO,QAAS,IAAM,EAAC,QAAoB,OAAQ,GAAa,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,2BAA6B,IAAK,IAAI,QAAa+M,EAAsB,CAClLmgG,KAAM,GACN5sG,KAAM,UACNV,QAASX,EAASkuG,aAClB3uG,MAAO,eACN,CACDgC,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,WACNvB,OAAO,QAAgB,CACrB,UAAWQ,EAAMouG,gBAElB,KAAM,EAAG,CAAC,YACb9pG,EAAG,GACF,EAAG,CAAC,gBACP9C,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAa8M,EAAwB,CACrG8C,WAAYnR,EAASwrG,mBAAmBzrG,EAAM0tG,gBAC9C78F,OAAQ5Q,EAASyrG,eAAe1rG,EAAM0tG,gBACtC,eAAgB,GAChB,eAAe,EACfp2E,OAAQ,IAAMr3B,EAAS0rG,aAAa3rG,EAAM0tG,iBACzC,KAAM,EAAG,CAAC,aAAc,SAAU,YAAY,QAAoB,MAAO,CAC1EluG,OAAO,QAAgB,CAAC,aAAc,CACpC,gBAAiBS,EAASouG,gBAAgBruG,EAAM0tG,qBAEjD,QAAiBztG,EAASquG,mBAAmBtuG,EAAM0tG,iBAAkB,OACxEppG,EAAG,KACA,MAAO,QAAoB,IAAI,KACpCA,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,aAAc,QAAS,cAAc,QAAa6J,EAAsB,CAC7ErG,WAAY9H,EAAMuuG,eAClB,sBAAuB1uG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMuuG,eAAiB1tG,GACpF2O,MAAO5P,EAAKoB,GAAG,4BAA6B,CAC1CI,KAAMpB,EAAMwuG,aAAaptG,MAAQ,KAEnC5B,MAAO,iBACP,mBAAoB,GACpBusG,SAAU9rG,EAASwuG,eAClB,CACDrpB,QAAQ,QAAS,IAAM,EAAC,QAAar3E,EAAsB,CACzDnN,QAASf,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMuuG,gBAAiB,IACrE,CACD/sG,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,qBAAsB,KACzFsD,EAAG,KACD,QAAayJ,EAAsB,CACrCzM,KAAM,UACNV,QAASX,EAASyuG,oBACjB,CACDltG,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,0BAA2B,KAC9FsD,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAakoG,EAAoB,CACxDyC,MAAOnsG,EAAMwuG,YACb,iBAAkB,MAClBpuG,IAAK,WACLgsG,MAAOnsG,EAAS0uG,WACf,CACDntG,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7D9kE,KAAM,QACL,CACDn1B,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,+BAAiC,IAAK,IAAI,QAAa6C,EAAuB,CAC7IM,QAASvE,EAAKoB,GAAG,wCACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,uBACNvB,MAAO,0BAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYptG,KAC9B,sBAAuBvB,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYptG,KAAOP,GACtFoD,SAAU,IACT,KAAM,EAAG,CAAC,iBACbK,EAAG,KACD,QAAailG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,4BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMwuG,YAAYhzC,QAC9B,sBAAuB37D,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYhzC,QAAU36D,IACxF,KAAM,EAAG,CAAC,iBACbyD,EAAG,GACF,EAAG,CAAC,UAAwC,aAA7BtE,EAAM+tG,qBAAqC,WAAc,QAAoB,KAAW,CACxGttG,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACfyjC,KAAM,YACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAY1D,SAC9B,sBAAuBjrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAY1D,SAAWjqG,GAC1FoD,SAAUjE,EAAMwuG,YAAYjE,MAC5BjpG,KAAM,WACN,gBAAiB,IAChB,KAAM,EAAG,CAAC,aAAc,eAC3BgD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,yBACfyjC,KAAM,UACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYzD,OAC9B,sBAAuBlrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYzD,OAASlqG,GACxFoD,SAAUjE,EAAMwuG,YAAYjE,MAC5BjpG,KAAM,WACN,gBAAiB,IAChB,KAAM,EAAG,CAAC,aAAc,eAC3BgD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,0BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAY9B,SAC9B,sBAAuB7sG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAY9B,SAAW7rG,GAC1F8nG,YAAa/oG,EAAKoB,GAAG,qCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAY,KAAoC,SAA7BtE,EAAM+tG,qBAAiC,WAAc,QAAoB,KAAW,CAC5GttG,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,wBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYxD,UAC9B,sBAAuBnrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYxD,UAAYnqG,IAC1F,KAAM,EAAG,CAAC,iBACbyD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,yBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMwuG,YAAYhD,MAAMhwC,QACpC,sBAAuB37D,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYhD,MAAMhwC,QAAU36D,GAC/FyE,SAAUzF,EAAO,MAAQA,EAAO,IAAMslB,GAAOllB,EAAS2uG,qBAAqBzpF,EAAKnlB,EAAMwuG,eACrF,KAAM,EAAG,CAAC,iBACblqG,EAAG,GACF,EAAG,CAAC,UAAWtE,EAAMwuG,YAAYhD,OAAOhwC,UAAW,WAAc,QAAoB,KAAW,CACjG/6D,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAMwuG,YAAYhD,MAAMwB,QACpC,sBAAuBntG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYhD,MAAMwB,QAAUnsG,GAC/FkT,IAAK,GACLgxD,KAAM,EACN2oB,UAAW,GACV,KAAM,EAAG,CAAC,iBACbppF,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAMwuG,YAAYhD,MAAMyB,UACpC,sBAAuBptG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYhD,MAAMyB,UAAYpsG,GACjGkT,IAAK,GACLD,IAAK,IACLixD,KAAM,GACL,KAAM,EAAG,CAAC,iBACbzgE,EAAG,GACF,EAAG,CAAC,WAAY,MAAO,QAAoB,IAAI,IAAQ,KAAoC,OAA7BtE,EAAM+tG,qBAA+B,WAAc,QAAoB,KAAW,CACjJttG,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACfyjC,KAAM,YACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYtD,SAC9B,sBAAuBrrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYtD,SAAWrqG,GAC1FoD,SAAUjE,EAAMwuG,YAAYjE,OAC3B,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,wBAA0B,IAAK,IAAI,QAAa6C,EAAuB,CACtIM,QAASvE,EAAKoB,GAAG,0BACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAY7B,UAC9B,sBAAuB9sG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAY7B,UAAY9rG,GAC3F8nG,YAAa/oG,EAAKoB,GAAG,mCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,KACD,QAAailG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,wBACfyjC,KAAM,cACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYvD,WAC9B,sBAAuBprG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYvD,WAAapqG,GAC5FoD,SAAUjE,EAAMwuG,YAAYjE,OAC3B,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,0BACfyjC,KAAM,UACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAY5B,OAC9B,sBAAuB/sG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAY5B,OAAS/rG,GACxFoD,SAAUjE,EAAMwuG,YAAYjE,OAC3B,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,yBACfyjC,KAAM,eACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAY3B,YAC9B,sBAAuBhtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAY3B,YAAchsG,GAC7FoD,SAAUjE,EAAMwuG,YAAYjE,MAC5BjpG,KAAM,WACN,gBAAiB,IAChB,KAAM,EAAG,CAAC,aAAc,eAC3BgD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACfyjC,KAAM,mBACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAY1B,gBAC9B,sBAAuBjtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAY1B,gBAAkBjsG,GACjGoD,SAAUjE,EAAMwuG,YAAYjE,MAC5BjpG,KAAM,WACN,gBAAiB,IAChB,KAAM,EAAG,CAAC,aAAc,eAC3BgD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,wBAA0B,IAAK,IAAI,QAAa6C,EAAuB,CACtIM,QAASvE,EAAKoB,GAAG,0BACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMwuG,YAAYzB,UAC9B,sBAAuBltG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYzB,UAAYlsG,GAC3FoD,SAAUjE,EAAMwuG,YAAYjE,OAC3B,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,KACD,QAAailG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,yBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMwuG,YAAYhD,MAAMhwC,QACpC,sBAAuB37D,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYhD,MAAMhwC,QAAU36D,GAC/FyE,SAAUzF,EAAO,MAAQA,EAAO,IAAMslB,GAAOllB,EAAS2uG,qBAAqBzpF,EAAKnlB,EAAMwuG,eACrF,KAAM,EAAG,CAAC,iBACblqG,EAAG,GACF,EAAG,CAAC,UAAWtE,EAAMwuG,YAAYhD,OAAOhwC,UAAW,WAAc,QAAoB,KAAW,CACjG/6D,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAMwuG,YAAYhD,MAAMwB,QACpC,sBAAuBntG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYhD,MAAMwB,QAAUnsG,GAC/FkT,IAAK,GACLgxD,KAAM,EACN2oB,UAAW,GACV,KAAM,EAAG,CAAC,iBACbppF,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAMwuG,YAAYhD,MAAMyB,UACpC,sBAAuBptG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYhD,MAAMyB,UAAYpsG,GACjGkT,IAAK,GACLD,IAAK,IACLixD,KAAM,GACL,KAAM,EAAG,CAAC,iBACbzgE,EAAG,GACF,EAAG,CAAC,WAAY,MAAO,QAAoB,IAAI,IAAQ,KAAoC,YAA7BtE,EAAM+tG,qBAAoC,WAAc,QAAoB,KAAW,CACtJttG,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACfyjC,KAAM,YACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAY1D,SAC9B,sBAAuBjrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAY1D,SAAWjqG,GAC1FoD,SAAUjE,EAAMwuG,YAAYjE,MAC5BjpG,KAAM,WACN,gBAAiB,IAChB,KAAM,EAAG,CAAC,aAAc,eAC3BgD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,4BACfyjC,KAAM,aACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYrD,UAC9B,sBAAuBtrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYrD,UAAYtqG,GAC3FoD,SAAUjE,EAAMwuG,YAAYjE,MAC5BjpG,KAAM,WACN,gBAAiB,IAChB,KAAM,EAAG,CAAC,aAAc,eAC3BgD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,0BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAY9B,SAC9B,sBAAuB7sG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAY9B,SAAW7rG,GAC1F8nG,YAAa/oG,EAAKoB,GAAG,qCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,0BAA4B,IAAK,IAAI,QAAa6C,EAAuB,CACxIM,QAASvE,EAAKoB,GAAG,sBACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMwuG,YAAYpD,QAC9B,sBAAuBvrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYpD,QAAUvqG,IACxF,KAAM,EAAG,CAAC,iBACbyD,EAAG,KACA,KAAoC,gBAA7BtE,EAAM+tG,qBAAwC,WAAc,QAAoB,KAAW,CACrGttG,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,sBACfyjC,KAAM,QACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYnD,KAC9B,sBAAuBxrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYnD,KAAOxqG,GACtFoD,SAAUjE,EAAMwuG,YAAYjE,OAC3B,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,yBACfyjC,KAAM,SACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYtB,MAC9B,sBAAuBrtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYtB,MAAQrsG,GACvFoD,SAAUjE,EAAMwuG,YAAYjE,MAC5BjpG,KAAM,WACN,gBAAiB,IAChB,KAAM,EAAG,CAAC,aAAc,eAC3BgD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,0BAA4B,IAAK,IAAI,QAAa6C,EAAuB,CACxIM,QAASvE,EAAKoB,GAAG,4BACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMwuG,YAAYlD,UAC9B,sBAAuBzrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYlD,UAAYzqG,IAC1F,KAAM,EAAG,CAAC,iBACbyD,EAAG,KACA,KAAoC,WAA7BtE,EAAM+tG,qBAAmC,WAAc,QAAoB,KAAW,CAChGttG,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACfyjC,KAAM,WACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYjD,QAC9B,sBAAuB1rG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYjD,QAAU1qG,GACzFoD,SAAUjE,EAAMwuG,YAAYjE,OAC3B,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYrB,SAC9B,sBAAuBttG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYrB,SAAWtsG,GAC1FoD,SAAUjE,EAAMwuG,YAAYjE,OAC3B,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYpB,SAC9B,sBAAuBvtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYpB,SAAWvsG,GAC1FoD,SAAUjE,EAAMwuG,YAAYjE,MAC5BjpG,KAAM,WACN,gBAAiB,IAChB,KAAM,EAAG,CAAC,aAAc,eAC3BgD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,wBAA0B,IAAK,IAAI,QAAa6C,EAAuB,CACtIM,QAASvE,EAAKoB,GAAG,gCACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYxD,UAC9B,sBAAuBnrG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYxD,UAAYnqG,GAC3F8nG,YAAa/oG,EAAKoB,GAAG,yCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,KACD,QAAailG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,4BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMwuG,YAAYnB,YAC9B,sBAAuBxtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYnB,YAAcxsG,GAC7FS,KAAM,WACNgsG,SAAU,CACRC,QAAS,GAEX5E,YAAa/oG,EAAKoB,GAAG,uCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,oCAAsC,IAAK,IAAI,QAAa6C,EAAuB,CAClJM,QAASvE,EAAKoB,GAAG,sCACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNvB,MAAO,uBAET8E,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMwuG,YAAYhB,gBAC9B,sBAAuB3tG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYhB,gBAAkB3sG,IAChG,KAAM,EAAG,CAAC,iBACbyD,EAAG,KACD,QAAailG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,yBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMwuG,YAAYhD,MAAMhwC,QACpC,sBAAuB37D,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYhD,MAAMhwC,QAAU36D,GAC/FyE,SAAUzF,EAAO,MAAQA,EAAO,IAAMslB,GAAOllB,EAAS2uG,qBAAqBzpF,EAAKnlB,EAAMwuG,eACrF,KAAM,EAAG,CAAC,iBACblqG,EAAG,GACF,EAAG,CAAC,UAAWtE,EAAMwuG,YAAYhD,OAAOhwC,UAAW,WAAc,QAAoB,KAAW,CACjG/6D,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,2BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAMwuG,YAAYhD,MAAMwB,QACpC,sBAAuBntG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYhD,MAAMwB,QAAUnsG,GAC/FkT,IAAK,GACLgxD,KAAM,EACN2oB,UAAW,GACV,KAAM,EAAG,CAAC,iBACbppF,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAMwuG,YAAYhD,MAAMyB,UACpC,sBAAuBptG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMwuG,YAAYhD,MAAMyB,UAAYpsG,GACjGkT,IAAK,GACLD,IAAK,IACLixD,KAAM,GACL,KAAM,EAAG,CAAC,iBACbzgE,EAAG,GACF,EAAG,CAAC,WAAY,MAAO,QAAoB,IAAI,IAAQ,MAAO,QAAoB,IAAI,KACzFA,EAAG,GACF,EAAG,CAAC,QAAS,YAChBA,EAAG,GACF,EAAG,CAAC,aAAc,QAAS,gBAAiB,CAAC,CAACkK,EAAoBxO,EAAMgS,UAC7E,CCr8CA,QACEoxF,WAAY,CACVsF,YAAW,KACXmG,aAAY,IAEd,IAAAntG,GACE,MAAO,CAELmoG,cAAe,GAEfiF,SAAU,CAAC,CACThoG,MAAO,WACPwI,MAAO,YACN,CACDxI,MAAO,OACPwI,MAAO,iBACN,CACDxI,MAAO,KACPwI,MAAO,MACN,CACDxI,MAAO,UACPwI,MAAO,WACN,CACDxI,MAAO,cACPwI,MAAO,eACN,CACDxI,MAAO,SACPwI,MAAO,WAGTi9F,gBAAiB,CAAC,CAChBzlG,MAAO,WACPwI,MAAO,YACN,CACDxI,MAAO,OACPwI,MAAO,iBACN,CACDxI,MAAO,KACPwI,MAAO,MACN,CACDxI,MAAO,UACPwI,MAAO,WACN,CACDxI,MAAO,cACPwI,MAAO,eACN,CACDxI,MAAO,SACPwI,MAAO,WAGTy/F,iBAAkB,CAChB1E,YAAa,CACX7uC,SAAS,GAEXszC,SAAU,IAEZE,aAAc,CACZF,SAAU,IAEZG,WAAY,CACV5E,YAAa,CACX7uC,SAAS,GAEXszC,SAAU,IAEZI,gBAAiB,CACf7E,YAAa,CACX7uC,SAAS,GAEXszC,SAAU,IAEZK,oBAAqB,CACnB9E,YAAa,CACX7uC,SAAS,GAEXszC,SAAU,IAEZM,eAAgB,CACd/E,YAAa,CACX7uC,SAAS,GAEXszC,SAAU,IAGZ/E,eAAe,EACf0D,kBAAkB,EAClBc,gBAAgB,EAEhBR,mBAAoB,GACpBsB,qBAAsB,EACtB3B,eAAgB,KAChBc,YAAa,CAAC,EAEdvC,WAAY,CACV3qG,KAAM,GACNF,KAAM,GACNo6D,SAAS,EAETsvC,SAAU,GACVC,OAAQ,GACR2B,SAAU,GAEVxB,SAAU,GACVyB,UAAW,GACX1B,WAAY,GACZ2B,OAAQ,OACRC,YAAa,GACbC,gBAAiB,GACjBC,WAAW,EACXvB,MAAO,CACLhwC,SAAS,EACTwxC,QAAS,GACTC,UAAW,IAGb9B,UAAW,GACXC,SAAS,EAETC,KAAM,GACN6B,MAAO,GACP5B,WAAW,EAEXC,QAAS,GACT4B,SAAU,GACVC,SAAU,GACVpC,UAAW,GACXqC,YAAa,GACbG,iBAAiB,GAGnB8B,WAAY,CAAC,EACblB,cAAc,EAEdp8F,SAAS,EAEb,EACApQ,SAAU,CAER,aAAAkoG,GACE,MAAO,CAAC,CACNhjG,MAAO,GACPwI,MAAOtN,KAAKhB,GAAG,kBACXgB,KAAK8sG,SAASj4F,IAAI21F,IAAM,CAC5B1lG,MAAO0lG,EAAG1lG,MACVwI,MAAOk9F,EAAGl9F,MACVk5F,YAAagE,EAAG1lG,MAChB2hG,UAAWzmG,KAAKioG,oBAAoBuC,EAAG1lG,UAE3C,EAEA,gBAAAkjG,GACE,OAAKhoG,KAAK6nG,cAGH7nG,KAAK8sG,SAAS/lE,OAAOyjE,GAAMA,EAAG1lG,QAAU9E,KAAK6nG,eAF3C7nG,KAAK8sG,QAGhB,EACA,QAAAzC,GACE,MAAO,CACL/qG,KAAM,CAAC,CACL+2F,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,oCACjBg4D,QAAS,WAEX53D,KAAM,CAAC,CACLi3F,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,oCACjBg4D,QAAS,QACR,CACDu2C,QAAS,gCACT/9F,QAASxP,KAAKhB,GAAG,oCACjBg4D,QAAS,SAEX8xC,SAAU,CAAC,CACTzS,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,iCACjBg4D,QAAS,SAEX+xC,OAAQ,CAAC,CACP1S,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,+BACjBg4D,QAAS,SAEXmyC,UAAW,CAAC,CACV9S,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,kCACjBg4D,QAAS,SAEXkyC,SAAU,CAAC,CACT7S,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,iCACjBg4D,QAAS,SAEXiyC,WAAY,CAAC,CACX5S,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,mCACjBg4D,QAAS,SAEX4zC,OAAQ,CAAC,CACPvU,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,qCACjBg4D,QAAS,SAEX6zC,YAAa,CAAC,CACZxU,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,oCACjBg4D,QAAS,SAEX8zC,gBAAiB,CAAC,CAChBzU,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,wCACjBg4D,QAAS,SAEXqyC,KAAM,CAAC,CACLhT,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,iCACjBg4D,QAAS,SAEXk0C,MAAO,CAAC,CACN7U,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,oCACjBg4D,QAAS,SAEXuyC,QAAS,CAAC,CACRlT,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,sCACjBg4D,QAAS,SAGf,EACA,SAAA21C,GACE,MAAO,CACLvtG,KAAM,CAAC,CACLi3F,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,oCACjBg4D,QAAS,QACR,CACDu2C,QAAS,gCACT/9F,QAASxP,KAAKhB,GAAG,oCACjBg4D,QAAS,SAEX8xC,SAAU,CAAC,CACTzS,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,iCACjBg4D,QAAS,SAEX+xC,OAAQ,CAAC,CACP1S,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,+BACjBg4D,QAAS,SAEXmyC,UAAW,CAAC,CACV9S,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,kCACjBg4D,QAAS,SAEXkyC,SAAU,CAAC,CACT7S,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,iCACjBg4D,QAAS,SAEXiyC,WAAY,CAAC,CACX5S,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,mCACjBg4D,QAAS,SAEX4zC,OAAQ,CAAC,CACPvU,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,qCACjBg4D,QAAS,SAEX6zC,YAAa,CAAC,CACZxU,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,oCACjBg4D,QAAS,SAEX8zC,gBAAiB,CAAC,CAChBzU,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,wCACjBg4D,QAAS,SAEXqyC,KAAM,CAAC,CACLhT,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,iCACjBg4D,QAAS,SAEXk0C,MAAO,CAAC,CACN7U,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,oCACjBg4D,QAAS,SAEXuyC,QAAS,CAAC,CACRlT,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,sCACjBg4D,QAAS,SAGf,GAEF32D,QAAS,CAEP,mBAAAooG,CAAoBh8D,EAAO+5D,EAAa9nG,GACtC,MAAM8uG,EAAO/gE,EAAMghE,cACb7uE,EAAO4uE,EAAKnhE,wBACZ32B,EAAI+2B,EAAMH,QAAU1N,EAAKnQ,KACzB9H,EAAI8lB,EAAMF,QAAU3N,EAAKrK,IACzBm5E,EAAS,QAAQlH,KAAe9nG,IAChCivG,EAAS3tG,KAAKU,MAAMgtG,GACtBC,GAAUA,EAAO,KACnBA,EAAO,GAAGtvG,MAAMuoF,QAAU,IAC1B+mB,EAAO,GAAGtvG,MAAMowB,KAAO,GAAG/Y,MAC1Bi4F,EAAO,GAAGtvG,MAAMk2B,IAAM,GAAG5N,MAE7B,EACA,oBAAAgiF,CAAqBnC,EAAa9nG,GAChC,MAAMgvG,EAAS,QAAQlH,KAAe9nG,IAChCivG,EAAS3tG,KAAKU,MAAMgtG,GACtBC,GAAUA,EAAO,KACnBA,EAAO,GAAGtvG,MAAMuoF,QAAU,IAE9B,EACA,mBAAAqhB,CAAoB3oG,GAClB,MAAO,iBAAiBA,GAC1B,EAEA,mBAAAwsG,CAAoBxsG,GAClB,MAAMgP,EAAUtO,KAAK8sG,SAASnmD,KAAK9zC,GAAKA,EAAE/N,QAAUxF,GACpD,OAAOgP,EAAUA,EAAQhB,MAAQhO,CACnC,EAEA,cAAA4oG,CAAe5oG,GACb,OAAOU,KAAKooG,YAAY9oG,IAAOwtG,UAAY,EAC7C,EAEA,WAAA1E,CAAY9oG,GACV,MAAMuV,EAAM,CACV+4F,SAAU5tG,KAAK+sG,iBACfc,KAAM7tG,KAAKgtG,aACXc,GAAI9tG,KAAKitG,WACTc,QAAS/tG,KAAKktG,gBACdc,YAAahuG,KAAKmtG,oBAClBc,OAAQjuG,KAAKotG,gBAEf,OAAOv4F,EAAIvV,EACb,EAEA,cAAA6oG,CAAe7oG,GACb,MAAO,CAAC,WAAY,KAAM,UAAW,cAAe,UAAUi3B,SAASj3B,EACzE,EAEA,QAAAupG,CAASnxE,EAAMw2E,EAAa,GAC1B,OAAKx2E,EACDA,EAAKhxB,QAAuB,EAAbwnG,EAAuB,OACnCx2E,EAAK1T,MAAM,EAAGkqF,GAAc,OAASx2E,EAAK1T,OAAOkqF,GAFtCluG,KAAKhB,GAAG,mBAG5B,EACA,aAAAitG,CAActO,GACZ,OAAKA,GAA8B,kBAAZA,GAAwD,IAAhC3vF,OAAOC,KAAK0vF,GAASj3F,OAC3D1G,KAAKhB,GAAG,oBAEM,kBAAZ2+F,EACFA,EAEF7oE,KAAKC,UAAU4oE,EAAS,KAAM,EACvC,EACA,aAAAwQ,CAAcxQ,GACZ,OAAKA,EACkB,kBAAZA,EAA6BA,EACjC7oE,KAAKC,UAAU4oE,EAAS,KAAM,GAFhB,EAGvB,EACA,gBAAAyQ,CAAiB12E,GACf,IAAKA,IAASA,EAAKl0B,OAAQ,MAAO,CAAC,EACnC,IACE,MAAMokC,EAAS9S,KAAK+S,MAAMnQ,GAC1B,OAAKkQ,GAA4B,kBAAXA,GAAuB7hC,MAAM6O,QAAQgzB,GAClD,KAEFA,CACT,CAAE,MAAO2hC,GACP,OAAO,IACT,CACF,EAEA,gBAAAqgC,CAAiBtqG,EAAMZ,GACrBsB,KAAK+rG,mBAAqBzsG,EAC1BU,KAAKqtG,oBAAsB3uG,EAC3BsB,KAAK0rG,eAAiB1rG,KAAKkoG,eAAe5oG,GAAMZ,GAChDsB,KAAKyrG,kBAAmB,CAC1B,EAEA,cAAA5B,CAAevqG,EAAMZ,GACnBsB,KAAK+rG,mBAAqBzsG,EAC1BU,KAAKqtG,oBAAsB3uG,EAC3B,MAAM4P,EAAUtO,KAAKkoG,eAAe5oG,GAAMZ,GAC1CsB,KAAKwsG,YAAc13E,KAAK+S,MAAM/S,KAAKC,UAAUzmB,IAChC,WAAThP,IACFU,KAAKwsG,YAAYnB,YAAcrrG,KAAKmuG,cAAcnuG,KAAKwsG,YAAY7O,SACnE39F,KAAKwsG,YAAYhB,iBAAuD,IAArCxrG,KAAKwsG,YAAYhB,iBAGjDxrG,KAAKwsG,YAAYhD,QACpBxpG,KAAKwsG,YAAYhD,MAAQ,CACvBhwC,SAAS,EACTwxC,QAAS,GACTC,UAAW,KAGfjrG,KAAKusG,gBAAiB,CACxB,EAEA,kBAAAX,GACE5rG,KAAKyrG,kBAAmB,EACxBzrG,KAAK6pG,eAAe7pG,KAAK+rG,mBAAoB/rG,KAAKqtG,oBACpD,EAEA,YAAArD,GACEhqG,KAAKiqG,WAAa,CAChB3qG,KAAM,GACNF,KAAM,GACNo6D,SAAS,EACTsvC,SAAU,GACVC,OAAQ,GACR2B,SAAU,GACVxB,SAAU,GACVD,WAAY,GACZ2B,OAAQ,OACRC,YAAa,GACbC,gBAAiB,GACjBC,WAAW,EACXvB,MAAO,CACLhwC,SAAS,EACTwxC,QAAS,GACTC,UAAW,IAEb9B,UAAW,GACXC,SAAS,EACTC,KAAM,GACN6B,MAAO,GACP5B,WAAW,EACXC,QAAS,GACT4B,SAAU,GACVC,SAAU,GACVpC,UAAW,GACXqC,YAAa,GACbG,iBAAiB,EAErB,EAEA,eAAAG,GACE3rG,KAAK0rG,eAAiB,IACxB,EAEA,aAAAe,GACEzsG,KAAKwsG,YAAc,CAAC,CACtB,EAEA,mBAAAlC,GAEE,MAAM,KACJhrG,EAAI,KACJF,GACEY,KAAKiqG,WACTjqG,KAAKiqG,WAAa,CAChB3qG,OACAF,OACAo6D,SAAS,EACTsvC,SAAU,GACVC,OAAQ,GACR2B,SAAU,GACVxB,SAAU,GACVyB,UAAW,GACX1B,WAAY,GACZ2B,OAAQ,OACRC,YAAa,GACbC,gBAAiB,GACjBC,WAAW,EACXvB,MAAO,CACLhwC,SAAS,EACTwxC,QAAS,GACTC,UAAW,IAEb9B,UAAW,GACXC,SAAS,EACTC,KAAM,GACN6B,MAAO,GACP5B,WAAW,EACXC,QAAS,GACT4B,SAAU,GACVC,SAAU,GACVpC,UAAW,GACXqC,YAAa,GACbG,iBAAiB,EAErB,EAEA,iBAAAtB,GACElqG,KAAKU,MAAM2tG,QAAQC,SAAS/rF,IAC1B,IAAKA,EAAO,OACZ,MAAM,KACJjjB,EAAI,KACJF,GACEY,KAAKiqG,WACHjL,EAAWh/F,KAAKooG,YAAY9oG,GAG5BivG,EAAgB,CAAC,eAAgB,SAAU,SAAU,cAAe,kBAAmB,cAC7F,GAAIA,EAAch4E,SAASn3B,GAEzB,YADAY,KAAK2kG,SAASC,QAAQ5kG,KAAKhB,GAAG,2BAKhC,MAAMwvG,EAAcxP,EAAS8N,SAAS7kC,KAAKuiC,GAAMA,EAAGprG,OAASA,GAC7D,GAAIovG,EAEF,YADAxuG,KAAK2kG,SAASC,QAAQ5kG,KAAKhB,GAAG,4BAGhC,IAAIyvG,EAAiB,CACnB19F,GAAIiuF,EAAS8N,SAASpmG,OAAS,EAC/BtH,KAAMY,KAAKiqG,WAAW7qG,KACtBE,KAAMA,EACNovG,SAAU,WACVl1C,SAAS,EACT+uC,OAAO,GAIT,GAAa,aAATjpG,EACF0O,OAAO8T,OAAO2sF,EAAgB,CAC5B3F,SAAU9oG,KAAKiqG,WAAWnB,SAC1BC,OAAQ/oG,KAAKiqG,WAAWlB,OACxB2B,SAAU1qG,KAAKiqG,WAAWS,gBAEvB,GAAa,OAATprG,EACT0O,OAAO8T,OAAO2sF,EAAgB,CAC5BvF,SAAUlpG,KAAKiqG,WAAWf,SAC1ByB,UAAW3qG,KAAKiqG,WAAWU,UAC3B1B,WAAYjpG,KAAKiqG,WAAWhB,WAC5B2B,OAAQ5qG,KAAKiqG,WAAWW,OACxBC,YAAa7qG,KAAKiqG,WAAWY,YAC7BC,gBAAiB9qG,KAAKiqG,WAAWa,gBACjCC,UAAW/qG,KAAKiqG,WAAWc,UAC3BvB,MAAO,IACFxpG,KAAKiqG,WAAWT,cAGlB,GAAa,YAATlqG,EACT0O,OAAO8T,OAAO2sF,EAAgB,CAC5B3F,SAAU9oG,KAAKiqG,WAAWnB,SAC1BK,UAAWnpG,KAAKiqG,WAAWd,UAC3BuB,SAAU1qG,KAAKiqG,WAAWS,SAC1BtB,QAASppG,KAAKiqG,WAAWb,eAEtB,GAAa,gBAAT9pG,EACT0O,OAAO8T,OAAO2sF,EAAgB,CAC5BpF,KAAMrpG,KAAKiqG,WAAWZ,KACtB6B,MAAOlrG,KAAKiqG,WAAWiB,MACvB5B,UAAWtpG,KAAKiqG,WAAWX,iBAExB,GAAa,WAAThqG,EAAmB,CAC5B,MAAMq+F,EAAU39F,KAAKouG,iBAAiBpuG,KAAKiqG,WAAWoB,aACtD,GAAgB,OAAZ1N,EAEF,YADA39F,KAAK2kG,SAASC,QAAQ5kG,KAAKhB,GAAG,mCAGhCgP,OAAO8T,OAAO2sF,EAAgB,CAC5BlF,QAASvpG,KAAKiqG,WAAWV,QACzB4B,SAAUnrG,KAAKiqG,WAAWkB,SAC1BC,SAAUprG,KAAKiqG,WAAWmB,SAC1BpC,UAAWhpG,KAAKiqG,WAAWjB,UAC3BrL,UACA6N,iBAAqD,IAApCxrG,KAAKiqG,WAAWuB,gBACjChC,MAAO,IACFxpG,KAAKiqG,WAAWT,QAGzB,CACAxK,EAAS8N,SAAS9lF,KAAKynF,GACvBzuG,KAAK+nG,eAAgB,EAErB/nG,KAAKsoG,gBAET,EAEA,kBAAAoE,GACE1sG,KAAKU,MAAMiuG,SAASL,SAAS/rF,IAC3B,IAAKA,EAAO,OACZ,MAAMy8E,EAAWh/F,KAAKooG,YAAYpoG,KAAK+rG,oBACjC6C,EAAe5uG,KAAKqtG,oBACpBwB,EAAe7P,EAAS8N,SAAS8B,IAAexvG,MAAQY,KAAKwsG,YAAYptG,KACzE0vG,EAAgB,IACjB9uG,KAAKwsG,YACRptG,KAAMyvG,GAER,GAAgC,WAA5B7uG,KAAK+rG,mBAAiC,CACxC,MAAMpO,EAAU39F,KAAKouG,iBAAiBU,EAAczD,aACpD,GAAgB,OAAZ1N,EAEF,YADA39F,KAAK2kG,SAASC,QAAQ5kG,KAAKhB,GAAG,mCAGhC8vG,EAAcnR,QAAUA,EACxBmR,EAActD,iBAAoD,IAAlCsD,EAActD,uBACvCsD,EAAczD,WACvB,CACArM,EAAS8N,SAAS9sG,KAAKqtG,qBAAuByB,EAC9C9uG,KAAKusG,gBAAiB,EAEtBvsG,KAAKsoG,gBAET,EAEA,aAAAwB,CAAcxqG,EAAMZ,GAClB,MAAM4P,EAAUtO,KAAKkoG,eAAe5oG,GAAMZ,GACtC4P,EAAQi6F,MACVvoG,KAAK2kG,SAASC,QAAQ5kG,KAAKhB,GAAG,uCAGhCgB,KAAKmlG,SAASnlG,KAAKhB,GAAG,kCAAmCgB,KAAKhB,GAAG,kBAAmB,CAClFomG,kBAAmBplG,KAAKhB,GAAG,kBAC3BqmG,iBAAkBrlG,KAAKhB,GAAG,iBAC1BM,KAAM,YACLo4C,KAAK,KACN,MAAMsnD,EAAWh/F,KAAKooG,YAAY9oG,GAClC0/F,EAAS8N,SAASx/E,OAAO5uB,EAAO,GAEhCsgG,EAAS8N,SAAS//E,QAAQ,CAACvuB,EAAMgW,KAC/BhW,EAAKuS,GAAKyD,EAAI,IAGhBxU,KAAKsoG,iBACJyG,MAAM,OACX,EACA,YAAAzG,GAEE,MAAMtJ,EAAW,CACf4O,SAAU5tG,KAAK+sG,iBACfc,KAAM7tG,KAAKgtG,aACXc,GAAI9tG,KAAKitG,WACTc,QAAS/tG,KAAKktG,gBACdc,YAAahuG,KAAKmtG,oBAClBc,OAAQjuG,KAAKotG,iBAEf,EAAAzR,GAAA,GAAc,+BAAgC,CAC5C3uE,OAAQ,OACR2wE,QAAS,CACP,eAAgB,oBAElBxa,KAAMruD,KAAKC,UAAUiqE,KACpBtnD,KAAK,KACN13C,KAAK2kG,SAAS5I,QAAQ/7F,KAAKhB,GAAG,6BAElC,EAEA,kBAAMmtG,GACJnsG,KAAKosG,cAAe,EACpB,IAEE,MAAMhR,QAAiB,EAAAO,GAAA,GAAc,oBAAqB,CACxD3uE,OAAQ,SAEJttB,QAAa07F,EAASU,OAC5B,GAAIp8F,EAAKq8F,QACP/7F,KAAKstG,WAAa5tG,EAAKwO,cAAgB,CAAC,MACnC,CAEL,MAAM8gG,QAAoB,EAAArT,GAAA,GAAc,qBAClCsT,QAAgBD,EAAYlT,OAC9BmT,EAAQlT,UACV/7F,KAAKstG,WAAa2B,EAAQ3B,YAAc,CAAC,EAE7C,CACF,CAAE,MAAO/jC,GACPxmC,QAAQwmC,MAAM,iCAAkCA,EAClD,CAAE,QACAvpE,KAAKosG,cAAe,CACtB,CACF,EAEA,oBAAM8C,GACJ,IACE,MAAM9T,QAAiB,EAAAO,GAAA,GAAc,qBAC/Bj8F,QAAa07F,EAASU,OACxBp8F,EAAKq8F,UACP/7F,KAAKstG,WAAa5tG,EAAK4tG,YAAc,CAAC,EAE1C,CAAE,MAAO/jC,GACPxmC,QAAQwmC,MAAM,8BAA+BA,EAC/C,CACF,EAEA,gBAAA4lC,CAAiB7gG,GACf,MAAM0zF,EAAQhiG,KAAKstG,WAAWh/F,EAAQlP,MACtC,OAAK4iG,GACGA,EAAMoN,QAAU,GAAK,KADV,CAErB,EAEA,kBAAA3F,CAAmBn7F,GACjB,MAAM+gG,EAASrvG,KAAKmvG,iBAAiB7gG,GAC/B08F,EAAU18F,EAAQk7F,OAAOwB,SAAW,GACpC57F,EAAaigG,EAASrE,EAAU,IACtC,OAAO/7F,KAAK8C,IAAI,IAAK9C,KAAKC,MAAmB,GAAbE,GAAmB,GACrD,EAEA,cAAAs6F,CAAep7F,GACb,MAAMc,EAAapP,KAAKypG,mBAAmBn7F,GACrC28F,EAAY38F,EAAQk7F,OAAOyB,WAAa,GAC9C,OAAI77F,GAAc67F,EAAkB,YAChC77F,GAAc,GAAW,UACtB,SACT,EAEA,YAAAu6F,CAAar7F,GACX,MAAM+gG,EAASrvG,KAAKmvG,iBAAiB7gG,GAC/B08F,EAAU18F,EAAQk7F,OAAOwB,SAAW,GAC1C,MAAO,GAAGqE,EAAO/L,QAAQ,QAAQ0H,MACnC,EAEA,eAAAqB,CAAgB/9F,GACd,MAAMc,EAAapP,KAAKypG,mBAAmBn7F,GACrC28F,EAAY38F,EAAQk7F,OAAOyB,WAAa,GAC9C,OAAO77F,GAAc67F,CACvB,EAEA,kBAAAqB,CAAmBh+F,GACjB,MAAMc,EAAapP,KAAKypG,mBAAmBn7F,GACrC28F,EAAY38F,EAAQk7F,OAAOyB,WAAa,GAC9C,OAAI77F,GAAc67F,EACT,eAAeA,cAEpB77F,GAAc,GACT,gBAEF,QACT,EAEA,0BAAMw9F,CAAqBpzC,EAASlrD,GAClC,GAAIkrD,GAAWlrD,EAAQlP,KAAM,CAE3B,MAAM4iG,EAAQhiG,KAAKstG,WAAWh/F,EAAQlP,MACjC4iG,GAEHhiG,KAAKmlG,SAASnlG,KAAKhB,GAAG,8BAA+BgB,KAAKhB,GAAG,4BAA6B,CACxFomG,kBAAmBplG,KAAKhB,GAAG,iCAC3BqmG,iBAAkBrlG,KAAKhB,GAAG,gCAC1BM,KAAM,SACLo4C,KAAK43D,gBACAtvG,KAAKuvG,qBACVR,MAAM,KACP/uG,KAAK2kG,SAASxhE,KAAKnjC,KAAKhB,GAAG,8BAGjC,CACF,EAEA,sBAAMuwG,GACJvvG,KAAKosG,cAAe,EACpB,IACEpsG,KAAK2kG,SAASxhE,KAAKnjC,KAAKhB,GAAG,+BAC3B,MAAMo8F,QAAiB,EAAAO,GAAA,GAAc,oBAAqB,CACxD3uE,OAAQ,SAEJttB,QAAa07F,EAASU,OACxBp8F,EAAKq8F,SACP/7F,KAAKstG,WAAa5tG,EAAKwO,cAAgB,CAAC,EACxClO,KAAK2kG,SAAS5I,QAAQ/7F,KAAKhB,GAAG,qCAE9BgB,KAAK2kG,SAASp7B,MAAMvpE,KAAKhB,GAAG,kCAAoCU,EAAK6pE,OAAS,IAElF,CAAE,MAAOA,GACPxmC,QAAQwmC,MAAM,+BAAgCA,GAC9CvpE,KAAK2kG,SAASp7B,MAAMvpE,KAAKhB,GAAG,kCAC9B,CAAE,QACAgB,KAAKosG,cAAe,CACtB,CACF,GAEF,OAAA7qG,GACEvB,KAAKgQ,SAAU,GAEf,EAAA2rF,GAAA,GAAc,gCAAgCjkD,KAAK0jD,GAAYA,EAASU,QAAQpkD,KAAKh4C,IACnFM,KAAK+sG,iBAAmBrtG,EAAKkuG,SAEzBluG,EAAKmuG,MAAQnuG,EAAKmuG,KAAKf,WACzBptG,EAAKmuG,KAAKf,SAAWptG,EAAKmuG,KAAKf,SAASj4F,IAAIvG,IAAW,IAClDA,EACHk7F,MAAOl7F,EAAQk7F,OAAS,CACtBhwC,SAAS,EACTwxC,QAAS,GACTC,UAAW,QAIjBjrG,KAAKgtG,aAAettG,EAAKmuG,KAErBnuG,EAAKouG,IAAMpuG,EAAKouG,GAAGhB,WACrBptG,EAAKouG,GAAGhB,SAAWptG,EAAKouG,GAAGhB,SAASj4F,IAAIvG,IAAW,IAC9CA,EACHk7F,MAAOl7F,EAAQk7F,OAAS,CACtBhwC,SAAS,EACTwxC,QAAS,GACTC,UAAW,QAIjBjrG,KAAKitG,WAAavtG,EAAKouG,GAEnBpuG,EAAKquG,SAAWruG,EAAKquG,QAAQjB,WAC/BptG,EAAKquG,QAAQjB,SAAWptG,EAAKquG,QAAQjB,SAASj4F,IAAIvG,IAAW,IACxDA,EACHo8F,SAAUp8F,EAAQo8F,UAAY,OAGlC1qG,KAAKktG,gBAAkBxtG,EAAKquG,SAAW,CACrC1F,YAAa,CAAC,EACdyE,SAAU,IAGRptG,EAAKsuG,aAAetuG,EAAKsuG,YAAYlB,WACvCptG,EAAKsuG,YAAYlB,SAAWptG,EAAKsuG,YAAYlB,SAASj4F,IAAIvG,IAAW,IAChEA,EACHg7F,UAAWh7F,EAAQg7F,YAAa,MAGpCtpG,KAAKmtG,oBAAsBztG,EAAKsuG,aAAe,CAC7C3F,YAAa,CAAC,EACdyE,SAAU,IAGRptG,EAAKuuG,QAAUvuG,EAAKuuG,OAAOnB,WAC7BptG,EAAKuuG,OAAOnB,SAAWptG,EAAKuuG,OAAOnB,SAASj4F,IAAIvG,IAAW,IACtDA,EACH68F,SAAU78F,EAAQ68F,UAAY,GAC9BC,SAAU98F,EAAQ88F,UAAY,GAC9BpC,UAAW16F,EAAQ06F,WAAa,GAChCrL,QAASrvF,EAAQqvF,SAAW,CAAC,EAC7B6N,iBAA6C,IAA5Bl9F,EAAQk9F,gBACzBhC,MAAOl7F,EAAQk7F,OAAS,CACtBhwC,SAAS,EACTwxC,QAAS,GACTC,UAAW,QAIjBjrG,KAAKotG,eAAiB1tG,EAAKuuG,QAAU,CACnC5F,YAAa,CAAC,EACdyE,SAAU,IAGZ9sG,KAAKkvG,mBACJM,QAAQ,KACTxvG,KAAKgQ,SAAU,GAEnB,GCv1BF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,U,qBCRA,MAAM,GAAa,CACjBxS,MAAO,aAEF,SAAS,GAAOI,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACvD,OAAO,WAAc,QAAa,KAAa,CAC7CkB,KAAM,WACL,CACDI,SAAS,QAAS,IAAM,EAAC,SAAgB,QAAoB,MAAO,CAClEhC,OAAO,QAAgB,CAAC,oBAAqB,CAC3C,aAAcM,EAAOkS,WAEvBpR,QAASf,EAAO,KAAOA,EAAO,GAAK,IAAIqB,IAASjB,EAASwxG,aAAexxG,EAASwxG,eAAevwG,KAC/F,CAACpB,EAAOkS,UAAW,WAAc,QAAa9R,EAA8B,CAC7EO,IAAK,EACLM,KAAM,UACN2wG,KAAM,QACD,WAAc,QAAaxxG,EAA8B,CAC9DO,IAAK,EACLM,KAAM,WACH,QAAoB,OAAQ,IAAY,QAAiBjB,EAAOkS,QAAUpS,EAAKoB,GAAG,uBAAyBpB,EAAKoB,GAAG,sBAAuB,IAAK,GAAI,CAAC,CAAC,KAAQhB,EAAMk2B,aACxK5xB,EAAG,GAEP,CCxBA,QACElD,KAAM,qBACN4G,MAAO,CAAC,SACR3G,MAAO,CACL2Q,QAAS,CACP1Q,KAAMG,QACND,SAAS,GAEXw0B,KAAM,CACJ10B,KAAMG,QACND,SAAS,IAGb,IAAAE,GACE,MAAO,CACLw0B,SAAS,EAEb,EACAh0B,MAAO,CACL8zB,KAAM,CACJptB,WAAW,EACX,OAAAC,CAAQsc,GACFA,EAEFiL,WAAW,KACTpuB,KAAKk0B,SAAU,GACd,KAEHl0B,KAAKk0B,SAAU,CAEnB,IAGJ7zB,QAAS,CACP,WAAAovG,GACOzvG,KAAKgQ,SACRhQ,KAAKM,MAAM,QAEf,IC/BJ,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,U,sCCRA,MAAM,GAAa,CACjB9C,MAAO,qBAEH,GAAa,CACjBA,MAAO,kBAEH,GAAa,CACjBA,MAAO,eAEH,GAAa,CACjBA,MAAO,gBAEH,GAAa,CACjBa,MAAO,CACL,QAAW,OACX,IAAO,MACP,MAAS,SAGP,GAAa,CACjBb,MAAO,gBAEH,GAAa,CACjBa,MAAO,CACL,QAAW,OACX,IAAO,MACP,MAAS,SAGP,GAAa,CACjBb,MAAO,4BAEH,GAAa,CACjBA,MAAO,iBAEH,GAAc,CAClBA,MAAO,yBAEH,GAAc,CAClBA,MAAO,sBAEH,GAAc,CAClBA,MAAO,sBAEH,GAAc,CAClBA,MAAO,iBAEH,GAAc,CAClBA,MAAO,sBAEH,GAAc,CAClBA,MAAO,sBAEH,GAAc,CAClBA,MAAO,sBAEH,GAAc,CAClBA,MAAO,sBAEH,GAAc,CAClBA,MAAO,qCAEH,GAAc,CAClBA,MAAO,kBAEH,GAAc,CAClBA,MAAO,eAEH,GAAc,CAClBA,MAAO,gBAEH,GAAc,CAClBA,MAAO,gBAEH,GAAc,CAClBA,MAAO,oBAEH,GAAc,CAClBA,MAAO,oBAEH,GAAc,CAClBA,MAAO,kBAEH,GAAc,CAClBA,MAAO,eAEH,GAAc,CAClBA,MAAO,gBAEH,GAAc,CAClBA,MAAO,gBAEH,GAAc,CAClBA,MAAO,gBAEH,GAAc,CAClBA,MAAO,kBAEH,GAAc,CAClBA,MAAO,kBAEH,GAAc,CAClBa,MAAO,CACL,QAAW,OACX,IAAO,OACP,MAAS,SAGP,GAAc,CAClBb,MAAO,iBAEH,GAAc,CAClBa,MAAO,CACL,QAAW,OACX,IAAO,OACP,MAAS,SAGP,GAAc,CAClBb,MAAO,iBAEH,GAAc,CAClBA,MAAO,gBAEH,GAAc,CAClBa,MAAO,CACL,gBAAiB,OACjB,MAAS,YAGP,GAAc,CAClBb,MAAO,iBAEF,SAAS,GAAOI,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMupG,EAAsB,MACtBmI,EAAyB,MACzBpI,EAA0B,MAC1BG,EAAqB,MACrBxpG,GAA+B,QAAkB,qBACjD6N,EAAuB,KACvB6jG,EAA6B,MAC7BzI,EAAoB,KACpB0I,EAAsB,MACtBhuG,EAAwB,KACxBulG,EAAuB,MACvBC,EAAuB,MACvBC,EAAuB,MACvBG,EAA6B,MAC7BqI,EAAgC,GAChCC,EAA+B,MAC/B5jG,EAAuB,KACvBK,EAAqB,IAC3B,OAAO,UAAiB,WAAc,QAAoB,MAAO,GAAY,EAAC,QAAoB,MAAO,GAAY,EAAC,QAAoB,KAAM,IAAY,QAAiB5O,EAAKoB,GAAG,+BAAgC,IAAI,QAAoB,KAAM,IAAY,QAAiBpB,EAAKoB,GAAG,yBAA0B,IAAI,QAAa0oG,EAAoB,CACrVyC,MAAOnsG,EAAMgyG,aAAaC,KAC1B7F,MAAOnsG,EAASiyG,cAChB9xG,IAAK,eACL,cAAe,SACd,CACDoB,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,8BACfyjC,KAAM,YACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAO,GAAY,EAAC,QAAagoG,EAAqB,CACjG1hG,WAAY9H,EAAMgyG,aAAaC,KAAKE,SACpC,sBAAuBtyG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMgyG,aAAaC,KAAKE,SAAWtxG,GAC9FS,KAAM,WACN,gBAAiB,GACjB8wG,QAASnyG,EAASoyG,oBAClBC,aAAc,eACd3J,YAAa3oG,EAAMgyG,aAAaC,KAAKM,aAAe3yG,EAAKoB,GAAG,iCAAmC,GAC/FiD,SAAUjE,EAAMwyG,mBACf,KAAM,EAAG,CAAC,aAAc,UAAW,cAAe,aAAcxyG,EAAMgyG,aAAaC,KAAKM,eAAgB,WAAc,QAAaZ,EAAwB,CAC5JlxG,IAAK,EACLqH,WAAY9H,EAAMwyG,kBAClB,sBAAuB3yG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMwyG,kBAAoB3xG,GACrFyE,SAAUrF,EAASwyG,yBAClB,CACDjxG,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,8BAA+B,KAClGsD,EAAG,GACF,EAAG,CAAC,aAAc,eAAgB,QAAoB,IAAI,OAC7DA,EAAG,GACF,EAAG,CAAC,WAAW,QAAa,KAAa,CAC1ClD,KAAM,aACNm7B,KAAM,UACL,CACD/6B,SAAS,QAAS,IAAM,CAACxB,EAAM0yG,sBAAuB,WAAc,QAAanJ,EAAyB,CACxGj6F,MAAO1P,EAAKoB,GAAG,+BACfyjC,KAAM,yBACNhkC,IAAK,gBACJ,CACDe,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMgyG,aAAaC,KAAKU,uBACpC,sBAAuB9yG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMgyG,aAAaC,KAAKU,uBAAyB9xG,GAC5GS,KAAM,WACN,gBAAiB,GACjBgxG,aAAc,gBACb,KAAM,EAAG,CAAC,iBACbhuG,EAAG,GACF,EAAG,CAAC,YAAa,QAAoB,IAAI,KAC5CA,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,QAAS,WAAW,QAAoB,KAAM,IAAY,QAAiB1E,EAAKoB,GAAG,0BAA2B,IAAI,QAAa0oG,EAAoB,CACxJyC,MAAOnsG,EAAMgyG,aAAaY,MAC1BxG,MAAOnsG,EAAS4yG,eAChBzyG,IAAK,gBACL,cAAe,SACd,CACDoB,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,6BACfyjC,KAAM,iBACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMgyG,aAAaY,MAAME,cACrC,sBAAuBjzG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMgyG,aAAaY,MAAME,cAAgBjyG,GACpGyxG,aAAc,eACdruG,SAAUjE,EAAM+yG,oBACf,KAAM,EAAG,CAAC,aAAc,eAC3BzuG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACfyjC,KAAM,iBACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAO,GAAY,EAAC,QAAagoG,EAAqB,CACjG1hG,WAAY9H,EAAMgyG,aAAaY,MAAMI,cACrC,sBAAuBnzG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMgyG,aAAaY,MAAMI,cAAgBnyG,GACpGS,KAAM,WACN,gBAAiB,GACjB8wG,QAASnyG,EAASgzG,qBAClBX,aAAc,eACd3J,YAAa3oG,EAAMgyG,aAAaY,MAAML,aAAe3yG,EAAKoB,GAAG,iCAAmC,GAChGiD,SAAUjE,EAAM+yG,oBACf,KAAM,EAAG,CAAC,aAAc,UAAW,cAAe,aAAc/yG,EAAMgyG,aAAaY,MAAML,eAAgB,WAAc,QAAaZ,EAAwB,CAC7JlxG,IAAK,EACLqH,WAAY9H,EAAM+yG,mBAClB,sBAAuBlzG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAM+yG,mBAAqBlyG,GACtFyE,SAAUrF,EAASizG,0BAClB,CACD1xG,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,8BAA+B,KAClGsD,EAAG,GACF,EAAG,CAAC,aAAc,eAAgB,QAAoB,IAAI,OAC7DA,EAAG,GACF,EAAG,CAAC,WAAW,QAAa,KAAa,CAC1ClD,KAAM,aACNm7B,KAAM,UACL,CACD/6B,SAAS,QAAS,IAAM,CAACxB,EAAMmzG,uBAAwB,WAAc,QAAa5J,EAAyB,CACzGj6F,MAAO1P,EAAKoB,GAAG,+BACfyjC,KAAM,0BACNhkC,IAAK,iBACJ,CACDe,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMgyG,aAAaY,MAAMQ,wBACrC,sBAAuBvzG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMgyG,aAAaY,MAAMQ,wBAA0BvyG,GAC9GS,KAAM,WACN,gBAAiB,GACjBgxG,aAAc,gBACb,KAAM,EAAG,CAAC,iBACbhuG,EAAG,GACF,EAAG,CAAC,YAAa,QAAoB,IAAI,KAC5CA,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,QAAS,WAAW,QAAoB,KAAM,GAAY,EAAC,SAAiB,QAAiB1E,EAAKoB,GAAG,mCAAqC,IAAK,IAAI,QAAoB,IAAK,GAAY,EAAC,QAAa+M,EAAsB,CACjOzM,KAAM,UACN+N,KAAM,QACNzO,QAASf,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMqzG,uBAAwB,GAC3EnkG,OAAQ,IACP,CACD1N,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,WAERuD,EAAG,SACG,QAAoB,MAAO,GAAa,EAAC,UAAiB,WAAc,QAAautG,EAAqB,CAChHnwG,KAAM1B,EAAMszG,UACZ9zG,MAAO,eACN,CACDgC,SAAS,QAAS,IAAM,EAAC,QAAaowG,EAA4B,CAChEntE,KAAM,OACNn1B,MAAO1P,EAAKoB,GAAG,yBACf,eAAgB,UACf,CACDQ,SAAS,QAASw5B,GAAS,EAAC,QAAoB,MAAO,IAAa,QAAiBA,EAAM0mD,IAAItgF,MAAO,KACtGkD,EAAG,GACF,EAAG,CAAC,WAAW,QAAastG,EAA4B,CACzDntE,KAAM,QACNn1B,MAAO1P,EAAKoB,GAAG,0BACf,eAAgB,UACf,CACDQ,SAAS,QAASw5B,GAAS,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAoB,OAAQ,IAAa,QAAiBA,EAAM0mD,IAAIwrB,OAAQ,OACjJ5oG,EAAG,GACF,EAAG,CAAC,WAAW,QAAastG,EAA4B,CACzDntE,KAAM,cACNn1B,MAAO1P,EAAKoB,GAAG,2BACf,eAAgB,UACf,CACDQ,SAAS,QAASw5B,GAAS,EAAC,QAAoB,MAAO,GAAa,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYA,EAAM0mD,IAAI6xB,YAAaC,KACvJ,WAAc,QAAarK,EAAmB,CACnD1oG,IAAK+yG,EACLnkG,KAAM,QACN7P,MAAO,kBACN,CACDgC,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBvB,EAASwzG,kBAAkBD,IAAQ,KAC9FlvG,EAAG,GACF,QACD,UACJA,EAAG,GACF,EAAG,CAAC,WAAW,QAAastG,EAA4B,CACzDntE,KAAM,YACNn1B,MAAO1P,EAAKoB,GAAG,yBACf,eAAgB,UACf,CACDQ,SAAS,QAASw5B,GAAS,EAAC,QAAoB,MAAO,IAAa,QAAiB/6B,EAASyzG,WAAW14E,EAAM0mD,IAAIiyB,YAAa,KAChIrvG,EAAG,GACF,EAAG,CAAC,WAAW,QAAastG,EAA4B,CACzDtiG,MAAO1P,EAAKoB,GAAG,sBACf,eAAgB,SAChBiB,MAAO,MACN,CACDT,SAAS,QAASw5B,GAAS,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAamuE,EAAmB,CACnG7nG,KAA8D,WAAxDrB,EAAS2zG,eAAe54E,EAAM0mD,IAAImyB,WAAWhjG,OAAsB,UAAY,SACrFxB,KAAM,SACL,CACD7N,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiBvB,EAAS2zG,eAAe54E,EAAM0mD,IAAImyB,WAAWvkG,OAAQ,KAChHhL,EAAG,GACF,KAAM,CAAC,aACVA,EAAG,GACF,EAAG,CAAC,WAAW,QAAastG,EAA4B,CACzDtiG,MAAO1P,EAAKoB,GAAG,yBACf,eAAgB,UACf,CACDQ,SAAS,QAASw5B,GAAS,EAAC,QAAoB,MAAO,IAAa,QAAiB/6B,EAAS2zG,eAAe54E,EAAM0mD,IAAImyB,WAAWC,aAAc,KAChJxvG,EAAG,GACF,EAAG,CAAC,WAAW,QAAastG,EAA4B,CACzDtiG,MAAO1P,EAAKoB,GAAG,yBACfupG,MAAO,QACP,eAAgB,UACf,CACD/oG,SAAS,QAASw5B,GAAS,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAajtB,EAAsB,CACtGvO,MAAO,gBACP6P,KAAM,QACNzO,QAASC,GAAUZ,EAAS8zG,UAAU/4E,EAAM0mD,MAC3C,CACDlgF,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,wBAAyB,KAC5FsD,EAAG,GACF,EAAG,CAAC,aAAa,QAAayJ,EAAsB,CACrDvO,MAAO,gBACP6P,KAAM,QACN/N,KAAM,SACNV,QAASC,GAAUZ,EAAS+zG,YAAYh5E,EAAM0mD,IAAI3uE,KACjD,CACDvR,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,0BAA2B,KAC9FsD,EAAG,GACF,EAAG,CAAC,gBACPA,EAAG,GACF,EAAG,CAAC,YACPA,EAAG,GACF,EAAG,CAAC,UAAW,CAAC,CAACkK,EAAoBxO,EAAMi0G,qBAAqB,QAAoB,MAAO,GAAa,EAAC,QAAoB,KAAM,IAAa,QAAiBr0G,EAAKoB,GAAG,iCAAkC,IAAI,QAAoB,KAAM,GAAa,EAAC,SAAiB,QAAiBpB,EAAKoB,GAAG,4BAA8B,IAAK,IAAI,QAAa6C,EAAuB,CAC7WM,QAASvE,EAAKoB,GAAG,kCACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,eAAe,QAAaolG,EAAoB,CACrDyC,MAAOnsG,EAAMk0G,eAAeC,SAC5B,cAAe,SACd,CACD3yG,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMk0G,eAAeC,SAAS34C,QAC1C,sBAAuB37D,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMk0G,eAAeC,SAAS34C,QAAU36D,IAClG,KAAM,EAAG,CAAC,iBACbyD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,8BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa8nG,EAAsB,CAC1DxhG,WAAY9H,EAAMk0G,eAAeC,SAAS7jG,QAC1C,sBAAuBzQ,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMk0G,eAAeC,SAAS7jG,QAAUzP,GACnG8nG,YAAa/oG,EAAKoB,GAAG,yCACpB,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa6nG,EAAsB,CAC1D/5F,MAAO,sBACPxI,MAAO,yBACL,QAAauiG,EAAsB,CACrC/5F,MAAO,SACPxI,MAAO,aAETxC,EAAG,GACF,EAAG,CAAC,aAAc,kBACrBA,EAAG,GACF,EAAG,CAAC,UAAqD,wBAA1CtE,EAAMk0G,eAAeC,SAAS7jG,UAAqC,WAAc,QAAai5F,EAAyB,CACvI9oG,IAAK,EACL6O,MAAO1P,EAAKoB,GAAG,uBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMk0G,eAAeC,SAASC,sBAC1C,sBAAuBv0G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMk0G,eAAeC,SAASC,sBAAwBvzG,IAClH,KAAM,EAAG,CAAC,iBACbyD,EAAG,GACF,EAAG,CAAC,YAAa,QAAoB,IAAI,GAAiD,WAA1CtE,EAAMk0G,eAAeC,SAAS7jG,UAAwB,WAAc,QAAai5F,EAAyB,CAC3J9oG,IAAK,EACL6O,MAAO1P,EAAKoB,GAAG,wBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMk0G,eAAeC,SAASE,YAC1C,sBAAuBx0G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMk0G,eAAeC,SAASE,YAAcxzG,GACzG8nG,YAAa,8BACZ,KAAM,EAAG,CAAC,iBACbrkG,EAAG,GACF,EAAG,CAAC,YAAa,QAAoB,IAAI,KAC5CA,EAAG,GACF,EAAG,CAAC,WAAW,QAAoB,KAAM,GAAa,EAAC,SAAiB,QAAiB1E,EAAKoB,GAAG,wBAA0B,IAAK,IAAI,QAAa6C,EAAuB,CACzKM,QAASvE,EAAKoB,GAAG,8BACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,eAAe,QAAaolG,EAAoB,CACrDyC,MAAOnsG,EAAMk0G,eAAeI,QAC5B,cAAe,SACd,CACD9yG,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,8BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMk0G,eAAeI,QAAQ94C,QACzC,sBAAuB37D,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMk0G,eAAeI,QAAQ94C,QAAU36D,IACnG,KAAM,EAAG,CAAC,iBACbyD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,+BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa8nG,EAAsB,CAC1DxhG,WAAY9H,EAAMk0G,eAAeI,QAAQhkG,QACzC,sBAAuBzQ,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMk0G,eAAeI,QAAQhkG,QAAUzP,GACpG8nG,YAAa/oG,EAAKoB,GAAG,0CACpB,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa6nG,EAAsB,CAC1D/5F,MAAO1P,EAAKoB,GAAG,yBACf8F,MAAO,aACN,KAAM,EAAG,CAAC,YACbxC,EAAG,GACF,EAAG,CAAC,aAAc,kBACrBA,EAAG,GACF,EAAG,CAAC,UAAoD,cAAzCtE,EAAMk0G,eAAeI,QAAQhkG,UAA2B,WAAc,QAAoB,KAAW,CACrH7P,IAAK,GACJ,EAAC,QAAa8oG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,wBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMk0G,eAAeI,QAAQC,UAAUhT,IACnD,sBAAuB1hG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMk0G,eAAeI,QAAQC,UAAUhT,IAAM1gG,GAC1G8nG,YAAa,8BACZ,KAAM,EAAG,CAAC,iBACbrkG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,4BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAO,GAAa,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYxB,EAAMk0G,eAAeI,QAAQC,UAAUzgD,OAAQ,CAAComC,EAAOx5F,MACpL,WAAc,QAAoB,MAAO,CAC9CD,IAAKC,EACLlB,MAAO,mBACN,EAAC,QAAagqG,EAAqB,CACpC1hG,WAAYoyF,EAAMz5F,IAClB,sBAAuBI,GAAUq5F,EAAMz5F,IAAMI,EAC7C8nG,YAAa/oG,EAAKoB,GAAG,qCACpB,KAAM,EAAG,CAAC,aAAc,sBAAuB,iBAAiB,QAAawoG,EAAqB,CACnG1hG,WAAYoyF,EAAMpzF,MAClB,sBAAuBjG,GAAUq5F,EAAMpzF,MAAQjG,EAC/C8nG,YAAa/oG,EAAKoB,GAAG,sCACpB,KAAM,EAAG,CAAC,aAAc,sBAAuB,iBAAiB,QAAa+M,EAAsB,CACpGzM,KAAM,SACNmQ,MAAO,GACPvC,OAAQ,GACRtO,QAASC,GAAUZ,EAASu0G,mBAAmB9zG,GAC/CuD,SAAUjE,EAAMk0G,eAAeI,QAAQC,UAAUzgD,OAAOprD,QAAU,GACjE,CACDlH,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,gBAERuD,EAAG,GACF,EAAG,CAAC,UAAW,iBAChB,OAAO,QAAayJ,EAAsB,CAC5CzM,KAAM,UACNmQ,MAAO,GACP7Q,QAASX,EAASw0G,iBACjB,CACDjzG,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,UACJ,QAAoB,OAAQ,MAAM,QAAiBnB,EAAKoB,GAAG,8BAA+B,KAC9FsD,EAAG,GACF,EAAG,CAAC,gBACPA,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,KAAM,CAC5Dj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,+BAAiC,IAAK,IAAI,QAAa6C,EAAuB,CAC7IM,QAASvE,EAAKoB,GAAG,iCACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAO,GAAa,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYxB,EAAMk0G,eAAeI,QAAQC,UAAUG,eAAgB,CAACz/D,EAAOv0C,MAC5L,WAAc,QAAoB,MAAO,CAC9CD,IAAKC,EACLlB,MAAO,sBACN,EAAC,QAAagqG,EAAqB,CACpC1hG,WAAY9H,EAAMk0G,eAAeI,QAAQC,UAAUG,eAAeh0G,GAClE,sBAAuBG,GAAUb,EAAMk0G,eAAeI,QAAQC,UAAUG,eAAeh0G,GAASG,EAChG8nG,YAAa/oG,EAAKoB,GAAG,6CACpB,KAAM,EAAG,CAAC,aAAc,sBAAuB,iBAAiB,QAAa+M,EAAsB,CACpG0D,MAAO,GACPvC,OAAQ,GACRtO,QAASC,GAAUZ,EAAS00G,yBAAyBj0G,GAAQ,GAC7DuD,SAAoB,IAAVvD,GACT,CACDc,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,eAERuD,EAAG,GACF,EAAG,CAAC,UAAW,cAAc,QAAayJ,EAAsB,CACjE0D,MAAO,GACPvC,OAAQ,GACRtO,QAASC,GAAUZ,EAAS00G,yBAAyBj0G,EAAO,GAC5DuD,SAAUvD,IAAUV,EAAMk0G,eAAeI,QAAQC,UAAUG,eAAehsG,OAAS,GAClF,CACDlH,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,iBAERuD,EAAG,GACF,EAAG,CAAC,UAAW,cAAc,QAAayJ,EAAsB,CACjEzM,KAAM,SACNmQ,MAAO,GACPvC,OAAQ,GACRtO,QAASC,GAAUZ,EAAS20G,2BAA2Bl0G,IACtD,CACDc,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,gBAERuD,EAAG,GACF,EAAG,CAAC,gBACL,OAAO,QAAayJ,EAAsB,CAC5CzM,KAAM,UACNmQ,MAAO,GACP7Q,QAASX,EAAS40G,yBACjB,CACDrzG,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,UACJ,QAAoB,OAAQ,MAAM,QAAiBnB,EAAKoB,GAAG,iCAAkC,KACjGsD,EAAG,GACF,EAAG,CAAC,gBACPA,EAAG,KACA,MAAO,QAAoB,IAAI,KACpCA,EAAG,GACF,EAAG,CAAC,aAAa,QAAoB,MAAO,GAAa,EAAC,QAAoB,KAAM,IAAa,QAAiB1E,EAAKoB,GAAG,iCAAkC,IAAI,QAAoB,KAAM,IAAa,QAAiBpB,EAAKoB,GAAG,6BAA8B,IAAI,QAAa0oG,EAAoB,CACpSyC,MAAOnsG,EAAM80G,eACb,cAAe,SACd,CACDtzG,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,KAAM,CACnEj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,+BAAiC,IAAK,IAAI,QAAa6C,EAAuB,CAC7IM,QAASvE,EAAKoB,GAAG,qCACjBoD,UAAW,MACX,cAAe,IACd,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAM80G,eAAeC,eACjC,sBAAuBl1G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAM80G,eAAeC,eAAiBl0G,IAClG,KAAM,EAAG,CAAC,iBACbyD,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,WAAW,QAAoB,KAAM,IAAa,QAAiB1E,EAAKoB,GAAG,8BAA+B,IAAI,QAAa0oG,EAAoB,CACpJyC,MAAOnsG,EAAM80G,eACb1I,MAAOnsG,EAAS+0G,YAChB50G,IAAK,aACL,cAAe,SACd,CACDoB,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,KAAM,CACnEj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,gCAAkC,IAAK,IAAI,QAAa6C,EAAuB,CAC9IM,QAASvE,EAAKoB,GAAG,sCACjBoD,UAAW,MACX,cAAe,IACd,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAM80G,eAAeG,cACjC,sBAAuBp1G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAM80G,eAAeG,cAAgBp0G,IACjG,KAAM,EAAG,CAAC,iBACbyD,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,QAAS,WAAW,QAAoB,KAAM,IAAa,QAAiB1E,EAAKoB,GAAG,sCAAuC,IAAI,QAAa0oG,EAAoB,CACrKyC,MAAOnsG,EAAM80G,eACb,cAAe,SACd,CACDtzG,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,KAAM,CACnEj6F,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiB1P,EAAKoB,GAAG,2BAA6B,IAAK,IAAI,QAAa6C,EAAuB,CACzIM,QAASvE,EAAKoB,GAAG,iCACjBoD,UAAW,OACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAM80G,eAAeI,cACjC,sBAAuBr1G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAM80G,eAAeI,cAAgBr0G,IACjG,KAAM,EAAG,CAAC,iBACbyD,EAAG,KACD,QAAailG,EAAyB,CACxCj6F,MAAO1P,EAAKoB,GAAG,iCACfyjC,KAAM,qBACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAM80G,eAAeK,kBACjC,sBAAuBt1G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAM80G,eAAeK,kBAAoBt0G,GACtGkT,IAAK,EACLD,IAAK,KACLixD,KAAM,EACN2oB,UAAW,EACX,oBAAqB,SACpB,KAAM,EAAG,CAAC,gBAAgB,QAAoB,OAAQ,IAAa,QAAiB9tF,EAAKoB,GAAG,kCAAmC,KAClIsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,kCACfyjC,KAAM,sBACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAaioG,EAA4B,CAChE3hG,WAAY9H,EAAM80G,eAAeM,mBACjC,sBAAuBv1G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAM80G,eAAeM,mBAAqBv0G,GACvGkT,IAAK,EACLD,IAAK,KACLixD,KAAM,EACN2oB,UAAW,EACX,oBAAqB,SACpB,KAAM,EAAG,CAAC,gBAAgB,QAAoB,OAAQ,IAAa,QAAiB9tF,EAAKoB,GAAG,kCAAmC,KAClIsD,EAAG,GACF,EAAG,CAAC,YACPA,EAAG,GACF,EAAG,CAAC,aAAa,QAAawtG,EAA+B,CAC9D97E,MAAOh2B,EAAMgS,QACbpR,QAASX,EAASqqG,cACjB,KAAM,EAAG,CAAC,OAAQ,aAAa,QAAan8F,EAAsB,CACnErG,WAAY9H,EAAMqzG,sBAClB,sBAAuBxzG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMqzG,sBAAwBxyG,GAC3F2O,MAAO5P,EAAKoB,GAAG,gCACfiB,MAAOhC,EAASo1G,aACf,CACDjwB,QAAQ,QAAS,IAAM,EAAC,QAAoB,OAAQ,GAAa,EAAC,QAAar3E,EAAsB,CACnGnN,QAASf,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMqzG,uBAAwB,IAC5E,CACD7xG,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,kBAAmB,KACtFsD,EAAG,KACD,QAAayJ,EAAsB,CACrCzM,KAAM,UACNV,QAASX,EAASq1G,aACjB,CACD9zG,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,0BAA2B,KAC9FsD,EAAG,GACF,EAAG,CAAC,gBACP9C,SAAS,QAAS,IAAM,EAAC,QAAakoG,EAAoB,CACxDyC,MAAOnsG,EAAMu1G,SACbnJ,MAAOnsG,EAASu1G,WAChBp1G,IAAK,YACL,cAAe,SACd,CACDoB,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,8BACfyjC,KAAM,QACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMu1G,SAASn0G,KAC3B,sBAAuBvB,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMu1G,SAASn0G,KAAOP,GACnF8nG,YAAa/oG,EAAKoB,GAAG,qCACpB,KAAM,EAAG,CAAC,aAAc,kBAC3BsD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,gCACfyjC,KAAM,eACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAauwG,EAA8B,CAClEjqG,WAAY9H,EAAMu1G,SAAShC,YAC3B,sBAAuB1zG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMu1G,SAAShC,YAAc1yG,IACzF,CACDW,SAAS,QAAS,IAAM,EAAC,QAAamwG,EAAwB,CAC5DriG,MAAO,UACN,CACD9N,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,2BAA4B,KAC/FsD,EAAG,KACD,QAAaqtG,EAAwB,CACvCriG,MAAO,UACN,CACD9N,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,2BAA4B,KAC/FsD,EAAG,KACD,QAAaqtG,EAAwB,CACvCriG,MAAO,QACN,CACD9N,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,yBAA0B,KAC7FsD,EAAG,KACD,QAAaqtG,EAAwB,CACvCriG,MAAO,UACN,CACD9N,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,2BAA4B,KAC/FsD,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,iBACPA,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,4BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMu1G,SAASE,YAC3B,sBAAuB51G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMu1G,SAASE,YAAc50G,GAC1FyE,SAAUrF,EAASy1G,2BAClB,KAAM,EAAG,CAAC,aAAc,eAC3BpxG,EAAG,GACF,EAAG,CAAC,UAAYtE,EAAMu1G,SAASE,aA+Bd,QAAoB,IAAI,KA/BK,WAAc,QAAalM,EAAyB,CACnG9oG,IAAK,EACL6O,MAAO1P,EAAKoB,GAAG,2BACfyjC,KAAM,mBACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAaioG,EAA4B,CACzG3hG,WAAY9H,EAAMu1G,SAASI,gBAC3B,sBAAuB91G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMu1G,SAASI,gBAAkB90G,GAC9FkT,IAAK,EACLgxD,KAAM,EACN,oBAAqB,QACrB1kE,MAAO,CACL,KAAQ,MAET,KAAM,EAAG,CAAC,gBAAgB,QAAaipG,EAAsB,CAC9DxhG,WAAY9H,EAAMu1G,SAASK,eAC3B,sBAAuB/1G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMu1G,SAASK,eAAiB/0G,GAC7FR,MAAO,CACL,MAAS,UAEV,CACDmB,SAAS,QAAS,IAAM,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYxB,EAAM61G,gBAAiB/M,KAC3G,WAAc,QAAaO,EAAsB,CACtD5oG,IAAKqoG,EAAIhiG,MACTwI,MAAO1P,EAAKoB,GAAG8nG,EAAIgN,UACnBhvG,MAAOgiG,EAAIhiG,OACV,KAAM,EAAG,CAAC,QAAS,YACpB,QACJxC,EAAG,GACF,EAAG,CAAC,mBACPA,EAAG,GACF,EAAG,CAAC,WAA6CtE,EAAMu1G,SAASE,aAS/C,QAAoB,IAAI,KATsC,WAAc,QAAalM,EAAyB,CACpI9oG,IAAK,EACL6O,MAAO1P,EAAKoB,GAAG,mCACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMu1G,SAASQ,WAC3B,sBAAuBl2G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMu1G,SAASQ,WAAal1G,IACxF,KAAM,EAAG,CAAC,iBACbyD,EAAG,GACF,EAAG,CAAC,aACPA,EAAG,GACF,EAAG,CAAC,QAAS,YAChBA,EAAG,GACF,EAAG,CAAC,aAAc,QAAS,WAAW,QAAa6J,EAAsB,CAC1ErG,WAAY9H,EAAMg2G,oBAClB,sBAAuBn2G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMg2G,oBAAsBn1G,GACzF2O,MAAO5P,EAAKoB,GAAG,8BACfiB,MAAOhC,EAASo1G,aACf,CACDjwB,QAAQ,QAAS,IAAM,EAAC,QAAoB,OAAQ,GAAa,EAAC,QAAar3E,EAAsB,CACnGnN,QAASf,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMg2G,qBAAsB,IAC1E,CACDx0G,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,kBAAmB,KACtFsD,EAAG,KACD,QAAayJ,EAAsB,CACrCzM,KAAM,UACNV,QAASX,EAASg2G,aACjB,CACDz0G,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,0BAA2B,KAC9FsD,EAAG,GACF,EAAG,CAAC,gBACP9C,SAAS,QAAS,IAAM,EAAC,QAAakoG,EAAoB,CACxDyC,MAAOnsG,EAAMk2G,aACb9J,MAAOnsG,EAASk2G,eAChB/1G,IAAK,gBACL,cAAe,SACd,CACDoB,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,+BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMk2G,aAAa90G,KAC/B,sBAAuBvB,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMk2G,aAAa90G,KAAOP,GACvFoD,SAAU,IACT,KAAM,EAAG,CAAC,iBACbK,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,gCACfyjC,KAAM,eACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAauwG,EAA8B,CAClEjqG,WAAY9H,EAAMk2G,aAAa3C,YAC/B,sBAAuB1zG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMk2G,aAAa3C,YAAc1yG,IAC7F,CACDW,SAAS,QAAS,IAAM,EAAC,QAAamwG,EAAwB,CAC5DriG,MAAO,UACN,CACD9N,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,2BAA4B,KAC/FsD,EAAG,KACD,QAAaqtG,EAAwB,CACvCriG,MAAO,UACN,CACD9N,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,2BAA4B,KAC/FsD,EAAG,KACD,QAAaqtG,EAAwB,CACvCriG,MAAO,QACN,CACD9N,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,yBAA0B,KAC7FsD,EAAG,KACD,QAAaqtG,EAAwB,CACvCriG,MAAO,UACN,CACD9N,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,2BAA4B,KAC/FsD,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,iBACPA,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,4BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMk2G,aAAaT,YAC/B,sBAAuB51G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMk2G,aAAaT,YAAc50G,GAC9FyE,SAAUrF,EAASm2G,yBAClB,KAAM,EAAG,CAAC,aAAc,eAC3B9xG,EAAG,GACF,EAAG,CAAC,UAAYtE,EAAMk2G,aAAaT,aA+BlB,QAAoB,IAAI,KA/BS,WAAc,QAAalM,EAAyB,CACvG9oG,IAAK,EACL6O,MAAO1P,EAAKoB,GAAG,2BACfyjC,KAAM,mBACL,CACDjjC,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAaioG,EAA4B,CACzG3hG,WAAY9H,EAAMk2G,aAAaP,gBAC/B,sBAAuB91G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMk2G,aAAaP,gBAAkB90G,GAClGkT,IAAK,EACLgxD,KAAM,EACN,oBAAqB,QACrB1kE,MAAO,CACL,KAAQ,MAET,KAAM,EAAG,CAAC,gBAAgB,QAAaipG,EAAsB,CAC9DxhG,WAAY9H,EAAMk2G,aAAaN,eAC/B,sBAAuB/1G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMk2G,aAAaN,eAAiB/0G,GACjGR,MAAO,CACL,MAAS,UAEV,CACDmB,SAAS,QAAS,IAAM,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYxB,EAAM61G,gBAAiB/M,KAC3G,WAAc,QAAaO,EAAsB,CACtD5oG,IAAKqoG,EAAIhiG,MACTwI,MAAO1P,EAAKoB,GAAG8nG,EAAIgN,UACnBhvG,MAAOgiG,EAAIhiG,OACV,KAAM,EAAG,CAAC,QAAS,YACpB,QACJxC,EAAG,GACF,EAAG,CAAC,mBACPA,EAAG,GACF,EAAG,CAAC,WAA6CtE,EAAMk2G,aAAaT,aASnD,QAAoB,IAAI,KAT0C,WAAc,QAAalM,EAAyB,CACxI9oG,IAAK,EACL6O,MAAO1P,EAAKoB,GAAG,mCACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMk2G,aAAaH,WAC/B,sBAAuBl2G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMk2G,aAAaH,WAAal1G,IAC5F,KAAM,EAAG,CAAC,iBACbyD,EAAG,GACF,EAAG,CAAC,aACPA,EAAG,GACF,EAAG,CAAC,QAAS,YAChBA,EAAG,GACF,EAAG,CAAC,aAAc,QAAS,WAAW,QAAa6J,EAAsB,CAC1ErG,WAAY9H,EAAMq2G,sBAClB,sBAAuBx2G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMq2G,sBAAwBx1G,GAC3F2O,MAAO5P,EAAKoB,GAAG,iCACfiB,MAAOhC,EAASo1G,aACf,CACDjwB,QAAQ,QAAS,IAAM,EAAC,QAAoB,OAAQ,GAAa,EAAC,QAAar3E,EAAsB,CACnGzM,KAAM,UACNV,QAASf,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMq2G,uBAAwB,IAC5E,CACD70G,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,yBAA0B,KAC7FsD,EAAG,QAEL9C,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAO,GAAa,EAAC,QAAoB,IAAK,GAAa,EAAC,QAAatB,EAA8B,CAClJa,KAAM,uBACNV,MAAO,CACL,eAAgB,UAEhB,QAAiB,KAAM,QAAiBT,EAAKoB,GAAG,oCAAqC,MAAM,QAAa0oG,EAAoB,CAC9H,cAAe,SACd,CACDloG,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,+BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAoB,OAAQ,MAAM,QAAiBxB,EAAMs2G,aAAal1G,MAAO,KACtGkD,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,0BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMs2G,aAAapJ,MAC/B,sBAAuBrtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMs2G,aAAapJ,MAAQrsG,GACxFmtG,SAAU,IACT,CACDuI,QAAQ,QAAS,IAAM,EAAC,QAAaxoG,EAAsB,CACzDnN,QAASX,EAASu2G,WACjB,CACDh1G,SAAS,QAAS,IAAM,EAAC,SAAiB,QAAiB5B,EAAKoB,GAAG,wBAAyB,KAC5FsD,EAAG,GACF,EAAG,CAAC,cACPA,EAAG,GACF,EAAG,CAAC,iBACPA,EAAG,GACF,EAAG,CAAC,YACPA,EAAG,QAELA,EAAG,GACF,EAAG,CAAC,aAAc,QAAS,aAAc,CAAC,CAACkK,EAAoBxO,EAAMgS,UAC1E,C,SCl8BA,MAAMykG,GAAiB,CACrBxgG,EAAG,IACHkB,EAAG,IACHtD,EAAG,KACHiB,EAAG,OAWE,SAAS4hG,GAAiBC,EAAU7vG,EAAOgnF,GAChD,IAAKtmF,OAAO2e,SAASrf,IAAUA,GAAS,EACtC,MAAM,IAAI4hC,MAAM,eAGlB,MAAMzZ,EAA2B,kBAAb0nF,EAAwB,IAAIjvG,KAAKivG,GAAY,IAAIjvG,KAAKivG,EAAShuG,WAEnF,GAAI8tG,GAAe3oB,GACjB,OAAO,IAAIpmF,KAAKunB,EAAKtmB,UAAY7B,EAAQ2vG,GAAe3oB,IAAO+T,cAGjE,GAAa,MAAT/T,EAEF,OADA7+D,EAAK2nF,YAAY3nF,EAAK4nF,cAAgB/vG,GAC/BmoB,EAAK4yE,cAGd,GAAa,MAAT/T,EAEF,OADA7+D,EAAK6nF,eAAe7nF,EAAK8nF,iBAAmBjwG,GACrCmoB,EAAK4yE,cAGd,MAAM,IAAIn5D,MAAM,YAAYolD,IAC9B,CAQA,SAASkpB,GAAkBC,GACzB,MAAMhwG,EAAO,IAAIS,KAAKuvG,GAChB1vG,EAAON,EAAKC,cACZO,EAAQlG,OAAO0F,EAAKE,WAAa,GAAGJ,SAAS,EAAG,KAChDX,EAAM7E,OAAO0F,EAAKG,WAAWL,SAAS,EAAG,KACzC2+F,EAAQnkG,OAAO0F,EAAKiwG,YAAYnwG,SAAS,EAAG,KAC5C0+F,EAAUlkG,OAAO0F,EAAKkwG,cAAcpwG,SAAS,EAAG,KAChDy+F,EAAUjkG,OAAO0F,EAAKmwG,cAAcrwG,SAAS,EAAG,KACtD,MAAO,GAAGQ,KAAQE,KAASrB,KAAOs/F,KAASD,KAAWD,GACxD,CAQO,SAASoO,GAAeC,EAAW39D,EAAM,IAAIxuC,MAClD,GAAkB,OAAdmsG,QAAoC/9F,IAAd+9F,EACxB,MAAO,CACLhjG,OAAQ,SACRvB,MAAO,KACPwkG,YAAa,QAIjB,MAAMuD,EAAc,IAAI3vG,KAAKmsG,GACvByD,EAAcphE,aAAexuC,KAAOwuC,EAAM,IAAIxuC,KAAKwuC,GACnDqhE,EAAgBP,GAAkBnD,GAExC,OAAIyD,EAAY3uG,UAAY0uG,EAAY1uG,UAC/B,CACLkI,OAAQ,UACRvB,MAAO,MACPwkG,YAAayD,GAIV,CACL1mG,OAAQ,SACRvB,MAAO,KACPwkG,YAAayD,EAEjB,CCxFA,QACEnU,WAAY,CACVoU,mBAAkB,IAEpB,IAAA91G,GACE,MAAO,CACLswG,aAAc,CACZC,KAAM,CAAC,EACPW,MAAO,CAAC,GAEVsB,eAAgB,CACdC,SAAU,CAAC,EACXG,QAAS,CACP94C,SAAS,EACTlrD,QAAS,YACTikG,UAAW,CACThT,IAAK,GACLztC,OAAQ,CAAC,CACPrzD,IAAK,KACLqG,MAAO,SAET4tG,eAAgB,MAItBI,eAAgB,CAAC,EACjBxB,UAAW,GAGXthG,SAAS,EACTiiG,cAAc,EAEdwD,gBAAiB,GAEjBC,iBAAkB,GAGlBhF,qBAAqB,EAErBS,sBAAsB,EAEtBX,mBAAmB,EAEnBO,oBAAoB,EAIpBM,uBAAuB,EACvB2C,qBAAqB,EACrBK,uBAAuB,EACvBR,gBAAiB,CAAC,CAChBC,SAAU,8BACVhvG,MAAO,KACN,CACDgvG,SAAU,8BACVhvG,MAAO,KACN,CACDgvG,SAAU,4BACVhvG,MAAO,KACN,CACDgvG,SAAU,2BACVhvG,MAAO,KACN,CACDgvG,SAAU,6BACVhvG,MAAO,KACN,CACDgvG,SAAU,4BACVhvG,MAAO,MAETyuG,SAAU,CACRn0G,KAAM,GACNu2G,MAAO,GACPpE,YAAa,GACbkC,aAAa,EACbE,gBAAiB,EACjBC,eAAgB,IAChBG,YAAY,GAEdG,aAAc,CACZnjG,GAAI,GACJ3R,KAAM,GACNu2G,MAAO,GACPpE,YAAa,GACbkC,aAAa,EACbE,gBAAiB,EACjBC,eAAgB,IAChBG,YAAY,GAEdO,aAAc,CACZl1G,KAAM,GACN8rG,MAAO,IAGb,EACAtrG,SAAU,CACR,WAAAyzG,GACE,OAAOvzG,OAAOC,WAAa,IAAM,MAAQ,KAC3C,EACA,aAAAmwG,GACE,MAAO,CACLC,SAAU,CAAC,CACTyF,UAAW,CAACC,EAAM/wG,EAAO8f,KACvB,MAAMkxF,EAAmB,CAAC,IAAK,IAAK,IAAK,IAAK,KACxCC,EAAkBD,EAAiB7tC,KAAK+tC,GAAQlxG,GAASA,EAAMyxB,SAASy/E,IAC1ED,EACFnxF,EAAS,IAAI8hB,MAAM1mC,KAAKhB,GAAG,qCAE3B4lB,KAGJoyC,QAAS,SAEX25C,uBAAwB,CAAC,CACvBiF,UAAW,CAACC,EAAM/wG,EAAO8f,KAClB9f,EAEMA,IAAU9E,KAAKgwG,aAAaC,KAAKE,SAC1CvrF,EAAS,IAAI8hB,MAAM1mC,KAAKhB,GAAG,kCAE3B4lB,IAJAA,EAAS,IAAI8hB,MAAM1mC,KAAKhB,GAAG,wCAO/Bg4D,QAAS,SAGf,EACA,cAAA65C,GACE,MAAO,CACLO,wBAAyB,CAAC,CACxBwE,UAAW,CAACC,EAAM/wG,EAAO8f,KAClB9f,EAEMA,IAAU9E,KAAKgwG,aAAaY,MAAMI,cAC3CpsF,EAAS,IAAI8hB,MAAM1mC,KAAKhB,GAAG,kCAE3B4lB,IAJAA,EAAS,IAAI8hB,MAAM1mC,KAAKhB,GAAG,uCAO/Bg4D,QAAS,SAGf,EACA,WAAAg8C,GACE,MAAMiD,EAAwB,CAACJ,EAAM/wG,EAAO8f,MACrCpf,OAAO0wG,UAAUpxG,IAAUA,EAAQ,GAAKA,EAAQ,KACnD8f,EAAS,IAAI8hB,MAAM1mC,KAAKhB,GAAG,sCAE3B4lB,KAGJ,MAAO,CACLuuF,kBAAmB,CAAC,CAClByC,UAAWK,EACXj/C,QAAS,WAEXo8C,mBAAoB,CAAC,CACnBwC,UAAWK,EACXj/C,QAAS,WAGf,EACA,UAAAw8C,GACE,MAAO,CACLp0G,KAAM,CAAC,CACLi3F,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,iCACjBg4D,QAAS,SAEXu6C,YAAa,CAAC,CACZlb,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,mCACjBg4D,QAAS,WAEX28C,gBAAiB,CAAC,CAChBiC,UAAW,CAACC,EAAM/wG,EAAO8f,KAClB5kB,KAAKuzG,SAASE,aAAiB3uG,KAASA,GAAS,GAGpD8f,IAFAA,EAAS,IAAI8hB,MAAM1mC,KAAKhB,GAAG,sCAK/Bg4D,QAAS,SAGf,EACA,cAAAm9C,GACE,MAAO,CACL5C,YAAa,CAAC,CACZlb,UAAU,EACV7mF,QAASxP,KAAKhB,GAAG,mCACjBg4D,QAAS,WAEX28C,gBAAiB,CAAC,CAChBiC,UAAW,CAACC,EAAM/wG,EAAO8f,KAClB5kB,KAAKk0G,aAAaT,aAAiB3uG,KAASA,GAAS,GAGxD8f,IAFAA,EAAS,IAAI8hB,MAAM1mC,KAAKhB,GAAG,sCAK/Bg4D,QAAS,SAGf,GAEF32D,QAAS,CACP,wBAAA81G,CAAyBnX,EAAW,CAAC,GACnC,MAAMsT,EAAUtT,EAASsT,SAAW,CAAC,EAC/BC,EAAYD,EAAQC,WAAa,CAAC,EAClCzgD,EAAS/rD,MAAM6O,QAAQ29F,EAAUzgD,SAAWygD,EAAUzgD,OAAOprD,OAAS,EAAI6rG,EAAUzgD,OAAOj9C,IAAIqjF,IAAS,CAC5Gz5F,IAAKy5F,GAAOz5F,KAAO,GACnBqG,MAAOozF,GAAOpzF,OAAS,MACnB,CAAC,CACLrG,IAAK,KACLqG,MAAO,SAEH4tG,EAAiB3sG,MAAM6O,QAAQ29F,EAAUG,gBAAkBH,EAAUG,eAAe79F,IAAIo+B,GACvE,kBAAVA,EAA2BA,EAC/BA,GAAOykC,MAAQ,IACnB,GACL,MAAO,IACFsnB,EACHmT,SAAUnT,EAASmT,UAAY,CAAC,EAChCG,QAAS,CACP94C,QAAS84C,EAAQ94C,UAAW,EAC5BlrD,QAASgkG,EAAQhkG,SAAW,YAC5BikG,UAAW,CACThT,IAAKgT,EAAUhT,KAAO,GACtBztC,SACA4gD,mBAIR,EACA,eAAAD,GACEzyG,KAAKkyG,eAAeI,QAAQC,UAAUzgD,OAAO9qC,KAAK,CAChDvoB,IAAK,GACLqG,MAAO,IAEX,EACA,kBAAA0tG,CAAmB9zG,GACbsB,KAAKkyG,eAAeI,QAAQC,UAAUzgD,OAAOprD,QAAU,GAC3D1G,KAAKkyG,eAAeI,QAAQC,UAAUzgD,OAAOxkC,OAAO5uB,EAAO,EAC7D,EACA,uBAAAm0G,GACE7yG,KAAKkyG,eAAeI,QAAQC,UAAUG,eAAe1rF,KAAK,GAC5D,EACA,0BAAA4rF,CAA2Bl0G,GACzBsB,KAAKkyG,eAAeI,QAAQC,UAAUG,eAAeplF,OAAO5uB,EAAO,EACrE,EACA,wBAAAi0G,CAAyBj0G,EAAO8wC,GAC9B,MAAM4mE,EAASp2G,KAAKkyG,eAAeI,QAAQC,UAAUG,eAC/C2D,EAAc33G,EAAQ8wC,EAC5B,GAAI6mE,EAAc,GAAKA,GAAeD,EAAO1vG,OAAQ,OACrD,MAAOusC,GAASmjE,EAAO9oF,OAAO5uB,EAAO,GACrC03G,EAAO9oF,OAAO+oF,EAAa,EAAGpjE,EAChC,EACA,mBAAAo9D,GACMrwG,KAAKgwG,aAAaC,KAAKE,WAAanwG,KAAKy1G,gBAC3Cz1G,KAAK0wG,qBAAsB,EAE3B1wG,KAAK0wG,qBAAsB,CAE/B,EACA,oBAAAO,GACMjxG,KAAKgwG,aAAaY,MAAMI,gBAAkBhxG,KAAK01G,iBACjD11G,KAAKmxG,sBAAuB,EAE5BnxG,KAAKmxG,sBAAuB,CAEhC,EACA,uBAAAV,CAAwB6F,GAClBA,IACFt2G,KAAKgwG,aAAaC,KAAKE,SAAW,GAClCnwG,KAAK0wG,qBAAsB,EAE/B,EACA,wBAAAQ,CAAyBoF,GACnBA,IACFt2G,KAAKgwG,aAAaY,MAAMI,cAAgB,GACxChxG,KAAKgwG,aAAaY,MAAME,cAAgB,GACxC9wG,KAAKmxG,sBAAuB,EAEhC,EAEA,iBAAAM,CAAkB8E,GAChB,MAAMC,EAAgB,CACpB,OAAUx2G,KAAKhB,GAAG,0BAClB,OAAUgB,KAAKhB,GAAG,0BAClB,KAAQgB,KAAKhB,GAAG,wBAChB,OAAUgB,KAAKhB,GAAG,2BAEpB,OAAOw3G,EAAcD,IAAeA,CACtC,EACA,UAAA7E,CAAW+E,GACT,OAAO,IAAI/wG,KAAK+wG,GAAY7pG,eAAe,QAC7C,EACA,mBAAM8pG,GACJ12G,KAAKiyG,cAAe,EACpB,IACE,MAAM7W,QAAiB,EAAAO,GAAA,GAAc,yBAC/Bj8F,QAAa07F,EAASU,OAC5B97F,KAAKsxG,UAAY5xG,EAAKi3G,QAAU,EAClC,CAAE,MAAOptC,GACPvpE,KAAK2kG,SAASp7B,MAAMvpE,KAAKhB,GAAG,+BAC9B,CAAE,QACAgB,KAAKiyG,cAAe,CACtB,CACF,EACA,WAAAqB,GACEtzG,KAAKU,MAAMk2G,UAAUtI,SAASgB,UAC5B,GAAK/sF,EACL,IACEviB,KAAKuzG,SAASoC,MAAQ,QAEtB,IAAI9D,EAAY,KACZkC,GAAa,EACZ/zG,KAAKuzG,SAASE,cACjB5B,EAAY6C,GAAiB,IAAIhvG,KAAQ1F,KAAKuzG,SAASI,gBAAiB3zG,KAAKuzG,SAASK,gBACtFG,EAAa/zG,KAAKuzG,SAASQ,YAE7B,MAAM3Y,QAAiB,EAAAO,GAAA,GAAc,wBAAyB,CAC5D3uE,OAAQ,OACR2wE,QAAS,CACP,eAAgB,oBAElBxa,KAAMruD,KAAKC,UAAU,CACnB31B,KAAMY,KAAKuzG,SAASn0G,KACpBu2G,MAAO31G,KAAKuzG,SAASoC,MACrBpE,YAAavxG,KAAKuzG,SAAShC,YAC3BM,YACAkC,iBAGEr0G,QAAa07F,EAASU,OACxBV,EAAS56E,IACXxgB,KAAKs0G,aAAe,CAClBl1G,KAAMM,EAAKN,KACX8rG,MAAOxrG,EAAKwrG,OAEdlrG,KAAKqxG,uBAAwB,EAC7BrxG,KAAKq0G,uBAAwB,EAC7Br0G,KAAKuzG,SAAW,CACdn0G,KAAM,GACNu2G,MAAO,GACPpE,YAAa,GACbkC,aAAa,EACbE,gBAAiB,EACjBC,eAAgB,IAChBG,YAAY,SAER/zG,KAAK02G,gBACX12G,KAAK2kG,SAAS5I,QAAQ/7F,KAAKhB,GAAG,oCAE9BgB,KAAK2kG,SAASp7B,MAAM7pE,EAAK6pE,OAASvpE,KAAKhB,GAAG,iCAE9C,CAAE,MAAOuqE,GACPvpE,KAAK2kG,SAASp7B,MAAMvpE,KAAKhB,GAAG,iCAC9B,GAEJ,EACA,SAAA+yG,CAAU7G,GACR,MAAM2L,EAAoC,OAApB3L,EAAM2G,gBAA0C/9F,IAApBo3F,EAAM2G,UACxD7xG,KAAKk0G,aAAe,CAClBnjG,GAAIm6F,EAAMn6F,GACV3R,KAAM8rG,EAAM9rG,KACZu2G,MAAOzK,EAAMyK,MACbpE,YAAa,IAAIrG,EAAMqG,aACvBkC,aAAcoD,EACdlD,gBAAiB,EACjBC,eAAgB,IAChBG,WAAY7I,EAAM6I,aAAc,GAElC/zG,KAAKg0G,qBAAsB,CAC7B,EACA,WAAAC,GACEj0G,KAAKU,MAAMo2G,cAAcxI,SAASgB,UAChC,GAAK/sF,EACL,IACE,IAAIsvF,EAAY,KACZkC,GAAa,EACZ/zG,KAAKk0G,aAAaT,cACrB5B,EAAY6C,GAAiB,IAAIhvG,KAAQ1F,KAAKk0G,aAAaP,gBAAiB3zG,KAAKk0G,aAAaN,gBAC9FG,EAAa/zG,KAAKk0G,aAAaH,YAEjC,MAAM3Y,QAAiB,EAAAO,GAAA,GAAc,wBAAyB,CAC5D3uE,OAAQ,MACR2wE,QAAS,CACP,eAAgB,oBAElBxa,KAAMruD,KAAKC,UAAU,CACnBgiF,QAAS/2G,KAAKk0G,aAAanjG,GAC3BwgG,YAAavxG,KAAKk0G,aAAa3C,YAC/BM,YACAkC,iBAGEr0G,QAAa07F,EAASU,OACxBV,EAAS56E,IACXxgB,KAAKg0G,qBAAsB,QACrBh0G,KAAK02G,gBACX12G,KAAK2kG,SAAS5I,QAAQ/7F,KAAKhB,GAAG,oCAE9BgB,KAAK2kG,SAASp7B,MAAM7pE,EAAK6pE,OAASvpE,KAAKhB,GAAG,iCAE9C,CAAE,MAAOuqE,GACPvpE,KAAK2kG,SAASp7B,MAAMvpE,KAAKhB,GAAG,iCAC9B,GAEJ,EACA,iBAAMgzG,CAAY+E,GAChB,UACQ/2G,KAAKmlG,SAASnlG,KAAKhB,GAAG,kCAAmCgB,KAAKhB,GAAG,uCAAwC,CAC7GomG,kBAAmBplG,KAAKhB,GAAG,oCAC3BqmG,iBAAkBrlG,KAAKhB,GAAG,wCAC1BM,KAAM,YAER,MAAM87F,QAAiB,EAAAO,GAAA,GAAc,4BAA4Bob,IAAW,CAC1E/pF,OAAQ,WAEJttB,QAAa07F,EAASU,OACxBV,EAAS56E,UACLxgB,KAAK02G,gBACX12G,KAAK2kG,SAAS5I,QAAQ/7F,KAAKhB,GAAG,oCAE9BgB,KAAK2kG,SAASp7B,MAAM7pE,EAAK6pE,OAASvpE,KAAKhB,GAAG,iCAE9C,CAAE,MAAOuqE,GACO,WAAVA,GACFvpE,KAAK2kG,SAASp7B,MAAMvpE,KAAKhB,GAAG,iCAEhC,CACF,EACA,eAAMw1G,GACJ,UACQwC,UAAUC,UAAUC,UAAUl3G,KAAKs0G,aAAapJ,OACtDlrG,KAAK2kG,SAAS5I,QAAQ/7F,KAAKhB,GAAG,2BAChC,CAAE,MAAOuqE,GACPvpE,KAAK2kG,SAASp7B,MAAMvpE,KAAKhB,GAAG,0BAC9B,CACF,EACA,yBAAA00G,CAA0BvwF,GACpBA,IACFnjB,KAAKuzG,SAASQ,YAAa,EAE/B,EACA,uBAAAK,CAAwBjxF,GAClBA,IACFnjB,KAAKk0G,aAAaH,YAAa,EAEnC,EACA,cAAAnC,CAAeC,GACb,OAAOD,GAAeC,EACxB,EACA,YAAAvJ,GAEE,IAAI6O,EAAqB,GAGzBA,EAAmBnwF,KAAK,IAAIwvB,QAAQvT,IAClCjjC,KAAKU,MAAM02G,aAAa9I,SAAS/rF,IAC/B0gB,EAAQ1gB,QAKZ40F,EAAmBnwF,KAAK,IAAIwvB,QAAQvT,IAClCjjC,KAAKU,MAAM22G,cAAc/I,SAAS/rF,IAChC0gB,EAAQ1gB,QAKZ40F,EAAmBnwF,KAAK,IAAIwvB,QAAQvT,IAClCjjC,KAAKU,MAAM42G,WAAWhJ,SAAS/rF,IAC7B0gB,EAAQ1gB,QAKZi0B,QAAQoB,IAAIu/D,GAAoBz/D,KAAK6/D,IACnC,MAAMC,EAAUD,EAAQE,MAAMl1F,GAASA,GACvC,IAAKi1F,EACH,OAIF,GAAIx3G,KAAK8yG,eAAeK,kBAAoB,IAAM3tG,OAAO0wG,UAAUl2G,KAAK8yG,eAAeK,oBAAsBnzG,KAAK8yG,eAAeK,kBAAoB,MAAQnzG,KAAK8yG,eAAeM,mBAAqB,IAAM5tG,OAAO0wG,UAAUl2G,KAAK8yG,eAAeM,qBAAuBpzG,KAAK8yG,eAAeM,mBAAqB,KAE/S,YADApzG,KAAK2kG,SAASp7B,MAAMvpE,KAAKhB,GAAG,qCAG9B,MAAMggG,EAAW,CACf0Y,KAAM13G,KAAKgwG,aACX2H,OAAQ33G,KAAKkyG,eACb0F,OAAQ53G,KAAK8yG,uBAGR9T,EAAS0Y,KAAKzH,KAAKU,8BACnB3R,EAAS0Y,KAAK9G,MAAMQ,wBAGvBpxG,KAAKwwG,oBACPxR,EAAS0Y,KAAKzH,KAAK4H,QAAS,EAC5B7Y,EAAS0Y,KAAKzH,KAAKE,SAAW,IAE5BnwG,KAAK+wG,qBACP/R,EAAS0Y,KAAK9G,MAAMiH,QAAS,EAC7B7Y,EAAS0Y,KAAK9G,MAAMI,cAAgB,KAEtC,EAAArV,GAAA,GAAc,iCAAkC,CAC9C3uE,OAAQ,OACR2wE,QAAS,CACP,eAAgB,oBAElBxa,KAAMruD,KAAKC,UAAUiqE,KACpBtnD,KAAKxqB,GAAOA,EAAI4uE,QAAQpkD,KAAKh4C,IAE9B,GAAIA,EAAKo4G,qBAAsB,CAC7B,MAAMC,EAAM/3G,KAAKhB,GAAG,2CAMpB,OALAgB,KAAK2kG,SAASC,QAAQmT,QACtB3pF,WAAW,KACTpuB,KAAKg4G,OAAOC,OAAO,oBAAoB,GACvCj4G,KAAKk4G,QAAQlxF,KAAK,gBACjB,KAEL,CACAhnB,KAAK2kG,SAAS5I,QAAQ/7F,KAAKhB,GAAG,8BAE9BgB,KAAKgwG,aAAaC,KAAKE,SAAW,GAClCnwG,KAAKgwG,aAAaY,MAAMI,cAAgB,GACxChxG,KAAKy1G,gBAAkB,GACvBz1G,KAAK01G,iBAAmB,GAEpB1W,EAAS0Y,KAAKzH,KAAKE,WAAanR,EAAS0Y,KAAKzH,KAAK4H,OACrD73G,KAAKgwG,aAAaC,KAAKM,cAAe,EAC7BvR,EAAS0Y,KAAKzH,KAAK4H,SAC5B73G,KAAKgwG,aAAaC,KAAKM,cAAe,GAEpCvR,EAAS0Y,KAAK9G,MAAMI,gBAAkBhS,EAAS0Y,KAAK9G,MAAMiH,OAC5D73G,KAAKgwG,aAAaY,MAAML,cAAe,EAC9BvR,EAAS0Y,KAAK9G,MAAMiH,SAC7B73G,KAAKgwG,aAAaY,MAAML,cAAe,GAEzCvwG,KAAK0wG,qBAAsB,EAC3B1wG,KAAKmxG,sBAAuB,EAC5BnxG,KAAKwwG,mBAAoB,EACzBxwG,KAAK+wG,oBAAqB,IACzBhC,MAAM,SAIb,GAEF,OAAAxtG,GACEvB,KAAKgQ,SAAU,GAEf,EAAA2rF,GAAA,GAAc,kCAAkCjkD,KAAK0jD,GAAYA,EAASU,QAAQpkD,KAAKh4C,IACrFM,KAAKgwG,aAAetwG,EAAKg4G,KACzB13G,KAAKkyG,eAAiBlyG,KAAKm2G,yBAAyBz2G,EAAKi4G,QACzD33G,KAAK8yG,eAAiBpzG,EAAKk4G,OAG3B53G,KAAKy1G,gBAAkB,GACvBz1G,KAAK01G,iBAAmB,GACxB11G,KAAKgwG,aAAaC,KAAKU,uBAAyB,GAChD3wG,KAAKgwG,aAAaY,MAAMQ,wBAA0B,GAGlDpxG,KAAK02G,kBACJlH,QAAQ,KACTxvG,KAAKgQ,SAAU,GAEnB,GC7jBF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,UCRA,MAAM,GAAa,CACjBxS,MAAO,iBAEH,GAAa,CACjBA,MAAO,eAEF,SAAS,GAAOI,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACjD2D,EAAwB,KACxBwlG,EAAuB,MACvBC,EAAuB,MACvBF,EAAuB,MACvBI,EAAsB,MACtBD,EAA0B,MAC1BG,EAAqB,MACrBoI,EAAgC,GAChCtjG,EAAqB,IAC3B,OAAO,UAAiB,WAAc,QAAoB,MAAO,GAAY,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYvO,EAASk6G,gBAAiB,CAACC,EAAeC,MACnL,WAAc,QAAoB,MAAO,CAC9C55G,IAAK45G,EACL76G,MAAO,kBACN,EAAC,QAAoB,KAAM,IAAY,QAAiB66G,GAAe,IAAI,QAAa3Q,EAAoB,CAC7GyC,MAAOnsG,EAAMghG,SACb,cAAe,SACd,CACDx/F,SAAS,QAAS,IAAM,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAY44G,EAAe,CAACE,EAAS55G,MAC7G,WAAc,QAAa6oG,EAAyB,CACzD9oG,IAAK65G,EAAQvnG,IACZ,CACDzD,OAAO,QAAS,IAAM,EAAC,SAAiB,QAAiBrP,EAASs6G,UAAUD,EAAS,UAAY,IAAK,GAAIA,EAAQp1B,UAAW,WAAc,QAAarhF,EAAuB,CAC7KpD,IAAK,EACL0D,QAASlE,EAASs6G,UAAUD,EAAS,WACrCl2G,UAAW,MACX,cAAe,IACd,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,cAAe,QAAoB,IAAI,KAC9C9C,SAAS,QAAS,IAAM,CAAkB,WAAjB84G,EAAQh5G,OAAqB,WAAc,QAAagoG,EAAsB,CACrG7oG,IAAK,EACLqH,WAAYwyG,EAAQxzG,MACpB,sBAAuBjG,GAAUy5G,EAAQxzG,MAAQjG,EACjDoD,SAAUq2G,EAAQ/P,MAClB5B,YAAa1oG,EAASs6G,UAAUD,EAAS,eACzCj6G,MAAO,CACL,MAAS,SAEV,CACDmB,SAAS,QAAS,IAAM,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAY84G,EAAQxqG,QAASopC,KACrG,WAAc,QAAamwD,EAAsB,CACtD5oG,IAAKy4C,EAAOpyC,MACZwI,MAAOrP,EAASu6G,gBAAgBthE,GAChCpyC,MAAOoyC,EAAOpyC,OACb,KAAM,EAAG,CAAC,QAAS,YACpB,QACJxC,EAAG,GACF,KAAM,CAAC,aAAc,sBAAuB,WAAY,iBAAoC,gBAAjBg2G,EAAQh5G,OAA0B,WAAc,QAAagoG,EAAsB,CAC/J7oG,IAAK,EACLqH,WAAYwyG,EAAQxzG,MACpB,sBAAuBjG,GAAUy5G,EAAQxzG,MAAQjG,EACjDoD,UAAWhE,EAASw6G,sBAA+D,IAAvCx6G,EAASy6G,mBAAmBhyG,OACxEigG,YAAa/oG,EAAKoB,GAAG,oCACrB25G,UAAW,GACXt6G,MAAO,CACL,MAAS,SAEV,CACDmB,SAAS,QAAS,IAAM,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYvB,EAASy6G,mBAAoBlO,KACjH,WAAc,QAAanD,EAAsB,CACtD5oG,IAAK+rG,EAAGprG,KACRkO,MAAOk9F,EAAGprG,KACV0F,MAAO0lG,EAAGprG,MACT,KAAM,EAAG,CAAC,QAAS,YACpB,QACJkD,EAAG,GACF,EAAG,CAAC,aAAc,sBAAuB,WAAY,iBAAoC,YAAjBg2G,EAAQh5G,OAAsB,WAAc,QAAa8nG,EAAsB,CACxJ3oG,IAAK,EACLqH,WAAYwyG,EAAQxzG,MACpB,sBAAuBjG,GAAUy5G,EAAQxzG,MAAQjG,EACjDoD,SAAUq2G,EAAQ/P,OACjB,KAAM,EAAG,CAAC,aAAc,sBAAuB,cAAiC,aAAjB+P,EAAQh5G,OAAuB,WAAc,QAAakoG,EAAqB,CAC/I/oG,IAAK,EACLqH,WAAYwyG,EAAQxzG,MACpB,sBAAuBjG,GAAUy5G,EAAQxzG,MAAQjG,EACjDS,KAAM,WACNgsG,SAAU,CACRC,QAAS,GAEXx3E,OAAQ,WACR9xB,SAAUq2G,EAAQ/P,MAClB5B,YAAa1oG,EAASs6G,UAAUD,EAAS,gBACxC,KAAM,EAAG,CAAC,aAAc,sBAAuB,WAAY,mBAAoB,WAAc,QAAa9Q,EAAqB,CAChI/oG,IAAK,EACLqH,WAAYwyG,EAAQxzG,MACpB,sBAAuBjG,GAAUy5G,EAAQxzG,MAAQjG,EACjDoD,SAAUq2G,EAAQ/P,MAClB5B,YAAa1oG,EAASs6G,UAAUD,EAAS,gBACxC,KAAM,EAAG,CAAC,aAAc,sBAAuB,WAAY,mBAC9Dh2G,EAAG,GACF,QACD,QACJA,EAAG,GACF,KAAM,CAAC,cACR,OAAO,QAAawtG,EAA+B,CACrD97E,MAAOh2B,EAAMgS,QACbpR,QAASX,EAASqqG,cACjB,KAAM,EAAG,CAAC,OAAQ,eAAgB,CAAC,CAAC97F,EAAoBxO,EAAMgS,UACnE,C,cCzGA,IACEoxF,WAAY,CACVoU,mBAAkB,IAEpB,IAAA91G,GACE,MAAO,CACLs/F,SAAU,CACRpoD,OAAQ,IAGV5mC,SAAS,EAET4oG,kBAAmB,CAAC,EAExB,EACAh5G,SAAU,CACR,IAAAi5G,GACE,MAA6B,OAAtB74G,KAAK84G,MAAMlkF,MACpB,EAEA,eAAAujF,GACE,MAAM5xD,EAAU,CAAC,EAUjB,OATIvmD,KAAKg/F,SAASpoD,QAChB52C,KAAKg/F,SAASpoD,OAAO7pB,QAAQurF,IAC3B,MAAMS,EAAW/4G,KAAK64G,KAAOP,EAAQU,aAAeV,EAAQS,UAAY/4G,KAAKhB,GAAG,yBAA2Bs5G,EAAQS,UAAY/4G,KAAKhB,GAAG,yBAClIunD,EAAQwyD,KACXxyD,EAAQwyD,GAAY,IAEtBxyD,EAAQwyD,GAAU/xF,KAAKsxF,KAGpB/xD,CACT,EAEA,oBAAAkyD,GACE,MAAMQ,EAAiBj5G,KAAKg/F,SAASpoD,QAAQ+P,KAAK1yC,GAAc,yBAATA,EAAElD,IACzD,OAAOkoG,GAAgBn0G,OAAS,EAClC,EAEA,kBAAA4zG,GACE,OAAO14G,KAAK44G,kBAAkB54G,KAAKy4G,uBAAyB,EAC9D,GAEFv4G,MAAO,CAEL,oBAAAu4G,CAAqBS,EAAQC,GAC3B,GAAID,IAAWC,EAAQ,CACrB,MAAMC,EAAqBp5G,KAAKg/F,SAASpoD,QAAQ+P,KAAK1yC,GAAc,uBAATA,EAAElD,IAC7D,GAAIqoG,EAAoB,CACtB,MAAMC,EAAiBr5G,KAAK44G,kBAAkBM,IAAW,GACpDG,EAAepxC,KAAKuiC,GAAMA,EAAGprG,OAASg6G,EAAmBt0G,SAC5Ds0G,EAAmBt0G,MAAQ,GAE/B,CACF,CACF,GAEFzE,QAAS,CACP,SAAAk4G,CAAU/5G,EAAMy0C,GACd,OAAIjzC,KAAK64G,MAAQr6G,EAAKy0C,EAAQ,OAAez0C,EAAKy0C,EAAQ,OACnDz0C,EAAKy0C,IAAU,EACxB,EACA,eAAAulE,CAAgBthE,GACd,OAAIl3C,KAAK64G,MAAQ3hE,EAAOoiE,SAAiBpiE,EAAOoiE,SACzCpiE,EAAO5pC,KAChB,EACA,YAAAg7F,IACE,EAAA3M,GAAA,GAAc,6BAA8B,CAC1C3uE,OAAQ,OACR2wE,QAAS,CACP,eAAgB,oBAElBxa,KAAMruD,KAAKC,UAAU/0B,KAAKg/F,YACzBtnD,KAAK,IAAM13C,KAAK2kG,SAAS5I,QAAQ/7F,KAAKhB,GAAG,0BAC9C,EAEA,4BAAMu6G,GACJ,IACE,MAAMne,QAAiBoe,GAAA,EAAMvkF,IAAI,iBAC7BmmE,EAAS17F,OACXM,KAAK44G,kBAAoBxd,EAAS17F,KAEtC,CAAE,MAAO6pE,GACPxmC,QAAQwmC,MAAM,sCAAuCA,EACvD,CACF,GAEF,OAAAhoE,GACEvB,KAAKgQ,SAAU,EAEfhQ,KAAKu5G,0BAEL,EAAA5d,GAAA,GAAc,8BAA8BjkD,KAAK0jD,GAAYA,EAASU,QAAQpkD,KAAKh4C,IACjFM,KAAKg/F,SAAWt/F,EAEZM,KAAKg/F,SAASpoD,QAChB52C,KAAKg/F,SAASpoD,OAAO7pB,QAAQurF,IACN,YAAjBA,EAAQh5G,OAEmB,kBAAlBg5G,EAAQxzG,MACjBwzG,EAAQxzG,MAA0B,SAAlBwzG,EAAQxzG,WACGgP,IAAlBwkG,EAAQxzG,OAAyC,OAAlBwzG,EAAQxzG,QAEhDwzG,EAAQxzG,MAAQwzG,EAAQ94G,UAAW,QAK1CgwG,QAAQ,KACTxvG,KAAKgQ,SAAU,GAEnB,GCjHF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,UCRA,MAAM,GAAa,CACjBxS,MAAO,mBAEH,GAAa,CACjBA,MAAO,kBAEH,GAAa,CACjBA,MAAO,eAEH,GAAa,CACjBA,MAAO,eAEH,GAAa,CACjBA,MAAO,eAEH,GAAa,CACjBA,MAAO,eAEH,GAAa,CAAC,aACd,GAAa,CACjBA,MAAO,eAEF,SAAS,GAAOI,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACjD2D,EAAwB,KACxBulG,EAAuB,MACvBG,EAA0B,MAC1BG,EAAqB,MACrBF,EAAsB,MACtBH,EAAuB,MACvBC,EAAuB,MACvBwI,EAAgC,GAChCtjG,EAAqB,IAC3B,OAAO,UAAiB,WAAc,QAAoB,MAAO,GAAY,EAAC,QAAoB,MAAO,GAAY,EAAC,QAAoB,KAAM,GAAY,EAAC,SAAiB,QAAiB5O,EAAKoB,GAAG,8BAAgC,IAAK,IAAI,QAAa6C,EAAuB,CAClRM,QAASvE,EAAKoB,GAAG,oCACjBoD,UAAW,SACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,eAAe,QAAaolG,EAAoB,CACrDyC,MAAOnsG,EAAMghG,SAASya,UACtB,cAAe,SACd,CACDj6G,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,qBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMghG,SAASya,UAAUjgD,QACrC,sBAAuB37D,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMghG,SAASya,UAAUjgD,QAAU36D,GAC9FoD,SAAUjE,EAAMghG,SAASya,UAAUlR,OAClC,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,YACPA,EAAG,GACF,EAAG,CAAC,WAAW,QAAoB,KAAM,GAAY,EAAC,SAAiB,QAAiB1E,EAAKoB,GAAG,iCAAmC,IAAK,IAAI,QAAa6C,EAAuB,CACjLM,QAASvE,EAAKoB,GAAG,uCACjBoD,UAAW,QACX,cAAe,IACd,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,eAAe,QAAaolG,EAAoB,CACrDyC,MAAOnsG,EAAMghG,SAAS0a,mBACtB,cAAe,SACd,CACDl6G,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,qBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMghG,SAAS0a,mBAAmBC,WAC9C,sBAAuB97G,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMghG,SAAS0a,mBAAmBC,WAAa96G,GAC1GoD,SAAUjE,EAAMghG,SAAS0a,mBAAmBnR,OAC3C,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,2BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMghG,SAAS0a,mBAAmBE,SAC9C,sBAAuB/7G,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMghG,SAAS0a,mBAAmBE,SAAW/6G,GACxGoD,SAAUjE,EAAMghG,SAAS0a,mBAAmBnR,OAC3C,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO,WACN,CACD9N,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMghG,SAAS0a,mBAAmBG,WAC9C,sBAAuBh8G,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMghG,SAAS0a,mBAAmBG,WAAah7G,GAC1GoD,SAAUjE,EAAMghG,SAAS0a,mBAAmBnR,MAC5CjpG,KAAM,WACN,gBAAiB,GACjBgxG,aAAc,gBACb,KAAM,EAAG,CAAC,aAAc,eAC3BhuG,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,WAAW,QAAoB,KAAM,GAAY,EAAC,SAAiB,QAAiB1E,EAAKoB,GAAG,6BAA+B,IAAK,IAAI,QAAa6C,EAAuB,CAC7KM,QAASvE,EAAKoB,GAAG,mCACjBoD,UAAW,SACV,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,eAAe,QAAaolG,EAAoB,CACrDyC,MAAOnsG,EAAMghG,SAAS8a,eACtB,cAAe,SACd,CACDt6G,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,qBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMghG,SAAS8a,eAAetgD,QAC1C,sBAAuB37D,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMghG,SAAS8a,eAAetgD,QAAU36D,GACnGoD,SAAUjE,EAAMghG,SAAS8a,eAAevR,OACvC,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtD9kE,KAAM,6BACL,CACDn1B,OAAO,QAAS,IAAM,EAAC,QAAoB,OAAQ,MAAM,QAAiB1P,EAAKoB,GAAG,wBAAyB,IAAI,QAAa6C,EAAuB,CACjJM,QAASvE,EAAKoB,GAAG,8BACjBoD,UAAW,QACX,cAAe,IACd,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,cACP9C,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMghG,SAAS8a,eAAeC,WAC1C,sBAAuBl8G,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMghG,SAAS8a,eAAeC,WAAal7G,GACtGoD,SAAUjE,EAAMghG,SAAS8a,eAAevR,OACvC,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,WAAW,QAAoB,KAAM,GAAY,EAAC,SAAiB,QAAiB1E,EAAKoB,GAAG,2BAA6B,IAAK,IAAI,QAAa6C,EAAuB,CAC3KM,QAASvE,EAAKoB,GAAG,iCACjBoD,UAAW,QACX,cAAe,IACd,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,eAAe,QAAaolG,EAAoB,CACrDyC,MAAOnsG,EAAMghG,SAASgb,aACtB,cAAe,SACd,CACDx6G,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,qBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMghG,SAASgb,aAAaxgD,QACxC,sBAAuB37D,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMghG,SAASgb,aAAaxgD,QAAU36D,GACjGoD,SAAUjE,EAAMghG,SAASgb,aAAazR,OACrC,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtD9kE,KAAM,2BACL,CACDn1B,OAAO,QAAS,IAAM,EAAC,QAAoB,OAAQ,MAAM,QAAiB1P,EAAKoB,GAAG,4BAA6B,IAAI,QAAa6C,EAAuB,CACrJO,UAAW,QACX,cAAe,IACd,CACDD,SAAS,QAAS,IAAM,EAAC,QAAoB,MAAO,CAClD9D,MAAO,CACL,YAAa,QACb,cAAe,OAEjBosG,UAAW7sG,EAAKoB,GAAG,mCAClB,KAAM,EAAG,MACZQ,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,MAEL9C,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMghG,SAASgb,aAAaD,WACxC,sBAAuBl8G,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMghG,SAASgb,aAAaD,WAAal7G,GACpGoD,SAAUjE,EAAMghG,SAASgb,aAAazR,MACtC5B,YAAa,0BACZ,KAAM,EAAG,CAAC,aAAc,eAC3BrkG,EAAG,MAELA,EAAG,GACF,EAAG,CAAC,WAAW,QAAoB,KAAM,GAAY,EAAC,SAAiB,QAAiB1E,EAAKoB,GAAG,qBAAuB,IAAK,IAAI,QAAa6C,EAAuB,CACrKM,QAASvE,EAAKoB,GAAG,2BACjBoD,UAAW,QACX,cAAe,IACd,CACD5C,SAAS,QAAS,IAAM,EAAC,QAAatB,EAA8B,CAClEa,KAAM,kBACNV,MAAO,CACL,cAAe,MACf,OAAU,eAGdiE,EAAG,GACF,EAAG,CAAC,eAAe,QAAaolG,EAAoB,CACrDyC,MAAOnsG,EAAMghG,SAASib,OACtB,cAAe,SACd,CACDz6G,SAAS,QAAS,IAAM,EAAC,QAAa+nG,EAAyB,CAC7Dj6F,MAAO1P,EAAKoB,GAAG,qBACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa4nG,EAAsB,CAC1DthG,WAAY9H,EAAMghG,SAASib,OAAOzgD,QAClC,sBAAuB37D,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMghG,SAASib,OAAOzgD,QAAU36D,GAC3FoD,SAAUjE,EAAMghG,SAASib,OAAO1R,OAC/B,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMghG,SAASib,OAAO9O,SAClC,sBAAuBttG,EAAO,KAAOA,EAAO,GAAKgB,GAAUb,EAAMghG,SAASib,OAAO9O,SAAWtsG,GAC5FoD,SAAUjE,EAAMghG,SAASib,OAAO1R,OAC/B,KAAM,EAAG,CAAC,aAAc,eAC3BjmG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,6BACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAagoG,EAAqB,CACzD1hG,WAAY9H,EAAMghG,SAASib,OAAO7O,SAClC,sBAAuBvtG,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMghG,SAASib,OAAO7O,SAAWvsG,GAC9FoD,SAAUjE,EAAMghG,SAASib,OAAO1R,MAChCjpG,KAAM,WACN,gBAAiB,GACjBgxG,aAAc,gBACb,KAAM,EAAG,CAAC,aAAc,eAC3BhuG,EAAG,GACF,EAAG,CAAC,WAAW,QAAailG,EAAyB,CACtDj6F,MAAO1P,EAAKoB,GAAG,kCACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa8nG,EAAsB,CAC1DxhG,WAAY9H,EAAMghG,SAASib,OAAOC,cAClC,sBAAuBr8G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMghG,SAASib,OAAOC,cAAgBr7G,GACnGoD,SAAUjE,EAAMghG,SAASib,OAAO1R,MAChC5B,YAAa/oG,EAAKoB,GAAG,kCACrB25G,UAAW,IACV,CACDn5G,SAAS,QAAS,IAAM,EAAC,QAAa6nG,EAAsB,CAC1D/5F,MAAO,WACPxI,MAAO,cACL,QAAauiG,EAAsB,CACrC/5F,MAAO,gBACPxI,MAAO,UACL,QAAauiG,EAAsB,CACrC/5F,MAAO,KACPxI,MAAO,QACL,QAAauiG,EAAsB,CACrC/5F,MAAO,UACPxI,MAAO,aACL,QAAauiG,EAAsB,CACrC/5F,MAAO,cACPxI,MAAO,iBACL,QAAauiG,EAAsB,CACrC/5F,MAAO,SACPxI,MAAO,aAETxC,EAAG,GACF,EAAG,CAAC,aAAc,WAAY,kBACjCA,EAAG,GACF,EAAG,CAAC,UAAWtE,EAAMghG,SAASib,OAAOC,eAAiBj8G,EAASk8G,kBAAkBzzG,OAAS,IAAK,WAAc,QAAa6gG,EAAyB,CACpJ9oG,IAAK,EACL6O,MAAO1P,EAAKoB,GAAG,gCACd,CACDQ,SAAS,QAAS,IAAM,EAAC,QAAa8nG,EAAsB,CAC1DxhG,WAAY9H,EAAMghG,SAASib,OAAOG,YAClC,sBAAuBv8G,EAAO,MAAQA,EAAO,IAAMgB,GAAUb,EAAMghG,SAASib,OAAOG,YAAcv7G,GACjGoD,SAAUjE,EAAMghG,SAASib,OAAO1R,MAChC5B,YAAa/oG,EAAKoB,GAAG,6BACrB25G,UAAW,IACV,CACDn5G,SAAS,QAAS,IAAM,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYvB,EAASk8G,kBAAmB3P,KAChH,WAAc,QAAanD,EAAsB,CACtD5oG,IAAK+rG,EAAGprG,KACRkO,MAAOk9F,EAAGprG,KACV0F,MAAO0lG,EAAGprG,MACT,KAAM,EAAG,CAAC,QAAS,YACpB,QACJkD,EAAG,GACF,EAAG,CAAC,aAAc,WAAY,kBACjCA,EAAG,GACF,EAAG,CAAC,YAAa,QAAoB,IAAI,KAC5CA,EAAG,GACF,EAAG,CAAC,aAAa,QAAawtG,EAA+B,CAC9D97E,MAAOh2B,EAAMgS,QACbpR,QAASX,EAASqqG,cACjB,KAAM,EAAG,CAAC,OAAQ,eAAgB,CAAC,CAAC97F,EAAoBxO,EAAMgS,UACnE,CCjUA,QACEoxF,WAAY,CACVoU,mBAAkB,IAEpB,IAAA91G,GACE,MAAO,CACLs/F,SAAU,CACRya,UAAW,CAAC,EACZK,eAAgB,CAAC,EACjBJ,mBAAoB,CAAC,EACrBO,OAAQ,CAAC,EACTD,aAAc,CAAC,GAEjBpB,kBAAmB,CAAC,EAGpB5oG,SAAS,EAEb,EACApQ,SAAU,CAER,iBAAAu6G,GACE,MAAM3T,EAAcxmG,KAAKg/F,SAASib,QAAQC,cAC1C,OAAO1T,GAAcxmG,KAAK44G,kBAAkBpS,IAAqB,EACnE,GAEFtmG,MAAO,CACL,kCAEMF,KAAKg/F,SAASib,SAChBj6G,KAAKg/F,SAASib,OAAOG,YAAc,GAEvC,GAEF/5G,QAAS,CACP,YAAAioG,IACE,EAAA3M,GAAA,GAAc,+BAAgC,CAC5C3uE,OAAQ,OACR2wE,QAAS,CACP,eAAgB,oBAElBxa,KAAMruD,KAAKC,UAAU/0B,KAAKg/F,YACzBtnD,KAAK,IAAM13C,KAAK2kG,SAAS5I,QAAQ/7F,KAAKhB,GAAG,4BAC9C,EACA,4BAAMu6G,GACJ,IACE,MAAMne,QAAiB,EAAAO,GAAA,GAAc,iBACjCP,EAAS56E,KACXxgB,KAAK44G,wBAA0Bxd,EAASU,OAE5C,CAAE,MAAOvyB,GACPxmC,QAAQwmC,MAAM,sCAAuCA,EACvD,CACF,GAEF,OAAAhoE,GACEvB,KAAKgQ,SAAU,GAEf,EAAA2rF,GAAA,GAAc,gCAAgCjkD,KAAK0jD,GAAYA,EAASU,QAAQpkD,KAAKh4C,IACnFM,KAAKg/F,SAAWt/F,IACf8vG,QAAQ,KACTxvG,KAAKgQ,SAAU,IAGjBhQ,KAAKu5G,wBACP,GC7DF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,U,YCCA,IACEn6G,KAAM,eACNi7G,OAAQ,CAACC,GAAA,GACT,IAAA56G,GACE,MAAO,CACLf,YAAa,SACb4D,mBAAmB,EAEvB,EACArC,MAAO,CAEL,cAAe,CACb0G,WAAW,EACX,OAAAC,CAAQ0zG,GACNv6G,KAAKrB,YAAc47G,EAAQ75F,QAAQ,IAAK,IACxC5gB,OAAO06G,SAAS,EAAG,EACrB,GAEF,WAAA77G,CAAY87G,GAEV,MAAMC,EAAO,IAAID,IACjBz6G,KAAKk4G,QAAQlxF,KAAK,CAChB0zF,QAEJ,GAEFtZ,WAAY,CACVuZ,cAAa,IACbC,cAAa,EACbC,aAAY,GACZC,aAAY,GACZC,eAAc,GACdC,WAAU,GACVC,aAAY,IAEdr7G,SAAU,CACR,cAAAsC,GACE,OAAOpC,OAAOC,WAAa,GAC7B,EAEA,gBAAAyC,GACE,MAAMk4G,EAAO16G,KAAKk7G,OAAOR,KAAKh6F,QAAQ,IAAK,IAC3C,OAAQg6F,GACN,IAAK,SACH,OAAOG,GACT,IAAK,SACH,OAAOC,GACT,IAAK,WACH,OAAOC,GACT,IAAK,OACH,OAAOC,GACT,IAAK,SACH,OAAOC,GACT,QACE,OAAOJ,GAEb,GAEFx6G,QAAS,CACP,YAAAgC,GACE,MAAMk9F,EAA8C,mBACpD4b,MAAM5b,EAAK,CACTvyE,OAAQ,OACRouF,YAAa,UACbzd,QAAS,CACP,eAAgB,oBAElBxa,KAAMruD,KAAKC,UAAU,CACnBsmF,SAAU,YAEX7L,QAAQ,KACTxvG,KAAKg4G,OAAOC,OAAO,oBAAoB,GACvCj4G,KAAKk4G,QAAQlxF,KAAK,gBAEtB,EAEA,cAAAs0F,GACE,MAAMC,EAAc,UACpBz7G,OAAO07G,SAASd,KAAOa,EACvBv7G,KAAKrB,YAAc48G,EAAY76F,QAAQ,IAAK,GAC9C,GAEF,OAAAnf,GAEEvB,KAAKy7G,qBAAqB,aAAc,cAAc,GAAO,GAGxD37G,OAAO07G,SAASd,MACnB16G,KAAKs7G,gBAET,GC7FF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,S,iMCRA,MAAM/9G,EAAa,CACjBkB,IAAK,EACLjB,MAAO,mBACPk+G,QAAS,gBACTC,MAAO,8BAEHl+G,EAAa,CACjBgB,IAAK,EACLjB,MAAO,mBACPk+G,QAAS,gBACTC,MAAO,8BAEHj+G,EAAa,CACjBe,IAAK,EACLjB,MAAO,mBACPk+G,QAAS,gBACTC,MAAO,8BAEF,SAASh+G,EAAOC,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMC,GAA+B,QAAkB,qBACvD,OAAO,WAAc,QAAoB,QAAQ,QAAYN,EAAKg+G,OAAQ,CACxEp+G,MAAO,yBACL,CAAiB,aAAhBM,EAAOwB,OAAuB,WAAc,QAAoB,MAAO/B,EAAY,IAAKM,EAAO,KAAOA,EAAO,GAAK,EAAC,QAAoB,OAAQ,CAClJiV,EAAG,kdACF,MAAO,QAA2B,gBAAhBhV,EAAOwB,OAA0B,WAAc,QAAoB,MAAO7B,EAAY,IAAKI,EAAO,KAAOA,EAAO,GAAK,EAAC,QAAmB,o8QAAy+Q,QAA2B,WAAhBC,EAAOwB,OAAqB,WAAc,QAAoB,MAAO5B,EAAY,IAAKG,EAAO,KAAOA,EAAO,GAAK,EAAC,QAAoB,OAAQ,CAC7xRiV,EAAG,ymEACF,MAAO,UAAY,WAAc,QAAa5U,EAA8B,CAC7EO,IAAK,EACLM,KAAMd,EAAS49G,iBACd,KAAM,EAAG,CAAC,WAAY,GAC3B,CC/BA,OACEz8G,KAAM,cACN08G,cAAc,EACdz8G,MAAO,CACLC,KAAM,CACJA,KAAMC,OACN82F,UAAU,IAGdz2F,SAAU,CACR,eAAAi8G,GACE,MAAME,EAAQ,CACZlO,KAAM,CAAC,MAAO,cACdC,GAAI,CAAC,MAAO,OACZC,QAAS,CAAC,MAAO,YAEnB,OAAOgO,EAAM/7G,KAAKV,OAAS,QAC7B,I,WCVJ,MAAMqC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAShE,GAAQ,CAAC,YAAY,qBAEzF,O,mLCTA,SAASq+G,EAAQt1F,GAGf,OAAOs1F,EAAU,mBAAqB3yF,QAAU,iBAAmBA,OAAO4yF,SAAW,SAAUv1F,GAC7F,cAAcA,CAChB,EAAI,SAAUA,GACZ,OAAOA,GAAK,mBAAqB2C,QAAU3C,EAAEtE,cAAgBiH,QAAU3C,IAAM2C,OAAOxF,UAAY,gBAAkB6C,CACpH,EAAGs1F,EAAQt1F,EACb,CCPA,SAAS4C,EAAY9H,EAAGlO,GACtB,GAAI,UAAY0oG,EAAQx6F,KAAOA,EAAG,OAAOA,EACzC,IAAIzO,EAAIyO,EAAE6H,OAAOC,aACjB,QAAI,IAAWvW,EAAG,CAChB,IAAIyB,EAAIzB,EAAEgR,KAAKvC,EAAGlO,GAAK,WACvB,GAAI,UAAY0oG,EAAQxnG,GAAI,OAAOA,EACnC,MAAM,IAAIgmF,UAAU,+CACtB,CACA,OAAQ,WAAalnF,EAAI/T,OAASiG,QAAQgc,EAC5C,CCRA,SAAS06F,EAAc16F,GACrB,IAAIhN,EAAI8U,EAAY9H,EAAG,UACvB,MAAO,UAAYw6F,EAAQxnG,GAAKA,EAAIA,EAAI,EAC1C,CCJA,SAASkxC,EAAgB3yC,EAAGO,EAAGkO,GAC7B,OAAQlO,EAAI4oG,EAAc5oG,MAAOP,EAAI/E,OAAO4e,eAAe7Z,EAAGO,EAAG,CAC/DxO,MAAO0c,EACPsL,YAAY,EACZD,cAAc,EACd6O,UAAU,IACP3oB,EAAEO,GAAKkO,EAAGzO,CACjB,C","sources":["webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?54ab","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?cf73","webpack://sanyue_imghub/./src/views/SystemConfig.vue?c088","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue?5501","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue?7c9a","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?9618","webpack://sanyue_imghub/./node_modules/@kurkle/color/dist/color.esm.js","webpack://sanyue_imghub/../../src/helpers/helpers.core.ts","webpack://sanyue_imghub/../../src/helpers/helpers.math.ts","webpack://sanyue_imghub/../../src/helpers/helpers.collection.ts","webpack://sanyue_imghub/../../src/helpers/helpers.extras.ts","webpack://sanyue_imghub/../../src/helpers/helpers.easing.ts","webpack://sanyue_imghub/../../src/helpers/helpers.color.ts","webpack://sanyue_imghub/../../src/core/core.animations.defaults.js","webpack://sanyue_imghub/../../src/core/core.layouts.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.intl.ts","webpack://sanyue_imghub/../../src/core/core.ticks.js","webpack://sanyue_imghub/../../src/core/core.scale.defaults.js","webpack://sanyue_imghub/../../src/core/core.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.canvas.ts","webpack://sanyue_imghub/../../src/helpers/helpers.options.ts","webpack://sanyue_imghub/../../src/helpers/helpers.config.ts","webpack://sanyue_imghub/../../src/helpers/helpers.curve.ts","webpack://sanyue_imghub/../../src/helpers/helpers.dom.ts","webpack://sanyue_imghub/../../src/helpers/helpers.interpolation.ts","webpack://sanyue_imghub/../../src/helpers/helpers.rtl.ts","webpack://sanyue_imghub/../../src/helpers/helpers.segment.js","webpack://sanyue_imghub/../../src/helpers/helpers.dataset.ts","webpack://sanyue_imghub/../src/core/core.animator.js","webpack://sanyue_imghub/../src/core/core.animation.js","webpack://sanyue_imghub/../src/core/core.animations.js","webpack://sanyue_imghub/../src/core/core.datasetController.js","webpack://sanyue_imghub/../src/controllers/controller.bar.js","webpack://sanyue_imghub/../src/controllers/controller.bubble.js","webpack://sanyue_imghub/../src/controllers/controller.doughnut.js","webpack://sanyue_imghub/../src/controllers/controller.line.js","webpack://sanyue_imghub/../src/controllers/controller.polarArea.js","webpack://sanyue_imghub/../src/controllers/controller.pie.js","webpack://sanyue_imghub/../src/controllers/controller.radar.js","webpack://sanyue_imghub/../src/controllers/controller.scatter.js","webpack://sanyue_imghub/../src/core/core.adapters.ts","webpack://sanyue_imghub/../src/core/core.interaction.js","webpack://sanyue_imghub/../src/core/core.layouts.js","webpack://sanyue_imghub/../src/platform/platform.base.js","webpack://sanyue_imghub/../src/platform/platform.basic.js","webpack://sanyue_imghub/../src/platform/platform.dom.js","webpack://sanyue_imghub/../src/platform/index.js","webpack://sanyue_imghub/../src/core/core.element.ts","webpack://sanyue_imghub/../src/core/core.scale.autoskip.js","webpack://sanyue_imghub/../src/core/core.scale.js","webpack://sanyue_imghub/../src/core/core.typedRegistry.js","webpack://sanyue_imghub/../src/core/core.registry.js","webpack://sanyue_imghub/../src/core/core.plugins.js","webpack://sanyue_imghub/../src/core/core.config.js","webpack://sanyue_imghub/../src/core/core.controller.js","webpack://sanyue_imghub/../src/elements/element.arc.ts","webpack://sanyue_imghub/../src/elements/element.line.js","webpack://sanyue_imghub/../src/elements/element.point.ts","webpack://sanyue_imghub/../src/elements/element.bar.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.segment.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.helper.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.options.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.target.stack.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/simpleArc.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.target.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.drawing.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/index.js","webpack://sanyue_imghub/../src/plugins/plugin.legend.js","webpack://sanyue_imghub/../src/plugins/plugin.subtitle.js","webpack://sanyue_imghub/../src/plugins/plugin.tooltip.js","webpack://sanyue_imghub/../src/scales/scale.category.js","webpack://sanyue_imghub/../src/scales/scale.linearbase.js","webpack://sanyue_imghub/../src/scales/scale.linear.js","webpack://sanyue_imghub/../src/scales/scale.logarithmic.js","webpack://sanyue_imghub/../src/scales/scale.radialLinear.js","webpack://sanyue_imghub/../src/scales/scale.time.js","webpack://sanyue_imghub/../src/scales/scale.timeseries.js","webpack://sanyue_imghub/../src/props.ts","webpack://sanyue_imghub/../src/utils.ts","webpack://sanyue_imghub/../src/chart.ts","webpack://sanyue_imghub/../src/typedCharts.ts","webpack://sanyue_imghub/./src/utils/batchProcessor.js","webpack://sanyue_imghub/./src/utils/indexRebuilder.js","webpack://sanyue_imghub/./src/utils/backupGenerator.js","webpack://sanyue_imghub/./src/utils/restoreProcessor.js","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?ce78","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?6aa1","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?1e7e","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?8495","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?a7b6","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?6295","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?45e6","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?8a8c","webpack://sanyue_imghub/./src/utils/tokenExpiration.js","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?3739","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?0bc4","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?4209","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?5501","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?780f","webpack://sanyue_imghub/./src/views/SystemConfig.vue","webpack://sanyue_imghub/./src/views/SystemConfig.vue?d269","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?4482","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?8c05","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/defineProperty.js"],"sourcesContent":["import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = {\n class: \"menu-list\"\n};\nconst _hoisted_2 = [\"onClick\"];\nconst _hoisted_3 = {\n class: \"menu-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"sidebar-container\", {\n 'is-collapsed': $props.isCollapse\n }]),\n ref: \"sidebar\",\n style: _normalizeStyle($options.sidebarStyle)\n }, [_createElementVNode(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.menuItems, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.index,\n class: _normalizeClass([\"menu-item\", {\n 'is-active': $props.activeIndex === item.index\n }]),\n onClick: $event => $options.handleSelect(item.index)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: item.icon,\n class: \"menu-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t(item.titleKey)), 1)], 10, _hoisted_2);\n }), 128))]), _createElementVNode(\"div\", {\n class: \"toggle-button\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleCollapse && $options.toggleCollapse(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $props.isCollapse ? 'angle-double-right' : 'angle-double-left'\n }, null, 8, [\"icon\"])])], 6);\n}","export default {\n name: 'SysConfigTabs',\n props: {\n activeIndex: {\n type: String,\n default: 'status'\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n expandedWidth: null,\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n titleKey: 'sysConfigTabs.systemStatus'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n titleKey: 'sysConfigTabs.uploadSettings'\n }, {\n index: 'security',\n icon: 'shield',\n titleKey: 'sysConfigTabs.securitySettings'\n }, {\n index: 'page',\n icon: 'pager',\n titleKey: 'sysConfigTabs.pageSettings'\n }, {\n index: 'others',\n icon: 'cog',\n titleKey: 'sysConfigTabs.otherSettings'\n }]\n };\n },\n computed: {\n collapsedWidth() {\n return window.innerWidth <= 768 ? 50 : 56;\n },\n sidebarStyle() {\n if (this.isCollapse) {\n return {\n width: this.collapsedWidth + 'px'\n };\n }\n return this.expandedWidth ? {\n width: this.expandedWidth + 'px'\n } : {};\n }\n },\n watch: {\n '$i18n.locale'() {\n this.$nextTick(() => this.measureWidth());\n }\n },\n methods: {\n toggleCollapse() {\n this.$emit('update:isCollapse', !this.isCollapse);\n },\n checkMobile() {\n const isMobile = window.innerWidth <= 768;\n this.$emit('update:isCollapse', isMobile);\n },\n handleSelect(index) {\n this.$emit('update:activeIndex', index);\n },\n measureWidth() {\n const el = this.$refs.sidebar;\n if (!el) return;\n // Temporarily expand to measure natural content width\n const prevWidth = el.style.width;\n const prevTransition = el.style.transition;\n const wasCollapsed = el.classList.contains('is-collapsed');\n el.style.transition = 'none';\n if (wasCollapsed) {\n el.classList.remove('is-collapsed');\n }\n el.style.width = 'auto';\n // Force reflow to apply changes\n void el.offsetWidth;\n const natural = el.scrollWidth;\n // Restore original state\n el.style.width = prevWidth;\n if (wasCollapsed) {\n el.classList.add('is-collapsed');\n }\n void el.offsetWidth;\n el.style.transition = prevTransition;\n this.expandedWidth = natural;\n }\n },\n mounted() {\n this.checkMobile();\n this.$nextTick(() => this.measureWidth());\n window.addEventListener('resize', this.checkMobile);\n },\n beforeDestroy() {\n window.removeEventListener('resize', this.checkMobile);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysConfigTabs.vue?vue&type=template&id=2718059d&scoped=true\"\nimport script from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\nexport * from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\n\nimport \"./SysConfigTabs.vue?vue&type=style&index=0&id=2718059d&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2718059d\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_SysConfigTabs = _resolveComponent(\"SysConfigTabs\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"systemConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('sysConfig.logout'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])]),\n _: 1\n }), _createVNode(_component_SysConfigTabs, {\n activeIndex: $data.activeIndex,\n \"onUpdate:activeIndex\": _cache[0] || (_cache[0] = $event => $data.activeIndex = $event),\n isCollapse: $data.isSidebarCollapse,\n \"onUpdate:isCollapse\": _cache[1] || (_cache[1] = $event => $data.isSidebarCollapse = $event)\n }, null, 8, [\"activeIndex\", \"isCollapse\"]), (_openBlock(), _createBlock(_resolveDynamicComponent($options.currentComponent), {\n class: _normalizeClass(['main-container', {\n 'collapsed': $data.isSidebarCollapse\n }])\n }, null, 8, [\"class\"]))]);\n}","import { vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"date-range-calendar\"\n};\nconst _hoisted_2 = {\n class: \"selected-range\"\n};\nconst _hoisted_3 = {\n class: \"selected-range-inputs\"\n};\nconst _hoisted_4 = [\"aria-label\"];\nconst _hoisted_5 = {\n class: \"date-range-separator\"\n};\nconst _hoisted_6 = [\"aria-label\"];\nconst _hoisted_7 = {\n class: \"calendar-header\"\n};\nconst _hoisted_8 = [\"aria-label\"];\nconst _hoisted_9 = {\n class: \"calendar-title\"\n};\nconst _hoisted_10 = [\"aria-label\"];\nconst _hoisted_11 = {\n class: \"calendar-weekdays\"\n};\nconst _hoisted_12 = {\n class: \"calendar-grid\"\n};\nconst _hoisted_13 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [_withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.inputStart = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.startDateLabel,\n onChange: _cache[1] || (_cache[1] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_4), [[_vModelText, $data.inputStart, void 0, {\n trim: true\n }]]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString($options.rangeSeparator), 1), _withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.inputEnd = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.endDateLabel,\n onChange: _cache[3] || (_cache[3] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_6), [[_vModelText, $data.inputEnd, void 0, {\n trim: true\n }]])])]), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.previousMonthLabel,\n onClick: _cache[4] || (_cache[4] = (...args) => $options.goToPreviousMonth && $options.goToPreviousMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-left\"\n })], 8, _hoisted_8), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.monthTitle), 1), _createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.nextMonthLabel,\n onClick: _cache[5] || (_cache[5] = (...args) => $options.goToNextMonth && $options.goToNextMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-right\"\n })], 8, _hoisted_10)]), _createElementVNode(\"div\", _hoisted_11, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.weekdayLabels, weekday => {\n return _openBlock(), _createElementBlock(\"span\", {\n key: weekday\n }, _toDisplayString(weekday), 1);\n }), 128))]), _createElementVNode(\"div\", _hoisted_12, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.calendarDays, day => {\n return _openBlock(), _createElementBlock(\"button\", {\n key: day.key,\n type: \"button\",\n class: _normalizeClass([\"calendar-day\", {\n 'is-muted': !day.isCurrentMonth,\n 'is-today': day.isToday,\n 'is-range-start': day.key === $data.draftStart,\n 'is-range-end': day.key === $data.draftEnd,\n 'is-in-range': $options.isInRange(day.key)\n }]),\n onClick: $event => $options.selectDay(day.key)\n }, _toDisplayString(day.dayOfMonth), 11, _hoisted_13);\n }), 128))])]);\n}","const DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateKey(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction parseDateKey(value) {\n if (typeof value !== 'string') return null;\n const match = value.trim().match(/^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})$/);\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]) - 1;\n const day = Number(match[3]);\n const date = new Date(year, month, day);\n if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) {\n return null;\n }\n date.setHours(0, 0, 0, 0);\n return date;\n}\nfunction shiftMonth(date, amount) {\n return new Date(date.getFullYear(), date.getMonth() + amount, 1);\n}\nexport default {\n name: 'DateRangeCalendar',\n props: {\n modelValue: {\n type: Array,\n default: () => []\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return {\n displayYear: today.getFullYear(),\n displayMonth: today.getMonth(),\n draftStart: '',\n draftEnd: '',\n inputStart: '',\n inputEnd: '',\n awaitingEnd: false\n };\n },\n computed: {\n previousMonthLabel() {\n return this.$t('dateRangeCalendar.previousMonth');\n },\n nextMonthLabel() {\n return this.$t('dateRangeCalendar.nextMonth');\n },\n startDateLabel() {\n return this.$t('dateRangeCalendar.startDate');\n },\n endDateLabel() {\n return this.$t('dateRangeCalendar.endDate');\n },\n rangeSeparator() {\n return this.$t('dateRangeCalendar.rangeSeparator');\n },\n monthTitle() {\n return this.$t('dateRangeCalendar.monthTitle', {\n year: this.displayYear,\n month: padDatePart(this.displayMonth + 1)\n });\n },\n weekdayLabels() {\n return [this.$t('dateRangeCalendar.weekdaySun'), this.$t('dateRangeCalendar.weekdayMon'), this.$t('dateRangeCalendar.weekdayTue'), this.$t('dateRangeCalendar.weekdayWed'), this.$t('dateRangeCalendar.weekdayThu'), this.$t('dateRangeCalendar.weekdayFri'), this.$t('dateRangeCalendar.weekdaySat')];\n },\n calendarDays() {\n const monthStart = new Date(this.displayYear, this.displayMonth, 1);\n const start = new Date(this.displayYear, this.displayMonth, 1 - monthStart.getDay());\n const todayKey = formatDateKey(new Date());\n return Array.from({\n length: 42\n }, (_, index) => {\n const date = new Date(start.getTime() + index * DAY_MS);\n const key = formatDateKey(date);\n return {\n key,\n dayOfMonth: date.getDate(),\n isCurrentMonth: date.getMonth() === this.displayMonth,\n isToday: key === todayKey\n };\n });\n }\n },\n watch: {\n modelValue: {\n immediate: true,\n handler(value) {\n this.syncFromModel(value);\n }\n }\n },\n methods: {\n syncFromModel(value) {\n const startDate = parseDateKey(value?.[0]);\n const endDate = parseDateKey(value?.[1]);\n this.draftStart = startDate ? formatDateKey(startDate) : '';\n this.draftEnd = endDate ? formatDateKey(endDate) : '';\n this.inputStart = this.draftStart;\n this.inputEnd = this.draftEnd;\n this.awaitingEnd = false;\n const displayDate = startDate || endDate;\n if (displayDate) {\n this.displayYear = displayDate.getFullYear();\n this.displayMonth = displayDate.getMonth();\n }\n },\n goToPreviousMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), -1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n goToNextMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), 1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n selectDay(key) {\n if (!this.draftStart || this.draftEnd || !this.awaitingEnd) {\n this.draftStart = key;\n this.draftEnd = '';\n this.inputStart = key;\n this.inputEnd = '';\n this.awaitingEnd = true;\n return;\n }\n const range = key < this.draftStart ? [key, this.draftStart] : [this.draftStart, key];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.commitRange(range);\n },\n handleManualInput() {\n const startDate = parseDateKey(this.inputStart);\n const endDate = parseDateKey(this.inputEnd);\n if (!startDate || !endDate) return;\n const startKey = formatDateKey(startDate);\n const endKey = formatDateKey(endDate);\n const range = startKey <= endKey ? [startKey, endKey] : [endKey, startKey];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.displayYear = startDate.getFullYear();\n this.displayMonth = startDate.getMonth();\n this.commitRange(range);\n },\n commitRange(range) {\n this.$emit('update:modelValue', range);\n this.$emit('change', range);\n },\n isInRange(key) {\n return Boolean(this.draftStart && this.draftEnd && key > this.draftStart && key < this.draftEnd);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DateRangeCalendar.vue?vue&type=template&id=65a4b58c&scoped=true\"\nimport script from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\nexport * from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\n\nimport \"./DateRangeCalendar.vue?vue&type=style&index=0&id=65a4b58c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-65a4b58c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"status-panel\"\n};\nconst _hoisted_2 = {\n class: \"overview-cards\"\n};\nconst _hoisted_3 = {\n class: \"card-icon\"\n};\nconst _hoisted_4 = {\n class: \"card-content\"\n};\nconst _hoisted_5 = {\n class: \"card-title\"\n};\nconst _hoisted_6 = {\n class: \"card-value\"\n};\nconst _hoisted_7 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_8 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_9 = {\n class: \"card-icon\"\n};\nconst _hoisted_10 = {\n class: \"card-content\"\n};\nconst _hoisted_11 = {\n class: \"card-title\"\n};\nconst _hoisted_12 = {\n class: \"card-value\"\n};\nconst _hoisted_13 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_14 = {\n class: \"card-icon\"\n};\nconst _hoisted_15 = {\n class: \"card-content\"\n};\nconst _hoisted_16 = {\n class: \"card-title\"\n};\nconst _hoisted_17 = {\n class: \"card-value\"\n};\nconst _hoisted_18 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_19 = {\n class: \"charts-section\"\n};\nconst _hoisted_20 = {\n class: \"chart-card trend-chart-card\"\n};\nconst _hoisted_21 = {\n class: \"chart-header trend-chart-header\"\n};\nconst _hoisted_22 = {\n class: \"chart-title\"\n};\nconst _hoisted_23 = {\n class: \"trend-controls\"\n};\nconst _hoisted_24 = {\n class: \"trend-date-panel\"\n};\nconst _hoisted_25 = {\n class: \"chart-content trend-chart-content\"\n};\nconst _hoisted_26 = {\n key: 0,\n class: \"empty-state trend-empty-state\"\n};\nconst _hoisted_27 = {\n key: 1,\n class: \"line-chart-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"chart-card\"\n};\nconst _hoisted_29 = {\n class: \"chart-header\"\n};\nconst _hoisted_30 = {\n class: \"chart-content\"\n};\nconst _hoisted_31 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_33 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_34 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_35 = {\n class: \"center-value\"\n};\nconst _hoisted_36 = {\n class: \"center-label\"\n};\nconst _hoisted_37 = {\n class: \"chart-legend\"\n};\nconst _hoisted_38 = {\n class: \"legend-label\"\n};\nconst _hoisted_39 = {\n class: \"legend-value\"\n};\nconst _hoisted_40 = {\n class: \"legend-percent\"\n};\nconst _hoisted_41 = {\n class: \"chart-card\"\n};\nconst _hoisted_42 = {\n class: \"chart-header\"\n};\nconst _hoisted_43 = {\n class: \"chart-content\"\n};\nconst _hoisted_44 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_45 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_46 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_47 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_48 = {\n class: \"center-value\"\n};\nconst _hoisted_49 = {\n class: \"center-label\"\n};\nconst _hoisted_50 = {\n class: \"chart-legend\"\n};\nconst _hoisted_51 = {\n class: \"legend-label\"\n};\nconst _hoisted_52 = {\n class: \"legend-value\"\n};\nconst _hoisted_53 = {\n class: \"legend-percent\"\n};\nconst _hoisted_54 = {\n class: \"actions-section\"\n};\nconst _hoisted_55 = {\n class: \"action-card\"\n};\nconst _hoisted_56 = {\n class: \"action-header\"\n};\nconst _hoisted_57 = {\n class: \"action-content\"\n};\nconst _hoisted_58 = {\n key: 0,\n class: \"progress-container\"\n};\nconst _hoisted_59 = {\n class: \"progress-header\"\n};\nconst _hoisted_60 = {\n class: \"progress-phase\"\n};\nconst _hoisted_61 = {\n class: \"progress-percentage\"\n};\nconst _hoisted_62 = {\n class: \"progress-details\"\n};\nconst _hoisted_63 = {\n key: 0,\n class: \"progress-count\"\n};\nconst _hoisted_64 = {\n key: 1,\n class: \"progress-time\"\n};\nconst _hoisted_65 = {\n key: 0,\n class: \"progress-message\"\n};\nconst _hoisted_66 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_67 = {\n class: \"error-icon\"\n};\nconst _hoisted_68 = {\n class: \"error-content\"\n};\nconst _hoisted_69 = {\n class: \"error-message\"\n};\nconst _hoisted_70 = {\n key: 0,\n class: \"error-suggestion\"\n};\nconst _hoisted_71 = {\n class: \"error-actions\"\n};\nconst _hoisted_72 = {\n key: 2,\n class: \"action-buttons\"\n};\nconst _hoisted_73 = {\n class: \"restore-section\"\n};\nconst _hoisted_74 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_75 = [\"src\"];\nconst _hoisted_76 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_77 = {\n class: \"file-card-header\"\n};\nconst _hoisted_78 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_79 = {\n class: \"file-name\"\n};\nconst _hoisted_80 = {\n class: \"file-meta\"\n};\nconst _hoisted_81 = [\"src\"];\nconst _hoisted_82 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_83 = {\n class: \"file-card-header warning\"\n};\nconst _hoisted_84 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_85 = {\n class: \"file-name\"\n};\nconst _hoisted_86 = {\n class: \"file-meta\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_DateRangeCalendar = _resolveComponent(\"DateRangeCalendar\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_Line = _resolveComponent(\"Line\");\n const _component_Doughnut = _resolveComponent(\"Doughnut\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", {\n class: \"overview-card total-files\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.fetchIndexInfo && $options.fetchIndexInfo(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\"\n })]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, _toDisplayString(_ctx.$t('sysStatus.totalFiles')), 1), _createElementVNode(\"div\", _hoisted_6, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_7, _toDisplayString(_ctx.$t('sysStatus.clickToRefresh')), 1)])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(_ctx.$t('sysStatus.indexUpdateTime')), 1), _createElementVNode(\"div\", _hoisted_12, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_13, _toDisplayString($options.getTimeAgo($data.indexInfo.lastUpdated)), 1)])]), _createElementVNode(\"div\", {\n class: \"overview-card system-version\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.openReleases && $options.openReleases(...args))\n }, [_createElementVNode(\"div\", _hoisted_14, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, _toDisplayString(_ctx.$t('sysStatus.systemVersion')), 1), _createElementVNode(\"div\", _hoisted_17, \"v\" + _toDisplayString($data.version), 1), _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('sysStatus.clickToViewChangelog')), 1)])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"chart-line\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.uploadTrend')), 1), _createVNode(_component_el_button, {\n class: \"trend-calendar-btn\",\n circle: \"\",\n \"aria-label\": _ctx.$t('sysStatus.selectDateRange'),\n onClick: $options.openTrendDateDialog\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"calendar\"\n })]),\n _: 1\n }, 8, [\"aria-label\", \"onClick\"])]), _createElementVNode(\"div\", _hoisted_23, [_createVNode(_component_el_radio_group, {\n modelValue: $data.trendGroupBy,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.trendGroupBy = $event),\n size: \"small\",\n class: \"trend-group-switch\",\n \"aria-label\": _ctx.$t('sysStatus.uploadTrendGroupBy')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"channel\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelType')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"channelName\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelName')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"aria-label\"])])]), _createVNode(_component_el_dialog, {\n modelValue: $data.trendDatePickerVisible,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.trendDatePickerVisible = $event),\n title: _ctx.$t('sysStatus.selectDateRange'),\n width: $options.trendDateDialogWidth,\n class: \"trend-date-dialog\",\n \"align-center\": \"\",\n \"append-to-body\": \"\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [_createVNode(_component_DateRangeCalendar, {\n modelValue: $data.trendDateRange,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.trendDateRange = $event),\n onChange: $options.handleTrendDateRangeChange\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createElementVNode(\"div\", _hoisted_25, [!$options.hasTrendData ? (_openBlock(), _createElementBlock(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_27, [_createVNode(_component_Line, {\n data: $options.uploadTrendChartData,\n options: $options.lineChartOptions\n }, null, 8, [\"data\", \"options\"])]))])]), _createElementVNode(\"div\", _hoisted_28, [_createElementVNode(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.channelDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_30, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createElementVNode(\"div\", _hoisted_33, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"div\", _hoisted_35, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_36, _toDisplayString(_ctx.$t('sysStatus.totalFilesLabel')), 1)])]), _createElementVNode(\"div\", _hoisted_37, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.channelStats, (count, channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_38, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_39, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_40, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_41, [_createElementVNode(\"div\", _hoisted_42, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.fileStatusDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_43, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_44, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [_createElementVNode(\"div\", _hoisted_46, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_47, [_createElementVNode(\"div\", _hoisted_48, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _createElementVNode(\"div\", _hoisted_49, _toDisplayString(_ctx.$t('sysStatus.statusTypes')), 1)])]), _createElementVNode(\"div\", _hoisted_50, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.aggregatedTypeStats, (count, status, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: status,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getTypeChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_51, _toDisplayString(status), 1), _createElementVNode(\"span\", _hoisted_52, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_53, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_54, [_createElementVNode(\"div\", _hoisted_55, [_createElementVNode(\"div\", _hoisted_56, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.systemMaintenance')), 1)]), _createElementVNode(\"div\", _hoisted_57, [$data.isProcessing ? (_openBlock(), _createElementBlock(\"div\", _hoisted_58, [_createElementVNode(\"div\", _hoisted_59, [_createElementVNode(\"span\", _hoisted_60, _toDisplayString($options.phaseDescription), 1), _createElementVNode(\"span\", _hoisted_61, _toDisplayString(Math.round($data.processingProgress.percentage)) + \"%\", 1)]), _createVNode(_component_el_progress, {\n percentage: $data.processingProgress.percentage,\n \"stroke-width\": 12,\n \"show-text\": false,\n class: \"progress-bar\"\n }, null, 8, [\"percentage\"]), _createElementVNode(\"div\", _hoisted_62, [$data.processingProgress.current > 0 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_63, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.processingProgress.current.toLocaleString()) + \" \", 1), $data.processingProgress.total > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createTextVNode(\" / \" + _toDisplayString($data.processingProgress.total.toLocaleString()), 1)], 64)) : _createCommentVNode(\"\", true), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.records')), 1)])) : _createCommentVNode(\"\", true), $options.estimatedTimeRemaining ? (_openBlock(), _createElementBlock(\"span\", _hoisted_64, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n }), _createTextVNode(\" \" + _toDisplayString($options.estimatedTimeRemaining), 1)])) : _createCommentVNode(\"\", true)]), $data.processingProgress.message ? (_openBlock(), _createElementBlock(\"div\", _hoisted_65, _toDisplayString($data.processingProgress.message), 1)) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n size: \"small\",\n onClick: $options.cancelOperation,\n class: \"cancel-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.cancelOperation')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : $data.processingError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_66, [_createElementVNode(\"div\", _hoisted_67, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\"\n })]), _createElementVNode(\"div\", _hoisted_68, [_createElementVNode(\"div\", _hoisted_69, _toDisplayString($data.processingError.message), 1), $data.processingError.suggestion ? (_openBlock(), _createElementBlock(\"div\", _hoisted_70, _toDisplayString($data.processingError.suggestion), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_71, [$data.processingError.recoverable ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n size: \"small\",\n onClick: $options.retryOperation\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"default\",\n size: \"small\",\n onClick: $options.dismissError\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.close')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_72, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.rebuildTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n disabled: $data.isProcessing,\n onClick: $options.rebuildIndex,\n class: \"action-btn rebuild-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.rebuilding ? _ctx.$t('sysStatus.rebuilding') : _ctx.$t('sysStatus.rebuildIndex')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.backupTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n disabled: $data.isProcessing,\n onClick: $options.backupData,\n class: \"action-btn backup-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n }), _createTextVNode(\" \" + _toDisplayString($data.backing ? _ctx.$t('sysStatus.backingUp') : _ctx.$t('sysStatus.backupData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.restoreTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_73, [_createElementVNode(\"input\", {\n type: \"file\",\n ref: \"fileInput\",\n accept: \".json\",\n onChange: _cache[5] || (_cache[5] = (...args) => $options.handleFileSelect && $options.handleFileSelect(...args)),\n style: {\n \"display\": \"none\"\n }\n }, null, 544), _createVNode(_component_el_button, {\n type: \"warning\",\n loading: $data.restoring,\n disabled: $data.isProcessing,\n onClick: $options.selectRestoreFile,\n class: \"action-btn restore-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\"\n }), _createTextVNode(\" \" + _toDisplayString($data.restoring ? _ctx.$t('sysStatus.restoring') : _ctx.$t('sysStatus.restoreData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])])]),\n _: 1\n }, 8, [\"content\"])]))])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_74, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"file-info-card info-card-newest\",\n onClick: _cache[8] || (_cache[8] = $event => $options.openFileInNewTab($data.indexInfo.newestFile))\n }, [$options.isImageFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[6] || (_cache[6] = $event => $options.handleImageError('newest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[7] || (_cache[7] = $event => $options.handleImageError('newest'))\n }, null, 40, _hoisted_75)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_76, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_77, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.latestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_78, [_createElementVNode(\"div\", _hoisted_79, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_80, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-info-card info-card-oldest\",\n onClick: _cache[11] || (_cache[11] = $event => $options.openFileInNewTab($data.indexInfo.oldestFile))\n }, [$options.isImageFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[9] || (_cache[9] = $event => $options.handleImageError('oldest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[10] || (_cache[10] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_81)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_82, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_83, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.earliestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_84, [_createElementVNode(\"div\", _hoisted_85, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_86, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, vScale, _parsed} = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = (_parsed\n .slice(0, start + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = (_parsed\n .slice(end - 1)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart | PrivateChart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart | PrivateChart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n\n (chart as PrivateChart).height = round1(chart.height);\n (chart as PrivateChart).width = round1(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js';\n\nfunction getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nexport function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n _getAxisCount() {\n return this._getAxis().length;\n }\n\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift();\n }\n\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets) {\n axis[valueOrDefault(\n this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId\n )] = true;\n }\n return Object.keys(axis);\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n const {labels: {pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: string): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: string): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options?: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase as {\n new (options?: AnyObject): DateAdapter;\n override(\n members: Partial, 'options'>>\n ): void;\n }\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const {vScale} = controller._cachedMeta;\n const {_parsed} = metaset;\n\n const distanceToDefinedLo = (_parsed\n .slice(0, result.lo + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.lo -= Math.max(0, distanceToDefinedLo);\n\n const distanceToDefinedHi = (_parsed\n .slice(result.hi)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

    (props: P, final?: boolean): Pick;\n getProps

    (props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = undefined;\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n if (this._init === undefined) { // Do not trigger events before install\n return;\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined; // Do not trigger events after uninstall\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n // @ts-expect-error\n const clip = getDatasetClipArea(this, meta);\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (clip) {\n clipArea(ctx, clip);\n }\n\n meta.controller.draw();\n\n if (clip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\nfunction clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, x, y, outerRadius, innerRadius, options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + PI / 2) + x;\n const endY = -r * Math.sin(endAngle + PI / 2) + y;\n const startX = r * Math.cos(startAngle + PI / 2) + x;\n const startY = r * Math.sin(startAngle + PI / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n ctx.clip('evenodd');\n}\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import {_boundSegment, _boundSegments, _normalizeAngle} from '../../helpers/index.js';\n\nexport function _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n\n for (const segment of segments) {\n let {start, end} = segment;\n end = _findSegmentEnd(start, end, points);\n\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n\n if (!target.segments) {\n // Special case for boundary not supporting `segments` (simpleArc)\n // Bounds are provided as `target` for partial circle, or undefined for full circle\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n\n // Get all segments from `target` that intersect the bounds of current segment of `line`\n const targetSegments = _boundSegments(target, bounds);\n\n for (const tgt of targetSegments) {\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\n\nexport function _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\n\nexport function _pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\n\nexport function _findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\n\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {isArray} from '../../helpers/index.js';\nimport {_pointsFromSegments} from './filler.segment.js';\n\n/**\n * @param {PointElement[] | { x: number; y: number; }} boundary\n * @param {LineElement} line\n * @return {LineElement?}\n */\nexport function _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n\n if (isArray(boundary)) {\n _loop = true;\n // @ts-ignore\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\n\nexport function _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n","import {isObject, isFinite, valueOrDefault} from '../../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.line.js').default } LineElement\n * @typedef { import('../../types/index.js').FillTarget } FillTarget\n * @typedef { import('../../types/index.js').ComplexFillTarget } ComplexFillTarget\n */\n\nexport function _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n}\n\n/**\n * @param {LineElement} line\n * @param {number} index\n * @param {number} count\n */\nexport function _decodeFill(line, index, count) {\n /** @type {string | {value: number}} */\n const fill = parseFillOption(line);\n\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n\n let target = parseFloat(fill);\n\n if (isFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\n\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @returns {number | null}\n */\nexport function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n // @ts-ignore\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @param {number} startValue\n * @returns {number | undefined}\n */\nexport function _getTargetValue(fill, scale, startValue) {\n let value;\n\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n // @ts-ignore\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n\n/**\n * @param {LineElement} line\n */\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {_isBetween} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\n\n/**\n * @param {{ chart: Chart; scale: Scale; index: number; line: LineElement; }} source\n * @return {LineElement}\n */\nexport function _buildStackLine(source) {\n const {scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({x: null, y: scale.bottom}, line));\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @return {LineElement[]}\n */\nfunction getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n\n/**\n * @param {PointElement[]} points\n * @param {PointElement} sourcePoint\n * @param {LineElement[]} linesBelow\n */\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n // First point of a segment -> need to add another point before this,\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n // In the middle of a segment, no need to add more points.\n break;\n }\n }\n }\n points.push(...postponed);\n}\n\n/**\n * @param {LineElement} line\n * @param {PointElement} sourcePoint\n * @param {string} property\n * @returns {{point?: PointElement, first?: boolean, last?: boolean}}\n */\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\n","import {TAU} from '../../helpers/index.js';\n\n// TODO: use elements.ArcElement instead\nexport class simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n","import {isFinite} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\nimport {_getTargetPixel, _getTargetValue} from './filler.options.js';\nimport {_buildStackLine} from './filler.target.stack.js';\nimport {simpleArc} from './simpleArc.js';\n\n/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nexport function _getTarget(source) {\n const {chart, fill, line} = source;\n\n if (isFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n\n if (fill === 'shape') {\n return true;\n }\n\n const boundary = computeBoundary(source);\n\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n\n return _createBoundaryLine(boundary, line);\n}\n\n/**\n * @param {Chart} chart\n * @param {number} index\n */\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\n\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\n\n\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n const pixel = _getTargetPixel(fill, scale);\n\n if (isFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n\n return null;\n}\n\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n\n for (let i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\n","import {clipArea, unclipArea, getDatasetClipArea} from '../../helpers/index.js';\nimport {_findSegmentEnd, _getBounds, _segments} from './filler.segment.js';\nimport {_getTarget} from './filler.target.js';\n\nexport function _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const {chart, index, line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n const meta = chart.getDatasetMeta(index);\n const clip = getDatasetClipArea(chart, meta);\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis, clip});\n unclipArea(ctx);\n }\n}\n\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale, clip} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n\n ctx.save();\n\n let fillColor = below;\n if (below !== above) {\n if (property === 'x') {\n clipVertical(ctx, target, area.top);\n fill(ctx, {line, target, color: above, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n } else if (property === 'y') {\n clipHorizontal(ctx, target, area.left);\n fill(ctx, {line, target, color: below, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipHorizontal(ctx, target, area.right);\n fillColor = above;\n }\n }\n fill(ctx, {line, target, color: fillColor, scale, property, clip});\n\n ctx.restore();\n}\n\nfunction clipVertical(ctx, target, clipY) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction clipHorizontal(ctx, target, clipX) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(clipX, firstPoint.y);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(clipX, lastPoint.y);\n }\n }\n\n ctx.lineTo(clipX, target.first().y);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction fill(ctx, cfg) {\n const {line, target, property, color, scale, clip} = cfg;\n const segments = _segments(line, target, property);\n\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n\n ctx.save();\n ctx.fillStyle = backgroundColor;\n\n clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));\n\n ctx.beginPath();\n\n const lineLoop = !!line.pathSegment(ctx, src);\n\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n\n ctx.restore();\n }\n}\n\nfunction clipBounds(ctx, scale, clip, bounds) {\n const chartArea = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n\n if (property === 'x' || property === 'y') {\n let left, top, right, bottom;\n\n if (property === 'x') {\n left = start;\n top = chartArea.top;\n right = end;\n bottom = chartArea.bottom;\n } else {\n left = chartArea.left;\n top = start;\n right = chartArea.right;\n bottom = end;\n }\n\n ctx.beginPath();\n\n if (clip) {\n left = Math.max(left, clip.left);\n right = Math.min(right, clip.right);\n top = Math.max(top, clip.top);\n bottom = Math.min(bottom, clip.bottom);\n }\n\n ctx.rect(left, top, right - left, bottom - top);\n ctx.clip();\n }\n}\n\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\n","/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n id: 'filler',\n\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import type { PropType } from 'vue'\nimport type {\n ChartType,\n ChartData,\n ChartOptions,\n Plugin,\n UpdateMode\n} from 'chart.js'\n\nexport const CommonProps = {\n data: {\n type: Object as PropType,\n required: true\n },\n options: {\n type: Object as PropType,\n default: () => ({})\n },\n plugins: {\n type: Array as PropType,\n default: () => []\n },\n datasetIdKey: {\n type: String,\n default: 'label'\n },\n updateMode: {\n type: String as PropType,\n default: undefined\n }\n} as const\n\nexport const A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n} as const\n\nexport const Props = {\n type: {\n type: String as PropType,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n} as const\n","import { isProxy, toRaw, version } from 'vue'\nimport type {\n Chart,\n ChartType,\n ChartData,\n ChartDataset,\n ChartOptions,\n DefaultDataPoint\n} from 'chart.js'\n\nexport const compatProps =\n version[0] === '2'\n ? (internals: I, props: T) =>\n Object.assign(internals, { attrs: props }) as unknown as I & T\n : (internals: I, props: T) =>\n Object.assign(internals, props)\n\nexport function toRawIfProxy(obj: T) {\n return isProxy(obj) ? toRaw(obj) : obj\n}\n\nexport function cloneProxy(obj: T, src = obj) {\n return isProxy(src) ? new Proxy(obj, {}) : obj\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions)\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey: string\n) {\n const addedDatasets: ChartDataset[] = []\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n )\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset\n }\n\n addedDatasets.push(currentDataset)\n\n Object.assign(currentDataset, nextDataset)\n\n return currentDataset\n }\n )\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey: string) {\n const nextData: ChartData = {\n labels: [],\n datasets: []\n }\n\n setLabels(nextData, data.labels)\n setDatasets(nextData, data.datasets, datasetIdKey)\n\n return nextData\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'dataset',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'nearest',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'index',\n { intersect: true },\n false\n )\n}\n","import { Chart as ChartJS } from 'chart.js'\nimport {\n defineComponent,\n h,\n nextTick,\n onUnmounted,\n onMounted,\n ref,\n shallowRef,\n toRaw,\n watch\n} from 'vue'\n\nimport type { ChartComponent } from './types.js'\nimport { Props } from './props.js'\nimport {\n cloneData,\n setLabels,\n setDatasets,\n setOptions,\n toRawIfProxy,\n cloneProxy\n} from './utils.js'\n\nexport const Chart = defineComponent({\n props: Props,\n setup(props, { expose, slots }) {\n const canvasRef = ref(null)\n const chartRef = shallowRef(null)\n\n expose({ chart: chartRef })\n\n const renderChart = () => {\n if (!canvasRef.value) return\n\n const { type, data, options, plugins, datasetIdKey } = props\n const clonedData = cloneData(data, datasetIdKey)\n const proxiedData = cloneProxy(clonedData, data)\n\n chartRef.value = new ChartJS(canvasRef.value, {\n type,\n data: proxiedData,\n options: { ...options },\n plugins\n })\n }\n\n const destroyChart = () => {\n const chart = toRaw(chartRef.value)\n\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(() => {\n chart.destroy()\n chartRef.value = null\n }, props.destroyDelay)\n } else {\n chart.destroy()\n chartRef.value = null\n }\n }\n }\n\n const update = (chart: ChartJS) => {\n chart.update(props.updateMode)\n }\n\n onMounted(renderChart)\n\n onUnmounted(destroyChart)\n\n watch(\n [() => props.options, () => props.data],\n (\n [nextOptionsProxy, nextDataProxy],\n [prevOptionsProxy, prevDataProxy]\n ) => {\n const chart = toRaw(chartRef.value)\n\n if (!chart) {\n return\n }\n\n let shouldUpdate = false\n\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy)\n const prevOptions = toRawIfProxy(prevOptionsProxy)\n\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions)\n shouldUpdate = true\n }\n }\n\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels)\n const prevLabels = toRawIfProxy(prevDataProxy.labels)\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets)\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets)\n\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels)\n shouldUpdate = true\n }\n\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey)\n shouldUpdate = true\n }\n }\n\n if (shouldUpdate) {\n nextTick(() => {\n update(chart)\n })\n }\n },\n { deep: true }\n )\n\n return () => {\n return h(\n 'canvas',\n {\n role: 'img',\n 'aria-label': props.ariaLabel,\n 'aria-describedby': props.ariaDescribedby,\n ref: canvasRef\n },\n [h('p', {}, [slots.default ? slots.default() : ''])]\n )\n }\n }\n}) as ChartComponent\n","import { defineComponent, shallowRef, h } from 'vue'\nimport type { ChartType, ChartComponentLike, DefaultDataPoint } from 'chart.js'\nimport {\n Chart as ChartJS,\n BarController,\n BubbleController,\n DoughnutController,\n LineController,\n PieController,\n PolarAreaController,\n RadarController,\n ScatterController\n} from 'chart.js'\nimport type { DistributiveArray } from 'chart.js/dist/types/utils'\nimport type { TypedChartComponent, ChartComponentRef } from './types.js'\nimport { CommonProps } from './props.js'\nimport { Chart } from './chart.js'\nimport { compatProps } from './utils.js'\n\nexport function createTypedChart<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n type: TType,\n registerables: ChartComponentLike\n): TypedChartComponent {\n ChartJS.register(registerables)\n\n return defineComponent({\n props: CommonProps,\n setup(props, { expose }) {\n const ref = shallowRef(null)\n const reforwardRef = (chartRef: ChartComponentRef) => {\n ref.value = chartRef?.chart\n }\n\n expose({ chart: ref })\n\n return () => {\n return h(\n Chart,\n compatProps(\n {\n ref: reforwardRef as any\n },\n {\n type,\n ...props\n }\n )\n )\n }\n }\n }) as any\n}\n\nexport interface ExtendedDataPoint {\n [key: string]: string | number | null | ExtendedDataPoint\n}\n\nexport const Bar = /* #__PURE__ */ createTypedChart<\n 'bar',\n DefaultDataPoint<'bar'> | DistributiveArray\n>('bar', BarController)\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n)\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController)\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController)\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n)\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController)\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n)\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n)\n","/**\r\n * BatchProcessor - 批量数据处理类\r\n * \r\n * 处理批量数据获取和处理的核心类,使用 cursor 分页机制获取所有数据。\r\n * 支持进度回调和取消功能。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\n\r\n/**\r\n * 批量操作错误类\r\n * 提供错误代码、是否可恢复、建议操作等信息\r\n */\r\nexport class BatchOperationError extends Error {\r\n constructor(message, code, recoverable = false, suggestion = '') {\r\n super(message);\r\n this.name = 'BatchOperationError';\r\n this.code = code;\r\n this.recoverable = recoverable;\r\n this.suggestion = suggestion;\r\n }\r\n}\r\n\r\n/**\r\n * 错误处理器映射\r\n * 根据 HTTP 状态码返回对应的错误对象\r\n */\r\nconst ERROR_HANDLERS = {\r\n 401: () => new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n ),\r\n 403: () => new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n ),\r\n 400: (details) => new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n ),\r\n 500: () => new BatchOperationError(\r\n '服务器内部错误',\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试,如果问题持续请联系管理员'\r\n ),\r\n NETWORK: () => new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n ),\r\n ABORT: () => new BatchOperationError(\r\n '操作已取消',\r\n 'ABORTED',\r\n false,\r\n ''\r\n )\r\n};\r\n\r\n/**\r\n * 根据错误创建 BatchOperationError\r\n * @param {Error|Response} error - 原始错误或响应对象\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\nfunction createError(error, details = '') {\r\n // 处理取消操作\r\n if (error.name === 'AbortError') {\r\n return ERROR_HANDLERS.ABORT();\r\n }\r\n \r\n // 处理 HTTP 响应错误\r\n if (error instanceof Response || (error && typeof error.status === 'number')) {\r\n const handler = ERROR_HANDLERS[error.status];\r\n if (handler) {\r\n return handler(details);\r\n }\r\n return new BatchOperationError(\r\n `请求失败: ${error.status}`,\r\n 'HTTP_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n \r\n // 处理网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n return ERROR_HANDLERS.NETWORK();\r\n }\r\n \r\n // 其他错误\r\n return new BatchOperationError(\r\n error.message || '未知错误',\r\n 'UNKNOWN_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n}\r\n\r\n/**\r\n * BatchProcessor 类\r\n * \r\n * 用于批量获取和处理数据的核心类\r\n */\r\nclass BatchProcessor {\r\n /**\r\n * 创建 BatchProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.batchSize - 每批数据量,默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.batchSize = options.batchSize || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * 获取所有数据记录\r\n * 使用 cursor 分页机制循环获取所有数据,直到没有更多数据或操作被取消\r\n * \r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 所有记录的数组\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async fetchAllRecords(includeValue = false) {\r\n // 创建新的 AbortController 用于取消操作\r\n this.abortController = new AbortController();\r\n const allRecords = [];\r\n let cursor = null;\r\n let totalFetched = 0;\r\n let batchCount = 0;\r\n\r\n try {\r\n do {\r\n // 检查是否已取消\r\n if (this.abortController.signal.aborted) {\r\n break;\r\n }\r\n\r\n // 获取一批数据\r\n const response = await this.fetchBatch(cursor, includeValue);\r\n \r\n // 合并数据到总数组\r\n allRecords.push(...response.records);\r\n cursor = response.nextCursor;\r\n totalFetched += response.records.length;\r\n batchCount++;\r\n\r\n // 调用进度回调\r\n this.onProgress({\r\n phase: 'fetching',\r\n current: totalFetched,\r\n batchCount: batchCount,\r\n message: `已获取 ${totalFetched} 条记录...`\r\n });\r\n\r\n } while (cursor && !this.abortController.signal.aborted);\r\n\r\n // 如果是因为取消而退出循环,抛出取消错误\r\n if (this.abortController.signal.aborted) {\r\n throw ERROR_HANDLERS.ABORT();\r\n }\r\n\r\n return allRecords;\r\n } catch (error) {\r\n // 调用错误回调\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : createError(error);\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 获取单批数据\r\n * \r\n * @param {string|null} cursor - 分页游标,首次请求为 null\r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 包含 records 和 nextCursor 的响应对象\r\n * @throws {BatchOperationError} 当请求失败时抛出\r\n */\r\n async fetchBatch(cursor, includeValue) {\r\n // 构建查询参数\r\n const params = new URLSearchParams();\r\n if (cursor) {\r\n params.set('cursor', cursor);\r\n }\r\n if (includeValue) {\r\n params.set('includeValue', 'true');\r\n }\r\n params.set('limit', String(this.batchSize));\r\n\r\n try {\r\n // 发送请求,传入 abort signal 支持取消\r\n const response = await fetchWithAuth(\r\n `/api/manage/batch/list?${params}`,\r\n { signal: this.abortController.signal }\r\n );\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw createError(response, errorDetails);\r\n }\r\n\r\n // 解析响应数据\r\n const data = await response.json();\r\n \r\n // 验证响应格式\r\n if (!data.success) {\r\n throw new BatchOperationError(\r\n data.error || '请求失败',\r\n 'API_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return {\r\n records: data.records || [],\r\n nextCursor: data.nextCursor || null,\r\n totalProcessed: data.totalProcessed || 0\r\n };\r\n } catch (error) {\r\n // 如果已经是 BatchOperationError,直接抛出\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 否则转换为 BatchOperationError\r\n throw createError(error);\r\n }\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n * 调用此方法将中止正在进行的 fetch 请求\r\n */\r\n abort() {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.abortController ? this.abortController.signal.aborted : false;\r\n }\r\n\r\n /**\r\n * 重置处理器状态\r\n * 在开始新的批量操作前调用\r\n */\r\n reset() {\r\n this.abortController = null;\r\n }\r\n}\r\n\r\nexport default BatchProcessor;\r\n","/**\r\n * IndexRebuilder - 索引重建类\r\n * \r\n * 处理索引重建的完整流程,包括数据获取、排序、分块上传和完成。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport BatchProcessor, { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * IndexRebuilder 类\r\n * \r\n * 用于重建索引的核心类,协调数据获取、排序和分块上传\r\n */\r\nclass IndexRebuilder {\r\n /**\r\n * 创建 IndexRebuilder 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每个分块的记录数,默认从后端获取\r\n * @param {number} options.maxRetries - 分块上传最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || null; // 从后端获取\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.sessionId = this.generateSessionId();\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 从后端获取索引配置(分块大小等)\r\n * @returns {Promise} 配置对象 { chunkSize, databaseType }\r\n */\r\n async fetchConfig() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/config');\r\n if (!response.ok) {\r\n throw new Error('获取配置失败');\r\n }\r\n const result = await response.json();\r\n if (result.success) {\r\n return {\r\n chunkSize: result.chunkSize || 500,\r\n databaseType: result.databaseType || 'unknown'\r\n };\r\n }\r\n throw new Error(result.error || '获取配置失败');\r\n } catch (error) {\r\n // 获取失败时使用保守的默认值(兼容 D1)\r\n console.warn('Failed to fetch index config, using default:', error);\r\n return { chunkSize: 500, databaseType: 'unknown' };\r\n }\r\n }\r\n\r\n /**\r\n * 执行索引重建\r\n * \r\n * 完整流程:\r\n * 1. 获取配置(分块大小)\r\n * 2. 获取所有记录\r\n * 3. 按时间戳降序排序\r\n * 4. 分块上传\r\n * 5. 完成重建\r\n * \r\n * @returns {Promise} 重建结果 { success: boolean, totalFiles: number }\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async rebuild() {\r\n this.aborted = false;\r\n \r\n try {\r\n // 获取配置(分块大小)\r\n if (!this.chunkSize) {\r\n const config = await this.fetchConfig();\r\n this.chunkSize = config.chunkSize;\r\n }\r\n\r\n // 获取所有记录\r\n this.onProgress({ \r\n phase: 'fetching', \r\n message: '正在获取数据...',\r\n current: 0\r\n });\r\n \r\n const processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' }),\r\n onError: (e) => this.onError(e)\r\n });\r\n \r\n const records = await processor.fetchAllRecords(false);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 排序(按时间戳降序)\r\n this.onProgress({ \r\n phase: 'sorting', \r\n message: '正在排序...',\r\n current: 0,\r\n total: records.length\r\n });\r\n \r\n this.sortByTimestampDescending(records);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 分块上传\r\n const chunks = this.splitIntoChunks(records);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n \r\n // 使用重试机制上传分块\r\n await this.uploadChunkWithRetry(chunks[i], i);\r\n \r\n this.onProgress({\r\n phase: 'uploading',\r\n current: i + 1,\r\n total: chunks.length,\r\n message: `正在上传分块 ${i + 1}/${chunks.length}...`\r\n });\r\n }\r\n\r\n // 完成重建\r\n this.onProgress({ \r\n phase: 'finalizing', \r\n message: '正在完成重建...',\r\n current: chunks.length,\r\n total: chunks.length\r\n });\r\n \r\n await this.finalize(chunks.length, records.length);\r\n\r\n this.onProgress({\r\n phase: 'completed',\r\n message: `索引重建完成,共 ${records.length} 个文件`,\r\n current: records.length,\r\n total: records.length\r\n });\r\n\r\n return { success: true, totalFiles: records.length };\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : new BatchOperationError(\r\n error.message || '索引重建失败',\r\n 'REBUILD_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 按时间戳降序排序记录\r\n * \r\n * @param {Array} records - 要排序的记录数组(原地排序)\r\n */\r\n sortByTimestampDescending(records) {\r\n records.sort((a, b) => {\r\n const timestampA = (a.metadata && a.metadata.TimeStamp) || 0;\r\n const timestampB = (b.metadata && b.metadata.TimeStamp) || 0;\r\n return timestampB - timestampA;\r\n });\r\n }\r\n\r\n /**\r\n * 将记录分割为多个块\r\n * \r\n * @param {Array} records - 要分割的记录数组\r\n * @returns {Array} 分块后的二维数组\r\n */\r\n splitIntoChunks(records) {\r\n const chunks = [];\r\n for (let i = 0; i < records.length; i += this.chunkSize) {\r\n chunks.push(records.slice(i, i + this.chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当所有重试都失败时抛出\r\n */\r\n async uploadChunkWithRetry(chunk, chunkId) {\r\n let lastError;\r\n \r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(chunk, chunkId);\r\n } catch (error) {\r\n lastError = error;\r\n \r\n // 不重试的错误类型\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' || \r\n error.code === 'FORBIDDEN' || \r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n \r\n // 如果还有重试机会,等待后重试\r\n if (attempt < this.maxRetries) {\r\n // 指数退避\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n \r\n this.onProgress({\r\n phase: 'retrying',\r\n message: `分块 ${chunkId + 1} 上传失败,正在重试 (${attempt}/${this.maxRetries})...`,\r\n current: chunkId,\r\n attempt: attempt\r\n });\r\n }\r\n }\r\n }\r\n \r\n // 所有重试都失败\r\n throw lastError instanceof BatchOperationError \r\n ? lastError \r\n : new BatchOperationError(\r\n `分块 ${chunkId + 1} 上传失败,已重试 ${this.maxRetries} 次`,\r\n 'CHUNK_UPLOAD_FAILED',\r\n false,\r\n '请检查网络连接后重新开始重建'\r\n );\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当上传失败时抛出\r\n */\r\n async uploadChunk(chunk, chunkId) {\r\n const checksum = await this.calculateChecksum(chunk);\r\n \r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n chunkId: String(chunkId),\r\n sessionId: this.sessionId,\r\n data: chunk,\r\n checksum\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 完成索引重建\r\n * \r\n * @param {number} totalChunks - 总分块数\r\n * @param {number} totalFiles - 总文件数\r\n * @returns {Promise} 完成响应\r\n * @throws {BatchOperationError} 当完成请求失败时抛出\r\n */\r\n async finalize(totalChunks, totalFiles) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/finalize', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n sessionId: this.sessionId,\r\n totalChunks,\r\n totalFiles\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n throw new BatchOperationError(\r\n error.message || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 生成唯一的会话 ID\r\n * \r\n * @returns {string} 会话 ID\r\n */\r\n generateSessionId() {\r\n return `rebuild_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n }\r\n\r\n /**\r\n * 计算数据的 SHA-256 校验和\r\n * \r\n * @param {Array} data - 要计算校验和的数据\r\n * @returns {Promise} 十六进制格式的校验和\r\n */\r\n async calculateChecksum(data) {\r\n const text = JSON.stringify(data);\r\n const encoder = new TextEncoder();\r\n const dataBuffer = encoder.encode(text);\r\n\r\n // crypto.subtle 仅在安全上下文(HTTPS / localhost)下可用\r\n // 通过 0.0.0.0 等非安全上下文访问时需要 fallback\r\n if (typeof crypto !== 'undefined' && crypto.subtle) {\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n // Fallback: 简单但足够用于校验的哈希实现 (FNV-1a 变体, 产生 64 位十六进制)\r\n let h1 = 0x811c9dc5 >>> 0;\r\n let h2 = 0x811c9dc5 >>> 0;\r\n for (let i = 0; i < dataBuffer.length; i++) {\r\n h1 = Math.imul(h1 ^ dataBuffer[i], 0x01000193) >>> 0;\r\n h2 = Math.imul(h2 ^ dataBuffer[i], 0x01000193 + 0x10) >>> 0;\r\n }\r\n return h1.toString(16).padStart(8, '0') + h2.toString(16).padStart(8, '0');\r\n }\r\n\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n * \r\n * @param {number} status - HTTP 状态码\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n );\r\n case 404:\r\n return new BatchOperationError(\r\n '会话不存在',\r\n 'SESSION_NOT_FOUND',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 410:\r\n return new BatchOperationError(\r\n '会话已过期',\r\n 'SESSION_EXPIRED',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n * \r\n * @param {number} ms - 延迟毫秒数\r\n * @returns {Promise}\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n\r\n /**\r\n * 重置重建器状态\r\n * 在开始新的重建操作前调用\r\n */\r\n reset() {\r\n this.aborted = false;\r\n this.sessionId = this.generateSessionId();\r\n }\r\n}\r\n\r\nexport default IndexRebuilder;\r\n","/**\r\n * BackupGenerator - 备份数据生成类\r\n * \r\n * 处理前端辅助备份功能,获取所有文件记录(包含分块文件的 value),\r\n * 构建完整的备份 JSON 文件,并触发浏览器下载。\r\n */\r\n\r\nimport BatchProcessor from '@/utils/batchProcessor';\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport packageInfo from '../../package.json'\r\n\r\n/**\r\n * BackupGenerator 类\r\n * \r\n * 用于生成和下载备份数据的类\r\n */\r\nclass BackupGenerator {\r\n /**\r\n * 创建 BackupGenerator 实例\r\n * @param {Object} options - 配置选项\r\n * @param {Function} options.onProgress - 进度回调函数\r\n */\r\n constructor(options = {}) {\r\n this.onProgress = options.onProgress || (() => {});\r\n this.processor = null;\r\n }\r\n\r\n /**\r\n * 生成并下载备份\r\n * \r\n * 完整流程:\r\n * 1. 获取所有文件记录(包含分块文件的 value)\r\n * 2. 构建备份数据结构\r\n * 3. 获取系统设置\r\n * 4. 生成并触发下载\r\n * \r\n * @returns {Promise} 包含 success 和 fileCount 的结果对象\r\n * @throws {Error} 当备份过程中发生错误时抛出\r\n */\r\n async generateBackup() {\r\n // 获取所有文件记录(包含分块文件的 value)\r\n this.processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' })\r\n });\r\n\r\n const records = await this.processor.fetchAllRecords(true);\r\n\r\n // 构建备份数据\r\n this.onProgress({ phase: 'building', message: '正在构建备份数据...' });\r\n\r\n const backupData = {\r\n timestamp: Date.now(),\r\n version: packageInfo.version,\r\n data: {\r\n fileCount: records.length,\r\n files: {},\r\n settings: {}\r\n }\r\n };\r\n\r\n // 将记录转换为以 id 为键的对象格式\r\n for (const record of records) {\r\n backupData.data.files[record.id] = {\r\n metadata: record.metadata,\r\n value: record.value || null\r\n };\r\n }\r\n\r\n // 3. 获取系统设置\r\n const settings = await this.fetchSettings();\r\n backupData.data.settings = settings;\r\n\r\n // 生成下载\r\n this.onProgress({ phase: 'downloading', message: '正在生成下载...' });\r\n this.downloadBackup(backupData);\r\n\r\n const settingsCount = Object.keys(settings).length;\r\n return { success: true, fileCount: records.length, settingsCount };\r\n }\r\n\r\n /**\r\n * 获取系统设置\r\n * \r\n * @returns {Promise} 系统设置对象,失败时返回空对象\r\n */\r\n async fetchSettings() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/settings');\r\n if (!response.ok) {\r\n console.warn('Failed to fetch settings:', response.status);\r\n return {};\r\n }\r\n const data = await response.json();\r\n // 返回 settings 字段,而不是整个响应\r\n return data.settings || {};\r\n } catch (error) {\r\n console.warn('Failed to fetch settings:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * 触发浏览器下载备份文件\r\n * \r\n * @param {Object} data - 备份数据对象\r\n */\r\n downloadBackup(data) {\r\n // 将数据转换为格式化的 JSON 字符串\r\n const json = JSON.stringify(data, null, 2);\r\n \r\n // 创建 Blob 对象\r\n const blob = new Blob([json], { type: 'application/json' });\r\n \r\n // 创建下载 URL\r\n const url = URL.createObjectURL(blob);\r\n\r\n // 创建临时下载链接\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // 使用日期作为文件名的一部分\r\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\r\n \r\n // 触发下载\r\n document.body.appendChild(a);\r\n a.click();\r\n \r\n // 清理\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * 取消当前备份操作\r\n */\r\n abort() {\r\n if (this.processor) {\r\n this.processor.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.processor ? this.processor.isAborted() : false;\r\n }\r\n}\r\n\r\nexport default BackupGenerator;\r\n","/**\r\n * RestoreProcessor - 分批恢复数据类\r\n * \r\n * 将备份数据分批上传到后端进行恢复,避免 CPU 超时\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * RestoreProcessor 类\r\n */\r\nclass RestoreProcessor {\r\n /**\r\n * 创建 RestoreProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每批数据量,默认 50\r\n * @param {number} options.maxRetries - 最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 50;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行恢复操作\r\n * \r\n * @param {Object} backupData - 备份数据对象\r\n * @returns {Promise} 恢复结果\r\n */\r\n async restore(backupData) {\r\n this.aborted = false;\r\n\r\n // 验证备份数据格式\r\n if (!backupData || !backupData.data) {\r\n throw new BatchOperationError(\r\n '备份文件格式无效',\r\n 'INVALID_BACKUP',\r\n false,\r\n '请选择有效的备份文件'\r\n );\r\n }\r\n\r\n const { files = {}, settings = {} } = backupData.data;\r\n const fileEntries = Object.entries(files);\r\n const settingEntries = Object.entries(settings);\r\n \r\n const totalFiles = fileEntries.length;\r\n const totalSettings = settingEntries.length;\r\n const totalItems = totalFiles + totalSettings;\r\n\r\n let restoredFiles = 0;\r\n let restoredSettings = 0;\r\n let failedFiles = 0;\r\n let failedSettings = 0;\r\n\r\n try {\r\n // 1. 分批恢复文件数据\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: '正在恢复文件数据...',\r\n current: 0,\r\n total: totalItems\r\n });\r\n\r\n const fileChunks = this.splitIntoChunks(fileEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < fileChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = fileChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('files', chunkData);\r\n restoredFiles += result.restoredCount;\r\n failedFiles += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: `正在恢复文件数据 ${restoredFiles}/${totalFiles}...`,\r\n current: restoredFiles,\r\n total: totalItems,\r\n percentage: (restoredFiles / totalItems) * 80\r\n });\r\n }\r\n\r\n // 2. 分批恢复系统设置\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: '正在恢复系统设置...',\r\n current: restoredFiles,\r\n total: totalItems\r\n });\r\n\r\n const settingChunks = this.splitIntoChunks(settingEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < settingChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = settingChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('settings', chunkData);\r\n restoredSettings += result.restoredCount;\r\n failedSettings += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: `正在恢复系统设置 ${restoredSettings}/${totalSettings}...`,\r\n current: restoredFiles + restoredSettings,\r\n total: totalItems,\r\n percentage: 80 + (restoredSettings / totalSettings) * 20\r\n });\r\n }\r\n\r\n // 3. 完成\r\n this.onProgress({\r\n phase: 'completed',\r\n message: '恢复完成',\r\n current: totalItems,\r\n total: totalItems,\r\n percentage: 100\r\n });\r\n\r\n return {\r\n success: true,\r\n restoredFiles,\r\n restoredSettings,\r\n failedFiles,\r\n failedSettings,\r\n backupTimestamp: backupData.timestamp\r\n };\r\n\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError\r\n ? error\r\n : new BatchOperationError(\r\n error.message || '恢复失败',\r\n 'RESTORE_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 将数组分割为多个块\r\n */\r\n splitIntoChunks(entries, chunkSize) {\r\n const chunks = [];\r\n for (let i = 0; i < entries.length; i += chunkSize) {\r\n chunks.push(entries.slice(i, i + chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n */\r\n async uploadChunkWithRetry(type, data) {\r\n let lastError;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(type, data);\r\n } catch (error) {\r\n lastError = error;\r\n\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' ||\r\n error.code === 'FORBIDDEN' ||\r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n\r\n if (attempt < this.maxRetries) {\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n }\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n */\r\n async uploadChunk(type, data) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/restore/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ type, data })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n\r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查备份文件格式'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n}\r\n\r\nexport default RestoreProcessor;\r\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/es.set.difference.v2.js\";\nimport \"core-js/modules/es.set.intersection.v2.js\";\nimport \"core-js/modules/es.set.is-disjoint-from.v2.js\";\nimport \"core-js/modules/es.set.is-subset-of.v2.js\";\nimport \"core-js/modules/es.set.is-superset-of.v2.js\";\nimport \"core-js/modules/es.set.symmetric-difference.v2.js\";\nimport \"core-js/modules/es.set.union.v2.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport \"core-js/modules/web.url-search-params.delete.js\";\nimport \"core-js/modules/web.url-search-params.has.js\";\nimport \"core-js/modules/web.url-search-params.size.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport packageInfo from '../../../package.json';\nimport { Doughnut, Line } from 'vue-chartjs';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler } from 'chart.js';\nimport IndexRebuilder from '@/utils/indexRebuilder';\nimport BackupGenerator from '@/utils/backupGenerator';\nimport RestoreProcessor from '@/utils/restoreProcessor';\nimport DateRangeCalendar from '@/components/DateRangeCalendar.vue';\nChartJS.register(ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler);\nconst DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateInput(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction getDefaultTrendDateRange() {\n const endDate = new Date();\n endDate.setHours(0, 0, 0, 0);\n const startDate = new Date(endDate.getTime() - 6 * DAY_MS);\n return [formatDateInput(startDate), formatDateInput(endDate)];\n}\nexport default {\n name: 'SysCogStatus',\n components: {\n Doughnut,\n Line,\n DateRangeCalendar\n },\n data() {\n return {\n loading: false,\n rebuilding: false,\n backing: false,\n restoring: false,\n indexInfo: {},\n version: packageInfo.version,\n // 从package.json获取版本号\n loadErrors: {\n newest: false,\n oldest: false\n },\n trendGroupBy: 'channel',\n trendDatePickerVisible: false,\n trendDateRange: getDefaultTrendDateRange(),\n // 渠道图表颜色\n channelColors: ['#8B5CF6', '#EC4899', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#6366F1', '#84CC16'],\n // 状态图表颜色\n typeColors: ['#10B981', '#3B82F6', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4', '#84CC16'],\n // 上传趋势折线图颜色\n trendColors: ['#2563EB', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#06B6D4', '#EC4899', '#84CC16', '#64748B'],\n // 批量操作进度状态\n isProcessing: false,\n processingPhase: '',\n // fetching, sorting, uploading, finalizing, building, downloading, completed\n processingProgress: {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n },\n processingError: null,\n processingStartTime: null,\n // 当前处理器实例(用于取消操作)\n currentRebuilder: null,\n currentBackupGenerator: null,\n currentRestoreProcessor: null\n };\n },\n computed: {\n // 渠道分布图表数据\n channelChartData() {\n const stats = this.indexInfo.channelStats || {};\n return {\n labels: Object.keys(stats),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.channelColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 文件状态图表数据 - 将Block映射为\"已屏蔽\",其余为\"正常\"\n typeChartData() {\n const aggregatedStats = this.aggregatedTypeStats;\n return {\n labels: Object.keys(aggregatedStats),\n datasets: [{\n data: Object.values(aggregatedStats),\n backgroundColor: this.typeColors.slice(0, Object.keys(aggregatedStats).length),\n borderWidth: 0\n }]\n };\n },\n // 聚合后的状态统计:Block -> 已屏蔽,其余 -> 正常\n aggregatedTypeStats() {\n const stats = this.indexInfo.typeStats || {};\n const aggregatedStats = {};\n for (const [status, count] of Object.entries(stats)) {\n const mappedStatus = status === 'Block' ? this.$t('sysStatus.blocked') : this.$t('sysStatus.normalStatus');\n aggregatedStats[mappedStatus] = (aggregatedStats[mappedStatus] || 0) + count;\n }\n return aggregatedStats;\n },\n // 当前趋势维度数据\n currentTrendGroup() {\n const trend = this.indexInfo.uploadTrend || {};\n const groupBy = trend.groupBy || {};\n return groupBy[this.trendGroupBy] || {\n series: []\n };\n },\n // 趋势图原始日期标签\n trendRawLabels() {\n const trend = this.indexInfo.uploadTrend || {};\n return trend.labels || [];\n },\n // 当前范围是否跨年\n trendRangeCrossesYear() {\n const years = new Set();\n this.trendRawLabels.forEach(label => {\n this.extractTrendLabelDates(label).forEach(date => years.add(date.year));\n });\n return years.size > 1;\n },\n // 用于横轴展示的短日期标签\n trendDisplayLabels() {\n return this.trendRawLabels.map(label => this.formatTrendAxisLabel(label));\n },\n // 是否存在趋势图数据\n hasTrendData() {\n const trend = this.indexInfo.uploadTrend || {};\n return (trend.labels || []).length > 0;\n },\n // 日期选择弹窗宽度保持与项目内其他弹窗一致\n trendDateDialogWidth() {\n return window.innerWidth > 768 ? '420px' : '90%';\n },\n // 上传趋势折线图数据\n uploadTrendChartData() {\n const trend = this.indexInfo.uploadTrend || {};\n const series = this.currentTrendGroup.series || [];\n const totalColor = '#F97316';\n return {\n labels: this.trendDisplayLabels,\n datasets: [{\n label: this.$t('sysStatus.totalUploads'),\n data: trend.total || [],\n borderColor: totalColor,\n backgroundColor: this.hexToRgba(totalColor, 0.1),\n pointBackgroundColor: totalColor,\n pointBorderColor: totalColor,\n borderWidth: 3,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.28,\n fill: false\n }, ...series.map((item, index) => {\n const color = this.getTrendColor(index);\n return {\n label: this.formatTrendSeriesName(item),\n data: item.data || [],\n borderColor: color,\n backgroundColor: this.hexToRgba(color, 0.12),\n pointBackgroundColor: color,\n pointBorderColor: color,\n borderWidth: 2,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.32,\n fill: false\n };\n })]\n };\n },\n // 折线图配置\n lineChartOptions() {\n const textColor = '#64748B';\n return {\n responsive: true,\n maintainAspectRatio: false,\n interaction: {\n mode: 'index',\n intersect: false\n },\n plugins: {\n legend: {\n display: true,\n position: 'bottom',\n labels: {\n usePointStyle: true,\n boxWidth: 8,\n boxHeight: 8,\n padding: 16,\n color: textColor\n }\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n callbacks: {\n title: items => {\n const index = items?.[0]?.dataIndex;\n return this.trendRawLabels[index] || '';\n },\n label: context => {\n const parsed = context.parsed || {};\n const value = parsed.y !== undefined ? parsed.y : context.raw;\n return ` ${context.dataset.label}: ${Number(value || 0).toLocaleString()} ${this.$t('sysStatus.uploadsUnit')}`;\n }\n }\n }\n },\n scales: {\n x: {\n grid: {\n display: false\n },\n ticks: {\n color: textColor,\n maxTicksLimit: 8,\n autoSkip: true\n }\n },\n y: {\n beginAtZero: true,\n grid: {\n color: 'rgba(148, 163, 184, 0.18)'\n },\n ticks: {\n color: textColor,\n precision: 0,\n callback: value => Number(value).toLocaleString()\n }\n }\n }\n };\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n hoverOffset: 8,\n layout: {\n padding: 10\n },\n plugins: {\n legend: {\n display: false\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n z: 100,\n callbacks: {\n label: context => {\n const value = context.raw;\n const total = context.dataset.data.reduce((a, b) => a + b, 0);\n const percentage = (value / total * 100).toFixed(1);\n return ` ${value.toLocaleString()} (${percentage}%)`;\n }\n }\n }\n },\n animation: {\n animateRotate: true,\n animateScale: true\n }\n };\n },\n // 预计剩余时间\n estimatedTimeRemaining() {\n if (!this.isProcessing || !this.processingStartTime) return '';\n if (this.processingProgress.current === 0 || this.processingProgress.percentage === 0) return '';\n const elapsed = Date.now() - this.processingStartTime;\n const progress = this.processingProgress.percentage / 100;\n if (progress <= 0) return '';\n const totalEstimated = elapsed / progress;\n const remaining = totalEstimated - elapsed;\n if (remaining <= 0) return this.$t('sysStatus.aboutToComplete');\n const seconds = Math.ceil(remaining / 1000);\n if (seconds < 60) return this.$t('sysStatus.seconds', {\n count: seconds\n });\n const minutes = Math.ceil(seconds / 60);\n if (minutes < 60) return this.$t('sysStatus.minutes', {\n count: minutes\n });\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return this.$t('sysStatus.hoursMinutes', {\n hours,\n minutes: remainingMinutes\n });\n },\n // 处理阶段描述\n phaseDescription() {\n const phaseMap = {\n 'fetching': this.$t('sysStatus.phaseFetching'),\n 'sorting': this.$t('sysStatus.phaseSorting'),\n 'uploading': this.$t('sysStatus.phaseUploading'),\n 'finalizing': this.$t('sysStatus.phaseFinalizing'),\n 'building': this.$t('sysStatus.phaseBuilding'),\n 'downloading': this.$t('sysStatus.phaseDownloading'),\n 'restoring_files': this.$t('sysStatus.phaseRestoringFiles'),\n 'restoring_settings': this.$t('sysStatus.phaseRestoringSettings'),\n 'completed': this.$t('sysStatus.phaseCompleted'),\n 'retrying': this.$t('sysStatus.phaseRetrying')\n };\n return phaseMap[this.processingPhase] || this.processingPhase;\n }\n },\n mounted() {\n this.fetchIndexInfo();\n },\n methods: {\n // 获取渠道图表颜色\n getChartColor(index) {\n return this.channelColors[index % this.channelColors.length];\n },\n // 获取状态图表颜色\n getTypeChartColor(index) {\n return this.typeColors[index % this.typeColors.length];\n },\n // 获取趋势图表颜色\n getTrendColor(index) {\n return this.trendColors[index % this.trendColors.length];\n },\n // 格式化趋势序列名称\n formatTrendSeriesName(series) {\n if (series?.isOther || series?.name === '__other__') {\n return this.$t('sysStatus.otherChannels');\n }\n return series?.name || this.$t('sysStatus.unknown');\n },\n // 十六进制颜色转换为 rgba\n hexToRgba(hex, alpha) {\n const normalized = (hex || '').replace('#', '');\n if (normalized.length !== 6) {\n return `rgba(37, 99, 235, ${alpha})`;\n }\n const r = parseInt(normalized.slice(0, 2), 16);\n const g = parseInt(normalized.slice(2, 4), 16);\n const b = parseInt(normalized.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n },\n // 提取趋势标签中的日期\n extractTrendLabelDates(label) {\n const matches = String(label || '').match(/\\d{4}-\\d{2}-\\d{2}/g) || [];\n return matches.map(item => {\n const [year, month, day] = item.split('-').map(Number);\n return {\n year,\n month,\n day\n };\n });\n },\n // 横轴日期标签按范围简化,仅跨年时显示年份\n formatTrendAxisLabel(label) {\n const dates = this.extractTrendLabelDates(label);\n if (dates.length === 0) return label;\n const formatSingleDate = (date, includeYear) => {\n const monthDay = `${date.month}/${date.day}`;\n return includeYear ? `${date.year}/${monthDay}` : monthDay;\n };\n if (dates.length === 1) {\n return formatSingleDate(dates[0], this.trendRangeCrossesYear);\n }\n const [startDate, endDate] = dates;\n if (!this.trendRangeCrossesYear) {\n return `${formatSingleDate(startDate, false)}-${formatSingleDate(endDate, false)}`;\n }\n const endLabel = startDate.year === endDate.year ? formatSingleDate(endDate, false) : formatSingleDate(endDate, true);\n return `${formatSingleDate(startDate, true)}-${endLabel}`;\n },\n // 打开居中的日期范围选择弹窗\n openTrendDateDialog() {\n this.trendDatePickerVisible = true;\n },\n // 日期范围变更后重新拉取趋势数据\n handleTrendDateRangeChange(value) {\n if (!Array.isArray(value) || value.length !== 2 || !value[0] || !value[1]) {\n return;\n }\n this.trendDatePickerVisible = false;\n this.fetchIndexInfo();\n },\n // 获取趋势查询参数\n getTrendDateRangeParams() {\n if (!Array.isArray(this.trendDateRange) || this.trendDateRange.length !== 2) {\n this.trendDateRange = getDefaultTrendDateRange();\n }\n return {\n startDate: this.trendDateRange[0],\n endDate: this.trendDateRange[1]\n };\n },\n // 获取索引信息\n async fetchIndexInfo() {\n this.loading = true;\n try {\n const {\n startDate,\n endDate\n } = this.getTrendDateRangeParams();\n const params = new URLSearchParams({\n action: 'info',\n timezoneOffset: String(new Date().getTimezoneOffset()),\n trendMaxPoints: '90',\n trendSeriesLimit: '8',\n trendStartDate: startDate,\n trendEndDate: endDate\n });\n const response = await fetchWithAuth(`/api/manage/list?${params.toString()}`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.indexInfo = data;\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('获取索引信息失败:', error);\n this.$message.error(this.$t('sysStatus.fetchIndexFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 重建索引 - 使用前端辅助重建流程\n async rebuildIndex() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.rebuilding = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 IndexRebuilder 实例\n this.currentRebuilder = new IndexRebuilder({\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n try {\n const result = await this.currentRebuilder.rebuild();\n\n // 成功完成\n this.$message.success(this.$t('sysStatus.rebuildSuccess', {\n count: result.totalFiles.toLocaleString()\n }));\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.rebuilding = false;\n this.isProcessing = false;\n this.currentRebuilder = null;\n this.processingStartTime = null;\n }\n },\n // 备份数据 - 使用前端辅助备份流程\n async backupData() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.backing = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 BackupGenerator 实例\n this.currentBackupGenerator = new BackupGenerator({\n onProgress: progress => this.handleProgress(progress)\n });\n try {\n const result = await this.currentBackupGenerator.generateBackup();\n\n // 成功完成\n const settingsMsg = result.settingsCount > 0 ? this.$t('sysStatus.backupSuccessWithSettings', {\n fileCount: result.fileCount.toLocaleString(),\n settingsCount: result.settingsCount\n }) : this.$t('sysStatus.backupSuccess', {\n count: result.fileCount.toLocaleString()\n });\n this.$message.success(settingsMsg);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.backing = false;\n this.isProcessing = false;\n this.currentBackupGenerator = null;\n this.processingStartTime = null;\n }\n },\n // 选择恢复文件\n selectRestoreFile() {\n if (this.restoring) return;\n this.$refs.fileInput.click();\n },\n // 处理文件选择\n async handleFileSelect(event) {\n const file = event.target.files[0];\n if (!file) return;\n if (!file.name.endsWith('.json')) {\n this.$message.error(this.$t('sysStatus.selectJsonFile'));\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm(this.$t('sysStatus.restoreConfirmMessage'), this.$t('sysStatus.restoreConfirmTitle'), {\n confirmButtonText: this.$t('sysStatus.restoreConfirmOk'),\n cancelButtonText: this.$t('sysStatus.restoreConfirmCancel'),\n type: 'warning'\n });\n await this.restoreData(file);\n } catch (error) {\n if (error !== 'cancel') {\n console.error('确认恢复失败:', error);\n }\n }\n\n // 清除文件选择\n event.target.value = '';\n },\n // 恢复数据 - 使用前端辅助分批恢复流程\n async restoreData(file) {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.restoring = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n try {\n // 解析备份文件\n const fileContent = await file.text();\n let backupData;\n try {\n backupData = JSON.parse(fileContent);\n } catch (parseError) {\n throw new Error(this.$t('sysStatus.invalidBackupFile'));\n }\n\n // 创建 RestoreProcessor 实例\n this.currentRestoreProcessor = new RestoreProcessor({\n chunkSize: 100,\n // 每批恢复 100 条\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n const result = await this.currentRestoreProcessor.restore(backupData);\n\n // 恢复完成,重置恢复状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n\n // 显示恢复成功消息\n this.$message.success(this.$t('sysStatus.restoreSuccess', {\n files: result.restoredFiles,\n settings: result.restoredSettings\n }));\n\n // 短暂延迟后自动开始重建索引\n await new Promise(resolve => setTimeout(resolve, 500));\n await this.rebuildIndex();\n } catch (error) {\n console.error('恢复数据失败:', error);\n\n // 出错时重置状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(this.$t('sysStatus.restoreFailed') + ': ' + errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return this.$t('sysStatus.unknown');\n const date = new Date(timestamp);\n return date.toLocaleString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n },\n // 计算百分比\n getPercentage(value, total) {\n if (!total || total === 0) return 0;\n return Math.round(value / total * 100);\n },\n // 计算时间差\n getTimeAgo(timestamp) {\n if (!timestamp) return '';\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n if (days > 0) return this.$t('sysStatus.daysAgo', {\n count: days\n });\n if (hours > 0) return this.$t('sysStatus.hoursAgo', {\n count: hours\n });\n if (minutes > 0) return this.$t('sysStatus.minutesAgo', {\n count: minutes\n });\n return this.$t('sysStatus.justNow');\n },\n // 图片加载失败处理\n handleImageError(type) {\n this.loadErrors[type] = true;\n },\n // 检查是否应该显示预览图\n isValidPreview(type, file) {\n if (this.loadErrors[type]) return false;\n if (!file?.metadata?.FileType) return false;\n return file.metadata.FileType.includes('image') || file.metadata.FileType.includes('video');\n },\n // 打开发布页面\n openReleases() {\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/releases', '_blank');\n },\n // 判断是否为图片文件\n isImageFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('image')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'avif', 'heic', 'heif'];\n return imageExtensions.includes(extension);\n },\n // 判断是否为视频文件\n isVideoFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('video')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'm4v', '3gp', 'mpeg', 'mpg'];\n return videoExtensions.includes(extension);\n },\n // 在新窗口打开文件\n openFileInNewTab(file) {\n if (!file?.id) return;\n window.open('/file/' + file.id + '?from=admin', '_blank');\n },\n // 处理进度更新\n handleProgress(progress) {\n this.processingPhase = progress.phase;\n this.processingProgress.message = progress.message || '';\n this.processingProgress.current = progress.current || 0;\n\n // 根据不同阶段计算进度百分比\n if (progress.phase === 'fetching') {\n // 获取阶段:基于已获取的记录数估算(假设总数未知时显示已获取数量)\n this.processingProgress.total = progress.total || 0;\n // 获取阶段占总进度的 60%\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = Math.min(60, progress.current / progress.total * 60);\n } else {\n // 未知总数时,使用对数增长模拟进度\n this.processingProgress.percentage = Math.min(50, Math.log10(progress.current + 1) * 15);\n }\n } else if (progress.phase === 'sorting') {\n // 排序阶段:占 60-70%\n this.processingProgress.percentage = 65;\n this.processingProgress.total = progress.total || this.processingProgress.total;\n } else if (progress.phase === 'uploading') {\n // 上传阶段:占 70-95%\n this.processingProgress.total = progress.total || 0;\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = 70 + progress.current / progress.total * 25;\n }\n } else if (progress.phase === 'finalizing') {\n // 完成阶段:95-100%\n this.processingProgress.percentage = 97;\n } else if (progress.phase === 'building') {\n // 构建备份阶段:70-90%\n this.processingProgress.percentage = 80;\n } else if (progress.phase === 'downloading') {\n // 下载阶段:90-100%\n this.processingProgress.percentage = 95;\n } else if (progress.phase === 'restoring_files') {\n // 恢复文件阶段:0-80%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 0;\n } else if (progress.phase === 'restoring_settings') {\n // 恢复设置阶段:80-100%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 80;\n } else if (progress.phase === 'completed') {\n // 完成\n this.processingProgress.percentage = 100;\n } else if (progress.phase === 'retrying') {\n // 重试阶段:保持当前进度\n this.processingProgress.message = progress.message;\n }\n },\n // 处理错误\n handleError(error) {\n console.error('批量操作错误:', error);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n },\n // 取消当前操作\n cancelOperation() {\n if (this.currentRebuilder) {\n this.currentRebuilder.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentBackupGenerator) {\n this.currentBackupGenerator.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentRestoreProcessor) {\n this.currentRestoreProcessor.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n },\n // 重试操作\n retryOperation() {\n this.processingError = null;\n if (this.rebuilding) {\n this.rebuilding = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.rebuildIndex();\n });\n } else if (this.backing) {\n this.backing = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.backupData();\n });\n }\n },\n // 关闭错误提示\n dismissError() {\n this.processingError = null;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=90d03e30&scoped=true\"\nimport script from \"./SysCogStatus.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogStatus.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogStatus.vue?vue&type=style&index=0&id=90d03e30&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-90d03e30\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, createBlock as _createBlock, createCommentVNode as _createCommentVNode, vShow as _vShow, withModifiers as _withModifiers, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"custom-select\", {\n 'is-open': $data.isOpen\n }]),\n style: _normalizeStyle({\n width: $props.width\n })\n }, [_createElementVNode(\"div\", {\n class: \"custom-select-trigger\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleDropdown && $options.toggleDropdown(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-select-value\", {\n 'is-placeholder': !$props.modelValue\n }])\n }, _toDisplayString($options.displayLabel), 3), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"custom-select-arrow\"\n })]), _createVNode(_Transition, {\n name: \"dropdown-fade\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: \"custom-select-dropdown\",\n onClick: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.options, option => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: option.value,\n class: _normalizeClass([\"custom-select-option\", {\n 'is-selected': $props.modelValue === option.value\n }]),\n onClick: $event => $options.selectOption(option.value)\n }, [_renderSlot(_ctx.$slots, \"option\", {\n option: option\n }, () => [option.channelType ? (_openBlock(), _createBlock(_component_ChannelIcon, {\n key: 0,\n type: option.channelType,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"type\", \"class\"])) : option.icon ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: option.icon,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"icon\", \"class\"])) : _createCommentVNode(\"\", true), _createElementVNode(\"span\", null, _toDisplayString(option.label), 1)], true)], 10, _hoisted_1);\n }), 128))], 512), [[_vShow, $data.isOpen]])]),\n _: 3\n })], 6);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nexport default {\n name: 'CustomSelect',\n components: {\n ChannelIcon\n },\n props: {\n modelValue: {\n type: [String, Number],\n default: ''\n },\n options: {\n type: Array,\n required: true\n // 格式: [{ value: '', label: '', icon?: '', iconClass?: '', channelType?: '' }]\n },\n placeholder: {\n type: String,\n default: ''\n },\n width: {\n type: String,\n default: '160px'\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n isOpen: false\n };\n },\n computed: {\n resolvedPlaceholder() {\n return this.placeholder || this.$t('common.select');\n },\n displayLabel() {\n const selected = this.options.find(opt => opt.value === this.modelValue);\n return selected ? selected.label : this.resolvedPlaceholder;\n }\n },\n mounted() {\n document.addEventListener('click', this.handleClickOutside);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleClickOutside);\n },\n methods: {\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n },\n selectOption(value) {\n this.$emit('update:modelValue', value);\n this.$emit('change', value);\n this.isOpen = false;\n },\n handleClickOutside(e) {\n if (!this.$el.contains(e.target)) {\n this.isOpen = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomSelect.vue?vue&type=template&id=3c680cc7&scoped=true\"\nimport script from \"./CustomSelect.vue?vue&type=script&lang=js\"\nexport * from \"./CustomSelect.vue?vue&type=script&lang=js\"\n\nimport \"./CustomSelect.vue?vue&type=style&index=0&id=3c680cc7&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3c680cc7\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, createCommentVNode as _createCommentVNode, createBlock as _createBlock, withModifiers as _withModifiers, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"page-header\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"header-actions\"\n};\nconst _hoisted_5 = {\n class: \"group-header\"\n};\nconst _hoisted_6 = {\n class: \"group-title\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"load-balance-switch\"\n};\nconst _hoisted_8 = {\n class: \"switch-label\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"channel-cards\"\n};\nconst _hoisted_10 = [\"onMousemove\", \"onMouseleave\"];\nconst _hoisted_11 = {\n class: \"card-header\"\n};\nconst _hoisted_12 = {\n class: \"card-title\"\n};\nconst _hoisted_13 = {\n class: \"channel-name\"\n};\nconst _hoisted_14 = {\n class: \"card-body\"\n};\nconst _hoisted_15 = {\n class: \"card-info\"\n};\nconst _hoisted_16 = {\n class: \"info-item\"\n};\nconst _hoisted_17 = {\n class: \"info-text\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_19 = {\n class: \"info-text\"\n};\nconst _hoisted_20 = {\n key: 1,\n class: \"info-item\"\n};\nconst _hoisted_21 = [\"title\"];\nconst _hoisted_22 = {\n class: \"info-item\"\n};\nconst _hoisted_23 = {\n class: \"info-text\"\n};\nconst _hoisted_24 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_25 = [\"title\"];\nconst _hoisted_26 = {\n class: \"info-item\"\n};\nconst _hoisted_27 = {\n class: \"info-text\"\n};\nconst _hoisted_28 = {\n class: \"info-item\"\n};\nconst _hoisted_29 = {\n class: \"info-text\"\n};\nconst _hoisted_30 = {\n class: \"info-item\"\n};\nconst _hoisted_31 = {\n class: \"info-text\"\n};\nconst _hoisted_32 = {\n class: \"info-item\"\n};\nconst _hoisted_33 = [\"title\"];\nconst _hoisted_34 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_35 = [\"title\"];\nconst _hoisted_36 = {\n key: 0,\n class: \"quota-mini\"\n};\nconst _hoisted_37 = {\n class: \"quota-text\"\n};\nconst _hoisted_38 = {\n class: \"card-actions\"\n};\nconst _hoisted_39 = {\n key: 1,\n class: \"empty-tip\"\n};\nconst _hoisted_40 = {\n class: \"channel-type-option\"\n};\nconst _hoisted_41 = {\n key: 0,\n class: \"form-warning\",\n style: {\n \"margin-top\": \"0\"\n }\n};\nconst _hoisted_42 = [\"innerHTML\"];\nconst _hoisted_43 = {\n class: \"form-warning\"\n};\nconst _hoisted_44 = {\n class: \"quota-label\"\n};\nconst _hoisted_45 = {\n class: \"quota-status\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_CustomSelect = _resolveComponent(\"CustomSelect\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.title')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.titleTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_CustomSelect, {\n modelValue: $data.channelFilter,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.channelFilter = $event),\n options: $options.filterOptions,\n placeholder: _ctx.$t('sysUpload.filterPlaceholder'),\n width: \"160px\"\n }, null, 8, [\"modelValue\", \"options\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => $data.showAddDialog = true),\n class: \"add-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.addChannel')), 1)]),\n _: 1\n })])]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.filteredChannels, channelType => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channelType.value,\n class: \"channel-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_ChannelIcon, {\n type: channelType.value,\n class: _normalizeClass(['group-icon', $options.getChannelIconClass(channelType.value)])\n }, null, 8, [\"type\", \"class\"]), _createElementVNode(\"span\", null, _toDisplayString(channelType.label), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n class: \"channel-count\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelList(channelType.value).length), 1)]),\n _: 2\n }, 1024)]), $options.hasLoadBalance(channelType.value) ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(_ctx.$t('sysUpload.loadBalance')), 1), _createVNode(_component_el_switch, {\n modelValue: $options.getSettings(channelType.value).loadBalance.enabled,\n \"onUpdate:modelValue\": $event => $options.getSettings(channelType.value).loadBalance.enabled = $event,\n size: \"small\",\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])])) : _createCommentVNode(\"\", true)]), $options.getChannelList(channelType.value).length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.getChannelList(channelType.value), (channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel.name || index,\n class: _normalizeClass([\"channel-card\", [channelType.value, {\n 'disabled': !channel.enabled,\n 'fixed': channel.fixed\n }]]),\n onMousemove: $event => $options.handleCardMouseMove($event, channelType.value, index),\n onMouseleave: $event => $options.handleCardMouseLeave(channelType.value, index)\n }, [_createElementVNode(\"div\", {\n class: \"card-glow\",\n ref_for: true,\n ref: `glow-${channelType.value}-${index}`\n }, null, 512), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(channel.name || _ctx.$t('sysUpload.unnamedChannel')), 1), channel.fixed ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event,\n size: \"small\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [channelType.value === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_17, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), channel.chatId ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_19, \"Channel: \" + _toDisplayString($options.maskText(channel.chatId)), 1)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_20, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_21)])) : channelType.value === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"server\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_23, _toDisplayString(channel.bucketName || _ctx.$t('sysUpload.notSet')), 1)]), channel.endpoint ? (_openBlock(), _createElementBlock(\"div\", _hoisted_24, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.endpoint\n }, _toDisplayString(channel.endpoint), 9, _hoisted_25)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createElementVNode(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_27, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_29, \"Channel: \" + _toDisplayString($options.maskText(channel.channelId)), 1)]), channel.isNitro ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"success\"\n }, {\n default: _withCtx(() => [...(_cache[78] || (_cache[78] = [_createTextVNode(\"Nitro\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createElementVNode(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(channel.repo || _ctx.$t('sysUpload.notSet')), 1)]), channel.isPrivate ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.baseUrl\n }, _toDisplayString(channel.baseUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_33)]), channel.publicUrl ? (_openBlock(), _createElementBlock(\"div\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl), 9, _hoisted_35)])) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]), channel.quota?.enabled ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 6\n }, null, 8, [\"percentage\", \"status\"]), _createElementVNode(\"span\", _hoisted_37, _toDisplayString($options.getQuotaText(channel)), 1)])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_38, [_createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openDetailDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"eye\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.detail')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openEditDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"danger\",\n size: \"small\",\n onClick: $event => $options.deleteChannel(channelType.value, index),\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])], 42, _hoisted_10);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_39, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\",\n class: \"empty-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysUpload.noChannels', {\n type: channelType.label\n })), 1)]))]);\n }), 128)), _createVNode(_component_el_dialog, {\n modelValue: $data.showAddDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showAddDialog = $event),\n title: _ctx.$t('sysUpload.addDialogTitle'),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetAddForm\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showAddDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), $data.newChannel.type !== 'cfr2' ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.confirmAddChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.confirmAdd')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newChannel,\n \"label-position\": \"top\",\n ref: \"addForm\",\n rules: $options.addRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelTypeLabel'),\n prop: \"type\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.newChannel.type,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.newChannel.type = $event),\n placeholder: _ctx.$t('sysUpload.channelTypePlaceholder'),\n style: {\n \"width\": \"100%\"\n },\n onChange: $options.onChannelTypeChange\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.addableChannels, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.value,\n label: ch.label,\n value: ch.value\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_40, [_createVNode(_component_ChannelIcon, {\n type: ch.value,\n class: _normalizeClass(['select-option-icon', $options.getChannelIconClass(ch.value)])\n }, null, 8, [\"type\", \"class\"]), _createElementVNode(\"span\", null, _toDisplayString(ch.label), 1)])]),\n _: 2\n }, 1032, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.type === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_41, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createElementVNode(\"span\", {\n innerHTML: _ctx.$t('sysUpload.r2ConfigNote')\n }, null, 8, _hoisted_42)])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameImmutableTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.name,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.newChannel.name = $event),\n placeholder: _ctx.$t('sysUpload.channelNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), $data.newChannel.type === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.chatId,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.newChannel.chatId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.chatIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.newChannel.type === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.endpoint,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.newChannel.endpoint = $event),\n placeholder: _ctx.$t('sysUpload.endpointPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.newChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.bucketName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.newChannel.bucketName = $event),\n placeholder: _ctx.$t('sysUpload.bucketNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.region,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.newChannel.region = $event),\n placeholder: _ctx.$t('sysUpload.bucketRegionPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newChannel.accessKeyId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessKeyIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newChannel.secretAccessKey = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.secretAccessKeyPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.newChannel.pathStyle = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.newChannel.type === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.channelId,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newChannel.channelId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.channelIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isNitro,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_43, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.discordWarning')), 1)])], 64)) : $data.newChannel.type === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.repo,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newChannel.repo = $event),\n placeholder: _ctx.$t('sysUpload.repoNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.token,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newChannel.token = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.newChannel.type === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newChannel.baseUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavBaseUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.username,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.newChannel.username = $event),\n placeholder: _ctx.$t('sysUpload.webdavUsernamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.password,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.newChannel.password = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.webdavPasswordPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.newChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.headersText,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.newChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.newChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)], 64))]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showDetailDialog,\n \"onUpdate:modelValue\": _cache[37] || (_cache[37] = $event => $data.showDetailDialog = $event),\n title: _ctx.$t('sysUpload.detailDialogTitle', {\n name: $data.currentChannel?.name || ''\n }),\n class: \"channel-dialog\",\n onClosed: $options.resetDetailData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[36] || (_cache[36] = $event => $data.showDetailDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.closeBtn')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.openEditFromDetail\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_descriptions, {\n column: 1,\n border: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelNameDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelTypeDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelTypeLabel($data.currentChannelType)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.statusLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: $data.currentChannel?.enabled ? 'success' : 'info'\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.enabled ? _ctx.$t('sysUpload.enabled') : _ctx.$t('sysUpload.disabled')), 1)]),\n _: 1\n }, 8, [\"type\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannel?.fixed ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 0,\n label: _ctx.$t('sysUpload.configSource')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.chatIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.chatId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 2,\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"])) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.endpointLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.endpoint,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.cdnDomain || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.bucketName), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketRegion')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.region), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.pathStyle ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.channelId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isNitro ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.repoName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.repo), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isPrivate ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 6\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.baseUrl,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.username || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $options.formatHeaders($data.currentChannel?.headers),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.createDirectory !== false ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true), $data.currentChannel?.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 7\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.limitGB) + \" GB\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.threshold) + \"%\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, null, {\n label: _withCtx(() => [_createElementVNode(\"span\", _hoisted_44, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.currentUsage')) + \" \", 1), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\",\n class: _normalizeClass({\n 'fa-spin': $data.quotaLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_45, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage($data.currentChannel),\n status: $options.getQuotaStatus($data.currentChannel),\n \"stroke-width\": 16,\n \"text-inside\": true,\n format: () => $options.getQuotaText($data.currentChannel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded($data.currentChannel)\n }])\n }, _toDisplayString($options.getQuotaStatusText($data.currentChannel)), 3)])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditDialog,\n \"onUpdate:modelValue\": _cache[77] || (_cache[77] = $event => $data.showEditDialog = $event),\n title: _ctx.$t('sysUpload.editDialogTitle', {\n name: $data.editChannel?.name || ''\n }),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetEditData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[76] || (_cache[76] = $event => $data.showEditDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmEditChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.saveChanges')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editChannel,\n \"label-position\": \"top\",\n ref: \"editForm\",\n rules: $options.editRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameEditDisabledTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.name,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.editChannel.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.enableChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.enabled,\n \"onUpdate:modelValue\": _cache[39] || (_cache[39] = $event => $data.editChannel.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[40] || (_cache[40] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.chatId,\n \"onUpdate:modelValue\": _cache[41] || (_cache[41] = $event => $data.editChannel.chatId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[42] || (_cache[42] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[43] || (_cache[43] = $event => $data.editChannel.publicUrl = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[44] || (_cache[44] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[45] || (_cache[45] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[46] || (_cache[46] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[47] || (_cache[47] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.endpoint,\n \"onUpdate:modelValue\": _cache[48] || (_cache[48] = $event => $data.editChannel.endpoint = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[49] || (_cache[49] = $event => $data.editChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.bucketName,\n \"onUpdate:modelValue\": _cache[50] || (_cache[50] = $event => $data.editChannel.bucketName = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.region,\n \"onUpdate:modelValue\": _cache[51] || (_cache[51] = $event => $data.editChannel.region = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[52] || (_cache[52] = $event => $data.editChannel.accessKeyId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[53] || (_cache[53] = $event => $data.editChannel.secretAccessKey = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[54] || (_cache[54] = $event => $data.editChannel.pathStyle = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[55] || (_cache[55] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[56] || (_cache[56] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[57] || (_cache[57] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[58] || (_cache[58] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[59] || (_cache[59] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.channelId,\n \"onUpdate:modelValue\": _cache[60] || (_cache[60] = $event => $data.editChannel.channelId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[61] || (_cache[61] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isNitro,\n \"onUpdate:modelValue\": _cache[62] || (_cache[62] = $event => $data.editChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.repo,\n \"onUpdate:modelValue\": _cache[63] || (_cache[63] = $event => $data.editChannel.repo = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.token,\n \"onUpdate:modelValue\": _cache[64] || (_cache[64] = $event => $data.editChannel.token = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[65] || (_cache[65] = $event => $data.editChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[66] || (_cache[66] = $event => $data.editChannel.baseUrl = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.username,\n \"onUpdate:modelValue\": _cache[67] || (_cache[67] = $event => $data.editChannel.username = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.password,\n \"onUpdate:modelValue\": _cache[68] || (_cache[68] = $event => $data.editChannel.password = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[69] || (_cache[69] = $event => $data.editChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.headersText,\n \"onUpdate:modelValue\": _cache[70] || (_cache[70] = $event => $data.editChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[71] || (_cache[71] = $event => $data.editChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[72] || (_cache[72] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[73] || (_cache[73] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[74] || (_cache[74] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[75] || (_cache[75] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nimport CustomSelect from './CustomSelect.vue';\nexport default {\n components: {\n ChannelIcon,\n CustomSelect\n },\n data() {\n return {\n // 渠道类型筛选\n channelFilter: '',\n // 渠道类型列表\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 可添加的渠道类型\n addableChannels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 各渠道配置\n telegramSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n cfr2Settings: {\n channels: []\n },\n s3Settings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n discordSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n huggingfaceSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n webdavSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n // 弹窗控制\n showAddDialog: false,\n showDetailDialog: false,\n showEditDialog: false,\n // 当前操作的渠道\n currentChannelType: '',\n currentChannelIndex: -1,\n currentChannel: null,\n editChannel: {},\n // 新增渠道表单\n newChannel: {\n type: '',\n name: '',\n enabled: true,\n // Telegram\n botToken: '',\n chatId: '',\n proxyUrl: '',\n // S3\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n // Discord\n channelId: '',\n isNitro: false,\n // HuggingFace\n repo: '',\n token: '',\n isPrivate: false,\n // WebDAV\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 筛选下拉框选项\n filterOptions() {\n return [{\n value: '',\n label: this.$t('common.all')\n }, ...this.channels.map(ch => ({\n value: ch.value,\n label: ch.label,\n channelType: ch.value,\n iconClass: this.getChannelIconClass(ch.value)\n }))];\n },\n // 根据筛选条件过滤渠道类型\n filteredChannels() {\n if (!this.channelFilter) {\n return this.channels;\n }\n return this.channels.filter(ch => ch.value === this.channelFilter);\n },\n addRules() {\n return {\n type: [{\n required: true,\n message: this.$t('sysUpload.channelTypePlaceholder'),\n trigger: 'change'\n }],\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n },\n editRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n // 卡片光斑跟随鼠标\n handleCardMouseMove(event, channelType, index) {\n const card = event.currentTarget;\n const rect = card.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '1';\n glowEl[0].style.left = `${x}px`;\n glowEl[0].style.top = `${y}px`;\n }\n },\n handleCardMouseLeave(channelType, index) {\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '0';\n }\n },\n getChannelIconClass(type) {\n return `channel-brand-${type}`;\n },\n // 获取渠道类型标签\n getChannelTypeLabel(type) {\n const channel = this.channels.find(c => c.value === type);\n return channel ? channel.label : type;\n },\n // 获取渠道列表\n getChannelList(type) {\n return this.getSettings(type)?.channels || [];\n },\n // 获取渠道设置对象\n getSettings(type) {\n const map = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n return map[type];\n },\n // 是否有负载均衡选项\n hasLoadBalance(type) {\n return ['telegram', 's3', 'discord', 'huggingface', 'webdav'].includes(type);\n },\n // 文本脱敏\n maskText(text, showLength = 4) {\n if (!text) return this.$t('sysUpload.notSet');\n if (text.length <= showLength * 2) return '****';\n return text.slice(0, showLength) + '****' + text.slice(-showLength);\n },\n formatHeaders(headers) {\n if (!headers || typeof headers === 'object' && Object.keys(headers).length === 0) {\n return this.$t('sysUpload.notSet');\n }\n if (typeof headers === 'string') {\n return headers;\n }\n return JSON.stringify(headers, null, 2);\n },\n headersToText(headers) {\n if (!headers) return '';\n if (typeof headers === 'string') return headers;\n return JSON.stringify(headers, null, 2);\n },\n parseHeadersText(text) {\n if (!text || !text.trim()) return {};\n try {\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null;\n }\n return parsed;\n } catch (error) {\n return null;\n }\n },\n // 打开详情弹窗\n openDetailDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n this.currentChannel = this.getChannelList(type)[index];\n this.showDetailDialog = true;\n },\n // 打开编辑弹窗\n openEditDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n const channel = this.getChannelList(type)[index];\n this.editChannel = JSON.parse(JSON.stringify(channel));\n if (type === 'webdav') {\n this.editChannel.headersText = this.headersToText(this.editChannel.headers);\n this.editChannel.createDirectory = this.editChannel.createDirectory !== false;\n }\n // 确保 quota 对象存在\n if (!this.editChannel.quota) {\n this.editChannel.quota = {\n enabled: false,\n limitGB: 10,\n threshold: 95\n };\n }\n this.showEditDialog = true;\n },\n // 从详情页打开编辑\n openEditFromDetail() {\n this.showDetailDialog = false;\n this.openEditDialog(this.currentChannelType, this.currentChannelIndex);\n },\n // 重置添加表单\n resetAddForm() {\n this.newChannel = {\n type: '',\n name: '',\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 重置详情弹窗数据\n resetDetailData() {\n this.currentChannel = null;\n },\n // 重置编辑弹窗数据\n resetEditData() {\n this.editChannel = {};\n },\n // 渠道类型变更时重置表单\n onChannelTypeChange() {\n // 保留 type 和 name,重置其他字段\n const {\n type,\n name\n } = this.newChannel;\n this.newChannel = {\n type,\n name,\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 确认添加渠道\n confirmAddChannel() {\n this.$refs.addForm.validate(valid => {\n if (!valid) return;\n const {\n type,\n name\n } = this.newChannel;\n const settings = this.getSettings(type);\n\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env', 'WebDAV_env'];\n if (reservedNames.includes(name)) {\n this.$message.warning(this.$t('sysUpload.reservedName'));\n return;\n }\n\n // 检查名称是否重复\n const isDuplicate = settings.channels.some(ch => ch.name === name);\n if (isDuplicate) {\n this.$message.warning(this.$t('sysUpload.duplicateName'));\n return;\n }\n let newChannelData = {\n id: settings.channels.length + 1,\n name: this.newChannel.name,\n type: type,\n savePath: 'database',\n enabled: true,\n fixed: false\n };\n\n // 根据类型添加特定字段\n if (type === 'telegram') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n chatId: this.newChannel.chatId,\n proxyUrl: this.newChannel.proxyUrl\n });\n } else if (type === 's3') {\n Object.assign(newChannelData, {\n endpoint: this.newChannel.endpoint,\n cdnDomain: this.newChannel.cdnDomain,\n bucketName: this.newChannel.bucketName,\n region: this.newChannel.region,\n accessKeyId: this.newChannel.accessKeyId,\n secretAccessKey: this.newChannel.secretAccessKey,\n pathStyle: this.newChannel.pathStyle,\n quota: {\n ...this.newChannel.quota\n }\n });\n } else if (type === 'discord') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n channelId: this.newChannel.channelId,\n proxyUrl: this.newChannel.proxyUrl,\n isNitro: this.newChannel.isNitro\n });\n } else if (type === 'huggingface') {\n Object.assign(newChannelData, {\n repo: this.newChannel.repo,\n token: this.newChannel.token,\n isPrivate: this.newChannel.isPrivate\n });\n } else if (type === 'webdav') {\n const headers = this.parseHeadersText(this.newChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n Object.assign(newChannelData, {\n baseUrl: this.newChannel.baseUrl,\n username: this.newChannel.username,\n password: this.newChannel.password,\n publicUrl: this.newChannel.publicUrl,\n headers,\n createDirectory: this.newChannel.createDirectory !== false,\n quota: {\n ...this.newChannel.quota\n }\n });\n }\n settings.channels.push(newChannelData);\n this.showAddDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 确认编辑渠道\n confirmEditChannel() {\n this.$refs.editForm.validate(valid => {\n if (!valid) return;\n const settings = this.getSettings(this.currentChannelType);\n const currentIndex = this.currentChannelIndex;\n const originalName = settings.channels[currentIndex]?.name || this.editChannel.name;\n const editedChannel = {\n ...this.editChannel,\n name: originalName\n };\n if (this.currentChannelType === 'webdav') {\n const headers = this.parseHeadersText(editedChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n editedChannel.headers = headers;\n editedChannel.createDirectory = editedChannel.createDirectory !== false;\n delete editedChannel.headersText;\n }\n settings.channels[this.currentChannelIndex] = editedChannel;\n this.showEditDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 删除渠道\n deleteChannel(type, index) {\n const channel = this.getChannelList(type)[index];\n if (channel.fixed) {\n this.$message.warning(this.$t('sysUpload.fixedChannelCannotDelete'));\n return;\n }\n this.$confirm(this.$t('sysUpload.deleteChannelConfirm'), this.$t('common.warning'), {\n confirmButtonText: this.$t('common.confirm'),\n cancelButtonText: this.$t('common.cancel'),\n type: 'warning'\n }).then(() => {\n const settings = this.getSettings(type);\n settings.channels.splice(index, 1);\n // 重新调整 id\n settings.channels.forEach((item, i) => {\n item.id = i + 1;\n });\n // 自动保存\n this.saveSettings();\n }).catch(() => {});\n },\n saveSettings() {\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n fetchWithAuth('/api/manage/sysConfig/upload', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success(this.$t('sysOthers.settingsSaved'));\n });\n },\n // 获取容量统计(重新计算)\n async refreshQuota() {\n this.quotaLoading = true;\n try {\n // 使用 POST 请求重新统计容量(会触发索引重建)\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n } else {\n // 如果重新统计失败,尝试获取已有数据\n const getResponse = await fetchWithAuth('/api/manage/quota');\n const getData = await getResponse.json();\n if (getData.success) {\n this.quotaStats = getData.quotaStats || {};\n }\n }\n } catch (error) {\n console.error('Failed to refresh quota stats:', error);\n } finally {\n this.quotaLoading = false;\n }\n },\n // 获取容量统计(仅读取,不重建索引)\n async loadQuotaStats() {\n try {\n const response = await fetchWithAuth('/api/manage/quota');\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.quotaStats || {};\n }\n } catch (error) {\n console.error('Failed to load quota stats:', error);\n }\n },\n // 获取渠道已用容量 (GB)\n getChannelUsedGB(channel) {\n const stats = this.quotaStats[channel.name];\n if (!stats) return 0;\n return (stats.usedMB || 0) / 1024;\n },\n // 获取容量百分比\n getQuotaPercentage(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n const percentage = usedGB / limitGB * 100;\n return Math.min(100, Math.round(percentage * 10) / 10);\n },\n // 获取进度条状态\n getQuotaStatus(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) return 'exception';\n if (percentage >= 80) return 'warning';\n return 'success';\n },\n // 获取容量文本\n getQuotaText(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n return `${usedGB.toFixed(2)} / ${limitGB} GB`;\n },\n // 判断是否超过阈值\n isQuotaExceeded(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n return percentage >= threshold;\n },\n // 获取状态文本\n getQuotaStatusText(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) {\n return `⚠️ 已达到容量阈值 (${threshold}%),渠道写入已暂停`;\n }\n if (percentage >= 80) {\n return `⚡ 容量使用较高,接近阈值`;\n }\n return `✓ 容量正常`;\n },\n // 容量限制开关变化时\n async onQuotaEnabledChange(enabled, channel) {\n if (enabled && channel.name) {\n // 首次启用时,检查是否有该渠道的统计数据\n const stats = this.quotaStats[channel.name];\n if (!stats) {\n // 没有统计数据,提示用户需要重新统计\n this.$confirm(this.$t('sysUpload.quotaInitConfirm'), this.$t('sysUpload.quotaInitTitle'), {\n confirmButtonText: this.$t('sysUpload.quotaInitConfirmBtn'),\n cancelButtonText: this.$t('sysUpload.quotaInitCancelBtn'),\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info(this.$t('sysUpload.quotaInitLater'));\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info(this.$t('sysUpload.quotaCalculating'));\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n this.$message.success(this.$t('sysUpload.quotaCalculateSuccess'));\n } else {\n this.$message.error(this.$t('sysUpload.quotaCalculateError') + (data.error || ''));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error(this.$t('sysUpload.quotaCalculateFailed'));\n } finally {\n this.quotaLoading = false;\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/upload').then(response => response.json()).then(data => {\n this.telegramSettings = data.telegram;\n // 确保 R2 渠道有 quota 默认值\n if (data.cfr2 && data.cfr2.channels) {\n data.cfr2.channels = data.cfr2.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.cfr2Settings = data.cfr2;\n // 确保 S3 渠道有 quota 默认值\n if (data.s3 && data.s3.channels) {\n data.s3.channels = data.s3.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.s3Settings = data.s3;\n // 确保 Discord 渠道有默认值\n if (data.discord && data.discord.channels) {\n data.discord.channels = data.discord.channels.map(channel => ({\n ...channel,\n proxyUrl: channel.proxyUrl || ''\n }));\n }\n this.discordSettings = data.discord || {\n loadBalance: {},\n channels: []\n };\n // 确保 HuggingFace 渠道有默认值\n if (data.huggingface && data.huggingface.channels) {\n data.huggingface.channels = data.huggingface.channels.map(channel => ({\n ...channel,\n isPrivate: channel.isPrivate || false\n }));\n }\n this.huggingfaceSettings = data.huggingface || {\n loadBalance: {},\n channels: []\n };\n // 确保 WebDAV 渠道有默认值\n if (data.webdav && data.webdav.channels) {\n data.webdav.channels = data.webdav.channels.map(channel => ({\n ...channel,\n username: channel.username || '',\n password: channel.password || '',\n publicUrl: channel.publicUrl || '',\n headers: channel.headers || {},\n createDirectory: channel.createDirectory !== false,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.webdavSettings = data.webdav || {\n loadBalance: {},\n channels: []\n };\n // 加载容量统计(仅读取,不重建索引)\n this.loadQuotaStats();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogUpload.vue?vue&type=template&id=9a9d7c2a&scoped=true\"\nimport script from \"./SysCogUpload.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogUpload.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogUpload.vue?vue&type=style&index=0&id=9a9d7c2a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-9a9d7c2a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, vShow as _vShow, normalizeClass as _normalizeClass, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"save-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Transition, {\n name: \"fade-up\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: _normalizeClass([\"floating-save-btn\", {\n 'is-loading': $props.loading\n }]),\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleClick && $options.handleClick(...args))\n }, [$props.loading ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"spinner\",\n spin: \"\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"save\"\n })), _createElementVNode(\"span\", _hoisted_1, _toDisplayString($props.loading ? _ctx.$t('floatingSave.saving') : _ctx.$t('floatingSave.save')), 1)], 2), [[_vShow, $data.visible]])]),\n _: 1\n });\n}","export default {\n name: 'FloatingSaveButton',\n emits: ['click'],\n props: {\n loading: {\n type: Boolean,\n default: false\n },\n show: {\n type: Boolean,\n default: true\n }\n },\n data() {\n return {\n visible: false\n };\n },\n watch: {\n show: {\n immediate: true,\n handler(val) {\n if (val) {\n // 延迟显示,等待 Element Plus 加载遮罩淡出动画完成\n setTimeout(() => {\n this.visible = true;\n }, 600);\n } else {\n this.visible = false;\n }\n }\n }\n },\n methods: {\n handleClick() {\n if (!this.loading) {\n this.$emit('click');\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FloatingSaveButton.vue?vue&type=template&id=53091626&scoped=true\"\nimport script from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\nexport * from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\n\nimport \"./FloatingSaveButton.vue?vue&type=style&index=0&id=53091626&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-53091626\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"security-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"second-title\"\n};\nconst _hoisted_5 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_6 = {\n class: \"second-title\"\n};\nconst _hoisted_7 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_8 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_9 = {\n class: \"token-actions\"\n};\nconst _hoisted_10 = {\n class: \"token-table-container\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_12 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_13 = {\n class: \"token-display\"\n};\nconst _hoisted_14 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_15 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_16 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_17 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_18 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_19 = {\n class: \"first-settings\"\n};\nconst _hoisted_20 = {\n class: \"first-title\"\n};\nconst _hoisted_21 = {\n class: \"second-title\"\n};\nconst _hoisted_22 = {\n class: \"second-title\"\n};\nconst _hoisted_23 = {\n class: \"query-param-list\"\n};\nconst _hoisted_24 = {\n class: \"query-param-list\"\n};\nconst _hoisted_25 = {\n class: \"first-settings\"\n};\nconst _hoisted_26 = {\n class: \"first-title\"\n};\nconst _hoisted_27 = {\n class: \"second-title\"\n};\nconst _hoisted_28 = {\n class: \"second-title\"\n};\nconst _hoisted_29 = {\n class: \"second-title\"\n};\nconst _hoisted_30 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_31 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_32 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_33 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_34 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_35 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_36 = {\n class: \"token-result\"\n};\nconst _hoisted_37 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_38 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, _toDisplayString(_ctx.$t('sysSecurity.authManagement')), 1), _createElementVNode(\"h4\", _hoisted_4, _toDisplayString(_ctx.$t('sysSecurity.userAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $options.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.uploadPassword'),\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.authCode,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.authSettings.user.authCode = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleUserPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.user._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearUserPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.user._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.clearUserPassword = $event),\n onChange: $options.handleClearUserPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewUserPassword\",\n key: \"user-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.confirmNewUserPassword,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_6, _toDisplayString(_ctx.$t('sysSecurity.adminAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $options.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminUsername'),\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\",\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminPassword'),\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.admin._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.admin._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearAdminPassword,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.clearAdminPassword = $event),\n onChange: $options.handleClearAdminPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewAdminPassword\",\n key: \"admin-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.confirmNewAdminPassword,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.apiTokenManagement')) + \" \", 1), _createElementVNode(\"a\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[7] || (_cache[7] = $event => $data.showCreateTokenDialog = true),\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n })])]), _createElementVNode(\"div\", _hoisted_10, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $data.apiTokens,\n class: \"token-table\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"name\",\n label: _ctx.$t('sysSecurity.tokenName'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: _ctx.$t('sysSecurity.tokenValue'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: _ctx.$t('sysSecurity.permissions'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_14, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(scope.row.permissions, perm => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: perm,\n size: \"small\",\n class: \"permission-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getPermissionText(perm)), 1)]),\n _: 2\n }, 1024);\n }), 128))])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: _ctx.$t('sysSecurity.createdAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_15, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.status'),\n \"header-align\": \"center\",\n width: \"90\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_tag, {\n type: $options.getTokenStatus(scope.row.expiresAt).status === 'active' ? 'success' : 'danger',\n size: \"small\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getTokenStatus(scope.row.expiresAt).label), 1)]),\n _: 2\n }, 1032, [\"type\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.expiresAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_17, _toDisplayString($options.getTokenStatus(scope.row.expiresAt).expiresText), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.operation'),\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteToken(scope.row.id)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"h3\", _hoisted_20, _toDisplayString(_ctx.$t('sysSecurity.uploadManagement')), 1), _createElementVNode(\"h4\", _hoisted_21, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.imageReview')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.imageReviewTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableReview')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.reviewChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: _ctx.$t('sysSecurity.reviewChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"moderatecontent.com\",\n value: \"moderatecontent.com\"\n }), _createVNode(_component_el_option, {\n label: \"nsfwjs\",\n value: \"nsfwjs\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.apiKey')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.ipQuery')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.ipQueryTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.ipQuery,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableIpQuery')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.ipQuery.enabled,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.uploadSettings.ipQuery.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.ipQueryChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.ipQuery.channel,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.uploadSettings.ipQuery.channel = $event),\n placeholder: _ctx.$t('sysSecurity.ipQueryChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: _ctx.$t('sysSecurity.customApi'),\n value: \"customApi\"\n }, null, 8, [\"label\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.ipQuery.channel === 'customApi' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.url,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.uploadSettings.ipQuery.customApi.url = $event),\n placeholder: \"https://api.example.com/ip\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.queryParams')\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_23, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.params, (param, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"query-param-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: param.key,\n \"onUpdate:modelValue\": $event => param.key = $event,\n placeholder: _ctx.$t('sysSecurity.paramNamePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_input, {\n modelValue: param.value,\n \"onUpdate:modelValue\": $event => param.value = $event,\n placeholder: _ctx.$t('sysSecurity.paramValuePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryParam(index),\n disabled: $data.uploadSettings.ipQuery.customApi.params.length <= 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryParam\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addQueryParam')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.responseFields')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.responseFieldsTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.responseFields, (field, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"response-field-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.responseFields[index],\n \"onUpdate:modelValue\": $event => $data.uploadSettings.ipQuery.customApi.responseFields[index] = $event,\n placeholder: _ctx.$t('sysSecurity.responseFieldPathPlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, -1),\n disabled: index === 0\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, 1),\n disabled: index === $data.uploadSettings.ipQuery.customApi.responseFields.length - 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryResponseField(index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryResponseField\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addResponseField')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"h3\", _hoisted_26, _toDisplayString(_ctx.$t('sysSecurity.accessManagement')), 1), _createElementVNode(\"h4\", _hoisted_27, _toDisplayString(_ctx.$t('sysSecurity.domainFilter')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.allowedDomains')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.allowedDomainsTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_28, _toDisplayString(_ctx.$t('sysSecurity.whiteListMode')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n rules: $options.accessRules,\n ref: \"accessForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.enableWhiteList')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.enableWhiteListTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_29, _toDisplayString(_ctx.$t('sysSecurity.sessionSecurityPolicy')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.secureMode')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.secureModeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.sessionSecure,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.accessSettings.sessionSecure = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.userSessionMaxAge'),\n prop: \"userSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.userSessionMaxAge,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.accessSettings.userSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_30, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminSessionMaxAge'),\n prop: \"adminSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.adminSessionMaxAge,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.accessSettings.adminSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.showCreateTokenDialog = $event),\n title: _ctx.$t('sysSecurity.createTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_33, [_createVNode(_component_el_button, {\n onClick: _cache[26] || (_cache[26] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.createBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $options.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newToken.name = $event),\n placeholder: _ctx.$t('sysSecurity.tokenNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.neverExpire,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newToken.neverExpire = $event),\n onChange: $options.onCreateNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n modelValue: $data.newToken.expirationValue,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.newToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.autoDelete,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showEditTokenDialog = $event),\n title: _ctx.$t('sysSecurity.editTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_35, [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.updateBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $options.editTokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.neverExpire,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.editingToken.neverExpire = $event),\n onChange: $options.onEditNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_34, [_createVNode(_component_el_input_number, {\n modelValue: $data.editingToken.expirationValue,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.editingToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.editingToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.editingToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.autoDelete,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.editingToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.showTokenResultDialog = $event),\n title: _ctx.$t('sysSecurity.tokenCreatedTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_38, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[37] || (_cache[37] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.savedBtn')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"p\", _hoisted_37, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysSecurity.tokenCreatedWarning')), 1)]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.fullToken')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[36] || (_cache[36] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.copyBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","/**\r\n * Token 过期时间工具模块\r\n * 提供 Token 有效期计算、状态判定和向后兼容默认值填充功能\r\n */\r\n\r\n/**\r\n * 时间单位到毫秒的映射(月和年需要特殊处理)\r\n */\r\nconst SIMPLE_UNIT_MS = {\r\n s: 1000,\r\n m: 60 * 1000,\r\n h: 60 * 60 * 1000,\r\n d: 24 * 60 * 60 * 1000,\r\n};\r\n\r\n/**\r\n * 根据基准时间、数值和时间单位计算过期时间\r\n * @param {Date|string} baseTime - 基准时间(Date 对象或 ISO 8601 字符串)\r\n * @param {number} value - 正整数有效期数值\r\n * @param {string} unit - 时间单位:'s','m','h','d','M','Y'\r\n * @returns {string} 过期时间 ISO 8601 字符串\r\n * @throws {Error} 当 value <= 0 或 unit 无效时抛出错误\r\n */\r\nexport function computeExpiresAt(baseTime, value, unit) {\r\n if (!Number.isFinite(value) || value <= 0) {\r\n throw new Error('有效期数值必须大于 0');\r\n }\r\n\r\n const base = typeof baseTime === 'string' ? new Date(baseTime) : new Date(baseTime.getTime());\r\n\r\n if (SIMPLE_UNIT_MS[unit]) {\r\n return new Date(base.getTime() + value * SIMPLE_UNIT_MS[unit]).toISOString();\r\n }\r\n\r\n if (unit === 'M') {\r\n base.setUTCMonth(base.getUTCMonth() + value);\r\n return base.toISOString();\r\n }\r\n\r\n if (unit === 'Y') {\r\n base.setUTCFullYear(base.getUTCFullYear() + value);\r\n return base.toISOString();\r\n }\r\n\r\n throw new Error(`无效的时间单位: ${unit}`);\r\n}\r\n\r\n\r\n/**\r\n * 格式化过期时间为可读字符串\r\n * @param {string} isoString - ISO 8601 时间字符串\r\n * @returns {string} 格式化后的时间字符串\r\n */\r\nfunction formatExpiresTime(isoString) {\r\n const date = new Date(isoString);\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours = String(date.getHours()).padStart(2, '0');\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n}\r\n\r\n/**\r\n * 获取 Token 的状态信息\r\n * @param {string|null} expiresAt - 过期时间 ISO 8601 字符串,null 表示永不过期\r\n * @param {Date} [now=new Date()] - 当前时间\r\n * @returns {{ status: 'active'|'expired', label: '有效'|'已过期', expiresText: string }}\r\n */\r\nexport function getTokenStatus(expiresAt, now = new Date()) {\r\n if (expiresAt === null || expiresAt === undefined) {\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: '永不过期',\r\n };\r\n }\r\n\r\n const expiresDate = new Date(expiresAt);\r\n const currentTime = now instanceof Date ? now : new Date(now);\r\n const formattedTime = formatExpiresTime(expiresAt);\r\n\r\n if (currentTime.getTime() > expiresDate.getTime()) {\r\n return {\r\n status: 'expired',\r\n label: '已过期',\r\n expiresText: formattedTime,\r\n };\r\n }\r\n\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: formattedTime,\r\n };\r\n}\r\n\r\n\r\n/**\r\n * 为缺少过期相关字段的旧 Token 数据填充默认值\r\n * @param {Object} tokenData - Token 数据对象\r\n * @returns {Object} 填充默认值后的新 Token 数据对象\r\n */\r\nexport function applyTokenDefaults(tokenData) {\r\n return {\r\n ...tokenData,\r\n expiresAt: tokenData.expiresAt ?? null,\r\n autoDelete: tokenData.autoDelete ?? false,\r\n };\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nimport { computeExpiresAt, getTokenStatus } from '@/utils/tokenExpiration';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n authSettings: {\n user: {},\n admin: {}\n },\n uploadSettings: {\n moderate: {},\n ipQuery: {\n enabled: false,\n channel: 'customApi',\n customApi: {\n url: '',\n params: [{\n key: 'ip',\n value: '{ip}'\n }],\n responseFields: []\n }\n }\n },\n accessSettings: {},\n apiTokens: [],\n // API Token列表\n // 加载状态\n loading: true,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n clearUserPassword: false,\n // 清除用户密码开关\n clearAdminPassword: false,\n // 清除管理密码开关\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n timeUnitOptions: [{\n labelKey: 'sysSecurity.timeUnitSeconds',\n value: 's'\n }, {\n labelKey: 'sysSecurity.timeUnitMinutes',\n value: 'm'\n }, {\n labelKey: 'sysSecurity.timeUnitHours',\n value: 'h'\n }, {\n labelKey: 'sysSecurity.timeUnitDays',\n value: 'd'\n }, {\n labelKey: 'sysSecurity.timeUnitMonths',\n value: 'M'\n }, {\n labelKey: 'sysSecurity.timeUnitYears',\n value: 'Y'\n }],\n newToken: {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n createdToken: {\n name: '',\n token: ''\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n userPassRules() {\n return {\n authCode: [{\n validator: (rule, value, callback) => {\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error(this.$t('sysSecurity.passwordUrlReserved')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmUploadPassword')));\n } else if (value !== this.authSettings.user.authCode) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n adminPassRules() {\n return {\n confirmNewAdminPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmAdminPassword')));\n } else if (value !== this.authSettings.admin.adminPassword) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n accessRules() {\n const validateSessionMaxAge = (rule, value, callback) => {\n if (!Number.isInteger(value) || value < 1 || value > 3650) {\n callback(new Error(this.$t('sysSecurity.sessionMaxAgeInvalid')));\n } else {\n callback();\n }\n };\n return {\n userSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }],\n adminSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }]\n };\n },\n tokenRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysSecurity.tokenNameRequired'),\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.newToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n editTokenRules() {\n return {\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.editingToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n normalizeIpQuerySettings(settings = {}) {\n const ipQuery = settings.ipQuery || {};\n const customApi = ipQuery.customApi || {};\n const params = Array.isArray(customApi.params) && customApi.params.length > 0 ? customApi.params.map(param => ({\n key: param?.key || '',\n value: param?.value || ''\n })) : [{\n key: 'ip',\n value: '{ip}'\n }];\n const responseFields = Array.isArray(customApi.responseFields) ? customApi.responseFields.map(field => {\n if (typeof field === 'string') return field;\n return field?.path || '';\n }) : [];\n return {\n ...settings,\n moderate: settings.moderate || {},\n ipQuery: {\n enabled: ipQuery.enabled ?? false,\n channel: ipQuery.channel || 'customApi',\n customApi: {\n url: customApi.url || '',\n params,\n responseFields\n }\n }\n };\n },\n addIpQueryParam() {\n this.uploadSettings.ipQuery.customApi.params.push({\n key: '',\n value: ''\n });\n },\n removeIpQueryParam(index) {\n if (this.uploadSettings.ipQuery.customApi.params.length <= 1) return;\n this.uploadSettings.ipQuery.customApi.params.splice(index, 1);\n },\n addIpQueryResponseField() {\n this.uploadSettings.ipQuery.customApi.responseFields.push('');\n },\n removeIpQueryResponseField(index) {\n this.uploadSettings.ipQuery.customApi.responseFields.splice(index, 1);\n },\n moveIpQueryResponseField(index, direction) {\n const fields = this.uploadSettings.ipQuery.customApi.responseFields;\n const targetIndex = index + direction;\n if (targetIndex < 0 || targetIndex >= fields.length) return;\n const [field] = fields.splice(index, 1);\n fields.splice(targetIndex, 0, field);\n },\n handleUserPassInput() {\n if (this.authSettings.user.authCode !== this.oriUserPassword) {\n this.showUserPassConfirm = true;\n } else {\n this.showUserPassConfirm = false;\n }\n },\n handleAdminPassInput() {\n if (this.authSettings.admin.adminPassword !== this.oriAdminPassword) {\n this.showAdminPassConfirm = true;\n } else {\n this.showAdminPassConfirm = false;\n }\n },\n handleClearUserPassword(checked) {\n if (checked) {\n this.authSettings.user.authCode = '';\n this.showUserPassConfirm = false;\n }\n },\n handleClearAdminPassword(checked) {\n if (checked) {\n this.authSettings.admin.adminPassword = '';\n this.authSettings.admin.adminUsername = '';\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': this.$t('sysSecurity.permUpload'),\n 'delete': this.$t('sysSecurity.permDelete'),\n 'list': this.$t('sysSecurity.permList'),\n 'manage': this.$t('sysSecurity.permManage')\n };\n return permissionMap[permission] || permission;\n },\n formatDate(dateString) {\n return new Date(dateString).toLocaleString('zh-CN');\n },\n async loadApiTokens() {\n this.tokenLoading = true;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens');\n const data = await response.json();\n this.apiTokens = data.tokens || [];\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenListFailed'));\n } finally {\n this.tokenLoading = false;\n }\n },\n createToken() {\n this.$refs.tokenForm.validate(async valid => {\n if (!valid) return;\n try {\n this.newToken.owner = 'admin'; // 默认所有Token归属管理员\n\n let expiresAt = null;\n let autoDelete = false;\n if (!this.newToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.newToken.expirationValue, this.newToken.expirationUnit);\n autoDelete = this.newToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n name: this.newToken.name,\n owner: this.newToken.owner,\n permissions: this.newToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.createdToken = {\n name: data.name,\n token: data.token\n };\n this.showCreateTokenDialog = false;\n this.showTokenResultDialog = true;\n this.newToken = {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n };\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenCreateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenCreateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenCreateFailed'));\n }\n });\n },\n editToken(token) {\n const hasExpiration = token.expiresAt !== null && token.expiresAt !== undefined;\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions],\n neverExpire: !hasExpiration,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: token.autoDelete || false\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n let expiresAt = null;\n let autoDelete = false;\n if (!this.editingToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.editingToken.expirationValue, this.editingToken.expirationUnit);\n autoDelete = this.editingToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n tokenId: this.editingToken.id,\n permissions: this.editingToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenUpdateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenUpdateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenUpdateFailed'));\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm(this.$t('sysSecurity.tokenDeleteConfirm'), this.$t('sysSecurity.tokenDeleteConfirmTitle'), {\n confirmButtonText: this.$t('sysSecurity.tokenDeleteConfirmOk'),\n cancelButtonText: this.$t('sysSecurity.tokenDeleteConfirmCancel'),\n type: 'warning'\n });\n const response = await fetchWithAuth(`/api/manage/apiTokens?id=${tokenId}`, {\n method: 'DELETE'\n });\n const data = await response.json();\n if (response.ok) {\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenDeleteSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenDeleteFailed'));\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error(this.$t('sysSecurity.tokenDeleteFailed'));\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success(this.$t('sysSecurity.tokenCopied'));\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.copyFailed'));\n }\n },\n onCreateNeverExpireChange(val) {\n if (val) {\n this.newToken.autoDelete = false;\n }\n },\n onEditNeverExpireChange(val) {\n if (val) {\n this.editingToken.autoDelete = false;\n }\n },\n getTokenStatus(expiresAt) {\n return getTokenStatus(expiresAt);\n },\n saveSettings() {\n // 所有表单的Promise数组\n let validationPromises = [];\n\n // 验证用户密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.userPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证管理密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.adminPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证会话安全策略表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.accessForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n\n // 验证会话有效期为 1-3650 的正整数\n if (this.accessSettings.userSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.userSessionMaxAge) || this.accessSettings.userSessionMaxAge > 3650 || this.accessSettings.adminSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.adminSessionMaxAge) || this.accessSettings.adminSessionMaxAge > 3650) {\n this.$message.error(this.$t('sysSecurity.sessionMaxAgeInvalid'));\n return;\n }\n const settings = {\n auth: this.authSettings,\n upload: this.uploadSettings,\n access: this.accessSettings\n };\n // 不保存确认密码相关字段\n delete settings.auth.user.confirmNewUserPassword;\n delete settings.auth.admin.confirmNewAdminPassword;\n\n // 标记清除密码\n if (this.clearUserPassword) {\n settings.auth.user._clear = true;\n settings.auth.user.authCode = '';\n }\n if (this.clearAdminPassword) {\n settings.auth.admin._clear = true;\n settings.auth.admin.adminPassword = '';\n }\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(res => res.json()).then(data => {\n // 管理端密码变更后,当前会话已被清除,需要重新登录\n if (data.adminPasswordChanged) {\n const msg = this.$t('sysSecurity.adminPasswordChangedRelogin');\n this.$message.warning(msg);\n setTimeout(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n }, 1500);\n return;\n }\n this.$message.success(this.$t('sysSecurity.settingsSaved'));\n // 保存成功后重置密码字段为空(后端已处理)\n this.authSettings.user.authCode = '';\n this.authSettings.admin.adminPassword = '';\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n // 标记已有密码(如果用户刚设置了密码,且不是清除操作)\n if (settings.auth.user.authCode && !settings.auth.user._clear) {\n this.authSettings.user._hasPassword = true;\n } else if (settings.auth.user._clear) {\n this.authSettings.user._hasPassword = false;\n }\n if (settings.auth.admin.adminPassword && !settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = true;\n } else if (settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = false;\n }\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n this.clearUserPassword = false;\n this.clearAdminPassword = false;\n }).catch(() => {\n // 如果请求过程中 session 已失效导致 fetchWithAuth 跳转,忽略后续错误\n });\n });\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/security').then(response => response.json()).then(data => {\n this.authSettings = data.auth;\n this.uploadSettings = this.normalizeIpQuerySettings(data.upload);\n this.accessSettings = data.access;\n\n // 密码从后端返回为空(安全考虑),记录原始空值\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n this.authSettings.user.confirmNewUserPassword = '';\n this.authSettings.admin.confirmNewAdminPassword = '';\n\n // 加载API Token列表\n this.loadApiTokens();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogSecurity.vue?vue&type=template&id=906380e0&scoped=true\"\nimport script from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogSecurity.vue?vue&type=style&index=0&id=906380e0&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-906380e0\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"page-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-title\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedSettings, (categoryGroup, categoryName) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: categoryName,\n class: \"first-settings\"\n }, [_createElementVNode(\"h3\", _hoisted_2, _toDisplayString(categoryName), 1), _createVNode(_component_el_form, {\n model: $data.settings,\n \"label-width\": \"150px\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categoryGroup, (setting, index) => {\n return _openBlock(), _createBlock(_component_el_form_item, {\n key: setting.id\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString($options.localized(setting, 'label')) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: $options.localized(setting, 'tooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [setting.type === 'select' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 0,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder'),\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(setting.options, option => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: option.value,\n label: $options.localizedOption(option),\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'channelName' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: !$options.currentUploadChannel || $options.currentChannelList.length === 0,\n placeholder: _ctx.$t('sysPage.channelSelectPlaceholder'),\n clearable: \"\",\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : setting.type === 'textarea' ? (_openBlock(), _createBlock(_component_el_input, {\n key: 3,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n resize: \"vertical\",\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 4,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"]))]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport axios from '@/utils/axios';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: true,\n // 可用渠道列表\n availableChannels: {}\n };\n },\n computed: {\n isEn() {\n return this.$i18n.locale === 'en';\n },\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = this.isEn ? setting.category_en || setting.category || this.$t('sysPage.otherSettings') : setting.category || this.$t('sysPage.otherSettings');\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n },\n // 当前选择的上传渠道\n currentUploadChannel() {\n const channelSetting = this.settings.config?.find(s => s.id === 'defaultUploadChannel');\n return channelSetting?.value || '';\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.currentUploadChannel] || [];\n }\n },\n watch: {\n // 监听上传渠道变化,清空渠道名称(如果不在新列表中)\n currentUploadChannel(newVal, oldVal) {\n if (newVal !== oldVal) {\n const channelNameSetting = this.settings.config?.find(s => s.id === 'defaultChannelName');\n if (channelNameSetting) {\n const newChannelList = this.availableChannels[newVal] || [];\n if (!newChannelList.some(ch => ch.name === channelNameSetting.value)) {\n channelNameSetting.value = '';\n }\n }\n }\n }\n },\n methods: {\n localized(item, field) {\n if (this.isEn && item[field + '_en']) return item[field + '_en'];\n return item[field] || '';\n },\n localizedOption(option) {\n if (this.isEn && option.label_en) return option.label_en;\n return option.label;\n },\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/page', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success(this.$t('sysPage.settingsSaved')));\n },\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels');\n if (response.data) {\n this.availableChannels = response.data;\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/page').then(response => response.json()).then(data => {\n this.settings = data;\n // 处理布尔类型的值初始化\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n if (setting.type === 'boolean') {\n // 将字符串转换为布尔值\n if (typeof setting.value === 'string') {\n setting.value = setting.value === 'true';\n } else if (setting.value === undefined || setting.value === null) {\n // 如果没有值,使用默认值\n setting.value = setting.default || false;\n }\n }\n });\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogPage.vue?vue&type=template&id=e4c3a742&scoped=true\"\nimport script from \"./SysCogPage.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogPage.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogPage.vue?vue&type=style&index=0&id=e4c3a742&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e4c3a742\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"others-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"first-title\"\n};\nconst _hoisted_5 = {\n class: \"first-title\"\n};\nconst _hoisted_6 = {\n class: \"first-title\"\n};\nconst _hoisted_7 = [\"innerHTML\"];\nconst _hoisted_8 = {\n class: \"first-title\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.remoteTelemetry')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.remoteTelemetryTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.telemetry.enabled,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.settings.telemetry.enabled = $event),\n disabled: $data.settings.telemetry.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.cloudflareApiToken')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.cloudflareApiTokenTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.zoneId')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.accountEmail')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_API_KEY,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.cloudflareApiToken.CF_API_KEY = $event),\n disabled: $data.settings.cloudflareApiToken.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_5, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.randomImageApi')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.randomImageApiTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.directory')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.directoryTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.settings.randomImageAPI.allowedDir = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.publicBrowse')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.publicBrowseTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.publicBrowse,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.openDirectory')), 1), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n },\n innerHTML: _ctx.$t('sysOthers.openDirectoryTooltip')\n }, null, 8, _hoisted_7)]),\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.publicBrowse.allowedDir,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.settings.publicBrowse.allowedDir = $event),\n disabled: $data.settings.publicBrowse.fixed,\n placeholder: \"wallpaper,photos,album\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.webdav')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.webdavTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.webDAV.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.settings.webDAV.enabled = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.username,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.settings.webDAV.username = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.password,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.settings.webDAV.password = $event),\n disabled: $data.settings.webDAV.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUploadChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.uploadChannel,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.settings.webDAV.uploadChannel = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('sysOthers.webdavDefaultChannel'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"Telegram\",\n value: \"telegram\"\n }), _createVNode(_component_el_option, {\n label: \"Cloudflare R2\",\n value: \"cfr2\"\n }), _createVNode(_component_el_option, {\n label: \"S3\",\n value: \"s3\"\n }), _createVNode(_component_el_option, {\n label: \"Discord\",\n value: \"discord\"\n }), _createVNode(_component_el_option, {\n label: \"HuggingFace\",\n value: \"huggingface\"\n }), _createVNode(_component_el_option, {\n label: \"WebDAV\",\n value: \"webdav\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.settings.webDAV.uploadChannel && $options.webdavChannelList.length > 1 ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysOthers.webdavChannelName')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.channelName,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.settings.webDAV.channelName = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.webdavChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n availableChannels: {},\n // 可用渠道列表\n // 加载状态\n loading: true\n };\n },\n computed: {\n // WebDAV 当前渠道类型对应的渠道列表\n webdavChannelList() {\n const channelType = this.settings.webDAV?.uploadChannel;\n return channelType ? this.availableChannels[channelType] || [] : [];\n }\n },\n watch: {\n 'settings.webDAV.uploadChannel'() {\n // 切换渠道类型时清空指定的渠道名称\n if (this.settings.webDAV) {\n this.settings.webDAV.channelName = '';\n }\n }\n },\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/others', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success(this.$t('sysOthers.settingsSaved')));\n },\n async fetchAvailableChannels() {\n try {\n const response = await fetchWithAuth('/api/channels');\n if (response.ok) {\n this.availableChannels = await response.json();\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/others').then(response => response.json()).then(data => {\n this.settings = data;\n }).finally(() => {\n this.loading = false;\n });\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=67b1b002&scoped=true\"\nimport script from \"./SysCogOthers.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogOthers.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogOthers.vue?vue&type=style&index=0&id=67b1b002&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-67b1b002\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/config/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/config/SysCogStatus.vue';\nimport SysCogUpload from '@/components/config/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/config/SysCogSecurity.vue';\nimport SysCogPage from '@/components/config/SysCogPage.vue';\nimport SysCogOthers from '@/components/config/SysCogOthers.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'SystemConfig',\n mixins: [backgroundManager],\n data() {\n return {\n activeIndex: 'status',\n isSidebarCollapse: false\n };\n },\n watch: {\n // 监听锚点变化\n '$route.hash': {\n immediate: true,\n handler(newHash) {\n this.activeIndex = newHash.replace('#', '');\n window.scrollTo(0, 0); // 滚动到页面顶部\n }\n },\n activeIndex(newIndex) {\n // 更新锚点\n const hash = `#${newIndex}`;\n this.$router.push({\n hash\n });\n }\n },\n components: {\n DashboardTabs,\n SysConfigTabs,\n SysCogStatus,\n SysCogUpload,\n SysCogSecurity,\n SysCogPage,\n SysCogOthers\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n // 根据锚点动态返回对应的组件\n currentComponent() {\n const hash = this.$route.hash.replace('#', '');\n switch (hash) {\n case 'status':\n return SysCogStatus;\n case 'upload':\n return SysCogUpload;\n case 'security':\n return SysCogSecurity;\n case 'page':\n return SysCogPage;\n case 'others':\n return SysCogOthers;\n default:\n return SysCogStatus;\n }\n }\n },\n methods: {\n handleLogout() {\n const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n\n // 如果 URL 中没有锚点,则设置默认锚点\n if (!window.location.hash) {\n this.setDefaultHash();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SystemConfig.vue?vue&type=template&id=7607b77d&scoped=true\"\nimport script from \"./SystemConfig.vue?vue&type=script&lang=js\"\nexport * from \"./SystemConfig.vue?vue&type=script&lang=js\"\n\nimport \"./SystemConfig.vue?vue&type=style&index=0&id=7607b77d&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7607b77d\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, mergeProps as _mergeProps, createStaticVNode as _createStaticVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = {\n key: 1,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_3 = {\n key: 2,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", _mergeProps(_ctx.$attrs, {\n class: \"channel-icon-wrapper\"\n }), [$props.type === 'telegram' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, [...(_cache[0] || (_cache[0] = [_createElementVNode(\"path\", {\n d: \"M417.28 795.733333 429.226667 615.253333 756.906667 320C771.413333 306.773333 753.92 300.373333 734.72 311.893333L330.24 567.466667 155.306667 512C117.76 501.333333 117.333333 475.306667 163.84 456.533333L845.226667 193.706667C876.373333 179.626667 906.24 201.386667 894.293333 249.173333L778.24 795.733333C770.133333 834.56 746.666667 843.946667 714.24 826.026667L537.6 695.466667 452.693333 777.813333C442.88 787.626667 434.773333 795.733333 417.28 795.733333Z\"\n }, null, -1)]))])) : $props.type === 'huggingface' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_2, [...(_cache[1] || (_cache[1] = [_createStaticVNode(\"\", 9)]))])) : $props.type === 'webdav' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_3, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"path\", {\n d: \"M446.293333 810.666667C384 898.986667 262.4 921.173333 174.506667 859.733333c-87.466667-61.44-107.946667-183.893333-46.506667-273.066666a195.626667 195.626667 0 0 1 152.746667-84.48l2.133333 61.013333c-38.826667 2.986667-76.373333 23.04-100.693333 58.026667-42.666667 61.44-29.44 144.213333 29.013333 185.6 58.88 40.96 141.226667 25.173333 183.893333-35.84 13.226667-19.2 20.906667-40.106667 23.893334-61.44v-43.093334l238.08-1.706666 2.986666-4.693334c22.613333-39.253333 71.68-52.906667 110.08-30.72a81.066667 81.066667 0 0 1 29.013334 110.933334c-22.613333 38.826667-72.106667 52.48-110.506667 30.293333-17.493333-9.813333-29.866667-25.6-35.413333-43.52l-173.653334 0.853333a211.626667 211.626667 0 0 1-33.28 82.773334m310.613334-304.64c107.946667 13.226667 184.746667 110.08 171.52 216.32-13.226667 106.666667-111.36 182.186667-219.306667 168.96a197.504 197.504 0 0 1-146.346667-94.293334l52.906667-30.72a137.386667 137.386667 0 0 0 98.986667 61.866667c74.666667 8.96 140.8-41.813333 149.76-113.066667 8.96-71.253333-43.946667-136.533333-117.76-145.493333-23.04-2.56-45.226667 0.426667-65.28 7.68l-36.266667 18.773333-110.08-203.52h-9.386667a81.322667 81.322667 0 0 1-78.933333-83.2c1.28-44.373333 39.68-78.933333 84.48-77.226666 44.8 2.56 80.213333 38.826667 78.933333 83.2-0.853333 18.773333-8.106667 35.84-19.626666 49.066666l81.066666 149.76c26.453333-8.533333 55.466667-11.52 85.333334-8.106666M352 389.973333c-42.666667-100.266667 2.56-215.04 101.12-256.853333 98.986667-41.813333 213.333333 5.546667 256 105.813333 25.173333 58.453333 20.053333 122.453333-8.533333 173.653334l-52.906667-30.72c17.92-34.56 20.906667-76.8 3.84-116.48-29.013333-68.266667-106.24-101.12-172.373333-73.386667-66.56 28.16-96.426667 106.666667-67.413334 174.933333 11.946667 28.16 32 49.92 56.32 64.426667l16.64 8.96-130.986666 212.906667c1.28 2.133333 2.986667 4.693333 4.266666 8.106666 20.906667 38.826667 6.4 87.893333-32.853333 108.8-38.826667 20.906667-87.893333 5.546667-109.226667-34.56-20.906667-39.68-6.4-88.746667 32.853334-109.653333 16.64-8.96 34.986667-11.093333 52.48-7.253333l98.56-160.853334c-20.053333-18.346667-37.12-41.386667-47.786667-67.84z\"\n }, null, -1)]))])) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 3,\n icon: $options.fontAwesomeIcon\n }, null, 8, [\"icon\"]))], 16);\n}","export default {\n name: 'ChannelIcon',\n inheritAttrs: false,\n props: {\n type: {\n type: String,\n required: true\n }\n },\n computed: {\n fontAwesomeIcon() {\n const icons = {\n cfr2: ['fab', 'cloudflare'],\n s3: ['fab', 'aws'],\n discord: ['fab', 'discord']\n };\n return icons[this.type] || 'server';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ChannelIcon.vue?vue&type=template&id=33933ada&scoped=true\"\nimport script from \"./ChannelIcon.vue?vue&type=script&lang=js\"\nexport * from \"./ChannelIcon.vue?vue&type=script&lang=js\"\n\nimport \"./ChannelIcon.vue?vue&type=style&index=0&id=33933ada&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-33933ada\"]])\n\nexport default __exports__","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","isCollapse","ref","style","sidebarStyle","menuItems","item","key","index","activeIndex","onClick","$event","handleSelect","icon","$t","titleKey","args","toggleCollapse","name","props","type","String","default","Boolean","data","expandedWidth","computed","collapsedWidth","window","innerWidth","this","width","watch","$nextTick","measureWidth","methods","$emit","checkMobile","isMobile","el","$refs","sidebar","prevWidth","prevTransition","transition","wasCollapsed","classList","contains","remove","offsetWidth","natural","scrollWidth","add","mounted","addEventListener","beforeDestroy","removeEventListener","__exports__","_component_DashboardTabs","_component_el_tooltip","_component_el_header","_component_SysConfigTabs","activeTab","disabled","disableTooltip","content","placement","handleLogout","_","isSidebarCollapse","currentComponent","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","inputStart","inputmode","startDateLabel","onChange","handleManualInput","trim","rangeSeparator","inputEnd","endDateLabel","previousMonthLabel","goToPreviousMonth","monthTitle","nextMonthLabel","goToNextMonth","weekdayLabels","weekday","calendarDays","day","isCurrentMonth","isToday","draftStart","draftEnd","isInRange","selectDay","dayOfMonth","DAY_MS","padDatePart","value","padStart","formatDateKey","date","getFullYear","getMonth","getDate","parseDateKey","match","year","Number","month","Date","setHours","shiftMonth","amount","modelValue","Array","emits","today","displayYear","displayMonth","awaitingEnd","monthStart","start","getDay","todayKey","from","length","getTime","immediate","handler","syncFromModel","startDate","endDate","displayDate","range","commitRange","startKey","endKey","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_component_el_button","_component_el_radio_button","_component_el_radio_group","_component_DateRangeCalendar","_component_el_dialog","_component_Line","_component_Doughnut","_component_el_progress","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","circle","openTrendDateDialog","trendGroupBy","size","label","trendDatePickerVisible","title","trendDateDialogWidth","trendDateRange","handleTrendDateRangeChange","hasTrendData","uploadTrendChartData","options","lineChartOptions","Object","keys","channelStats","channelChartData","chartOptions","count","channel","background","getChartColor","getPercentage","typeStats","typeChartData","aggregatedTypeStats","status","getTypeChartColor","isProcessing","phaseDescription","Math","round","processingProgress","percentage","current","total","estimatedTimeRemaining","message","plain","cancelOperation","processingError","suggestion","recoverable","retryOperation","dismissError","loading","rebuilding","rebuildIndex","backing","backupData","accept","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","openFileInNewTab","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","v","lim","l","h","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","d","e","f","hex","h1","h2","eq","isShort","r","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","i","hueValue","rgb2hsl","calln","isArray","map","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","exec","p1","p2","rotate","deg","hslString","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","names","nameParse","transparent","toLowerCase","RGB_RE","rgbParse","rgbString","to","pow","interpolate","rgb1","rgb2","t","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","constructor","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","prototype","toString","call","slice","isObject","isNumberFinite","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","callback","fn","thisArg","apply","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","target","create","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","o","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","has","_isClickEvent","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","roundedRange","niceRange","floor","fraction","niceFraction","_factorize","result","sqrt","sort","pop","isNonPrimitive","Symbol","toPrimitive","isNumber","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","end","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","defineProperty","configurable","enumerable","forEach","method","base","res","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","check","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","findIndex","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","duration","easing","describe","_fallback","_indexable","_scriptable","properties","active","animation","resize","show","animations","visible","hide","applyLayoutsDefaults","autoPadding","padding","top","bottom","intlCache","Map","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","get","Intl","NumberFormat","formatNumber","num","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","applyScaleDefaults","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","border","dash","dashOffset","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","override","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","writable","local","appliers","toFontString","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","setRenderOpts","opts","translation","fillStyle","textAlign","textBaseline","decorateText","line","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","lines","strokeWidth","strokeColor","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","numberOrZero","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","change","keepZero","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","getValue","Error","join","delete","createSubResolver","arr","filter","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","prev","tension","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","shadowRoot","getCanvasPosition","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition","event","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","maintainHeight","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","segment","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","getSizeForArea","chartArea","field","getDatasetArea","getDatasetClipArea","_clip","Animator","_request","_charts","_running","_lastDate","_notify","anims","callbacks","numSteps","initial","currentStep","_refresh","_update","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","reduce","acc","_duration","cancel","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","update","elapsed","wait","promises","Promise","rej","resolved","Animations","config","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","itemStacks","_top","_bottom","visualValues","_visualValues","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","hidden","_stacked","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","getAllScaleValues","$bar","visibleMetas","concat","computeMinSampleSize","curr","_length","updateMinAndPrev","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v2","setInflateAmount","inflateAmount","_defineProperty","BarController","super","bars","getBasePixel","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","currentParsed","iScaleValue","skipNull","find","_getStackCount","_getAxisCount","_getAxis","getFirstScaleIdForIndexAxis","indexScaleId","firstScaleAxisId","_getStackIndex","_startPixel","_endPixel","baseValue","minBarLength","floating","getDataVisibility","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","axisCount","axisID","axisNumber","stackIndex","rects","_index_","_value_","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","useBorderRadius","borderRadius","fontColor","lineDash","lineDashOffset","lineJoin","legendItem","toggleDataVisibility","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PolarAreaController","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","init","formats","diff","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","getSortedVisibleDatasetMetas","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","isPointInArea","evaluationFunc","inRange","getNearestRadialItems","getProps","getNearestCartesianItems","distanceMetric","minDistance","getCenterPoint","pointInArea","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","native","nodeListContains","nodeList","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","tz","gz","bz","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","defaultRoutes","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","localIds","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","ensureScalesHaveIDs","scalesOptions","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","_getActiveElements","clipSelf","outerAngleClip","innerAngleClip","clipWidth","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","inner","selfJoin","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","refRect","BarElement","addRectPath","tpoints","_findSegmentEnd","_getBounds","targetSegments","tgt","subBounds","fillSources","fillSource","_getEdge","_pointsFromSegments","boundary","linePoints","_createBoundaryLine","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","parseFillOption","decodeTargetIndex","firstCh","_getTargetPixel","_getTargetValue","fillOption","_buildStackLine","sourcePoints","linesBelow","getLinesBelow","addPointsBelow","below","unshift","sourcePoint","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","computeBoundary","computeCircularBoundary","computeLinearBoundary","_drawfill","lineOpts","above","doFill","fillColor","clipVertical","clipHorizontal","clipY","lineLoop","clipX","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","_args","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","drawLegendBox","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","_element","afterEvent","ci","WeakMap","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","beforeTitle","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","addIfString","addedLabels","findOrAddLabel","lastIndexOf","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","hLimits","vLimits","updateLimits","setCenterPoint","_pointLabelItems","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","apexesInArea","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","animate","INTERVALS","millisecond","common","second","minute","hour","week","quarter","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","offsetAfterAutoskip","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","CommonProps","required","datasetIdKey","updateMode","A11yProps","ariaLabel","ariaDescribedby","Props","destroyDelay","compatProps","internals","attrs","toRawIfProxy","isProxy","toRaw","cloneProxy","setOptions","nextOptions","setLabels","currentData","nextLabels","setDatasets","nextDatasets","addedDatasets","nextDataset","currentDataset","cloneData","nextData","defineComponent","setup","param","expose","slots","canvasRef","chartRef","shallowRef","renderChart","clonedData","proxiedData","Chart$1","destroyChart","onMounted","onUnmounted","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","Line","BatchOperationError","code","ERROR_HANDLERS","details","NETWORK","ABORT","createError","Response","TypeError","BatchProcessor","batchSize","abortController","fetchAllRecords","includeValue","AbortController","allRecords","totalFetched","batchCount","signal","aborted","response","fetchBatch","records","nextCursor","phase","batchError","URLSearchParams","fetchWithAuth","errorDetails","errorData","json","success","totalProcessed","abort","isAborted","IndexRebuilder","chunkSize","maxRetries","retryDelay","sessionId","generateSessionId","fetchConfig","databaseType","rebuild","processor","sortByTimestampDescending","chunks","splitIntoChunks","uploadChunkWithRetry","finalize","timestampA","timestampB","chunkId","lastError","attempt","uploadChunk","sleep","checksum","calculateChecksum","headers","createHttpError","totalChunks","random","encoder","TextEncoder","dataBuffer","encode","crypto","subtle","hashBuffer","digest","hashArray","Uint8Array","imul","ms","BackupGenerator","generateBackup","packageInfo","fileCount","files","settings","record","fetchSettings","downloadBackup","settingsCount","blob","Blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","RestoreProcessor","fileEntries","settingEntries","totalSettings","totalItems","restoredFiles","restoredSettings","failedFiles","failedSettings","fileChunks","chunkData","fromEntries","restoredCount","failedCount","settingChunks","backupTimestamp","formatDateInput","getDefaultTrendDateRange","components","DateRangeCalendar","newest","oldest","channelColors","typeColors","trendColors","processingPhase","processingStartTime","currentRebuilder","currentBackupGenerator","currentRestoreProcessor","stats","aggregatedStats","mappedStatus","currentTrendGroup","trend","uploadTrend","groupBy","series","trendRawLabels","trendRangeCrossesYear","years","extractTrendLabelDates","trendDisplayLabels","formatTrendAxisLabel","totalColor","hexToRgba","pointBackgroundColor","pointBorderColor","pointRadius","pointHoverRadius","getTrendColor","formatTrendSeriesName","toFixed","totalEstimated","seconds","minutes","hours","remainingMinutes","phaseMap","isOther","dates","formatSingleDate","includeYear","monthDay","endLabel","getTrendDateRangeParams","action","timezoneOffset","getTimezoneOffset","trendMaxPoints","trendSeriesLimit","trendStartDate","trendEndDate","$message","warning","handleProgress","handleError","errorMessage","settingsMsg","fileInput","file","$confirm","confirmButtonText","cancelButtonText","restoreData","fileContent","parseError","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","_component_ChannelIcon","isOpen","toggleDropdown","displayLabel","selectOption","$slots","channelType","iconClass","ChannelIcon","placeholder","resolvedPlaceholder","selected","opt","handleClickOutside","beforeUnmount","$el","_component_CustomSelect","_component_el_tag","_component_el_switch","_component_el_option","_component_el_select","_component_el_form_item","_component_el_input","_component_el_input_number","_component_el_form","_component_el_descriptions_item","_component_el_descriptions","channelFilter","filterOptions","showAddDialog","filteredChannels","getChannelIconClass","getChannelList","hasLoadBalance","getSettings","loadBalance","saveSettings","fixed","onMousemove","handleCardMouseMove","onMouseleave","handleCardMouseLeave","ref_for","maskText","botToken","chatId","publicUrl","bucketName","endpoint","channelId","isNitro","repo","isPrivate","baseUrl","quota","getQuotaPercentage","getQuotaStatus","getQuotaText","openDetailDialog","openEditDialog","deleteChannel","onClosed","resetAddForm","newChannel","confirmAddChannel","model","rules","addRules","onChannelTypeChange","addableChannels","ch","innerHTML","proxyUrl","cdnDomain","region","accessKeyId","secretAccessKey","pathStyle","limitGB","threshold","token","username","password","headersText","autosize","minRows","createDirectory","showDetailDialog","currentChannel","resetDetailData","openEditFromDetail","column","getChannelTypeLabel","currentChannelType","readonly","formatHeaders","link","refreshQuota","quotaLoading","isQuotaExceeded","getQuotaStatusText","showEditDialog","editChannel","resetEditData","confirmEditChannel","editRules","onQuotaEnabledChange","CustomSelect","channels","telegramSettings","cfr2Settings","s3Settings","discordSettings","huggingfaceSettings","webdavSettings","currentChannelIndex","quotaStats","pattern","card","currentTarget","refKey","glowEl","telegram","cfr2","s3","discord","huggingface","webdav","showLength","headersToText","parseHeadersText","addForm","validate","reservedNames","isDuplicate","newChannelData","savePath","editForm","currentIndex","originalName","editedChannel","catch","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","finally","handleClick","spin","_component_el_checkbox","_component_el_table_column","_component_el_table","_component_FloatingSaveButton","_component_el_checkbox_group","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","autocomplete","_hasPassword","clearUserPassword","handleClearUserPassword","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","clearAdminPassword","adminPassword","handleAdminPassInput","handleClearAdminPassword","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","getTokenStatus","expiresAt","expiresText","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","ipQuery","customApi","removeIpQueryParam","addIpQueryParam","responseFields","moveIpQueryResponseField","removeIpQueryResponseField","addIpQueryResponseField","accessSettings","allowedDomains","accessRules","whiteListMode","sessionSecure","userSessionMaxAge","adminSessionMaxAge","dialogWidth","createToken","newToken","tokenRules","neverExpire","onCreateNeverExpireChange","expirationValue","expirationUnit","timeUnitOptions","labelKey","autoDelete","showEditTokenDialog","updateToken","editingToken","editTokenRules","onEditNeverExpireChange","showTokenResultDialog","createdToken","append","copyToken","SIMPLE_UNIT_MS","computeExpiresAt","baseTime","setUTCMonth","getUTCMonth","setUTCFullYear","getUTCFullYear","formatExpiresTime","isoString","getHours","getMinutes","getSeconds","expiresDate","currentTime","formattedTime","FloatingSaveButton","oriUserPassword","oriAdminPassword","owner","validator","rule","urlReservedChars","hasReservedChar","char","validateSessionMaxAge","isInteger","normalizeIpQuerySettings","fields","targetIndex","checked","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","hasExpiration","editTokenForm","tokenId","navigator","clipboard","writeText","validationPromises","userPassForm","adminPassForm","accessForm","results","isValid","every","auth","upload","access","_clear","adminPasswordChanged","msg","$store","commit","$router","groupedSettings","categoryGroup","categoryName","setting","localized","localizedOption","currentUploadChannel","currentChannelList","clearable","availableChannels","isEn","$i18n","category","category_en","channelSetting","newVal","oldVal","channelNameSetting","newChannelList","label_en","fetchAvailableChannels","axios","telemetry","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","randomImageAPI","allowedDir","publicBrowse","webDAV","uploadChannel","webdavChannelList","channelName","mixins","backgroundManager","newHash","scrollTo","newIndex","hash","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","fetch","credentials","authType","setDefaultHash","defaultHash","location","initializeBackground","viewBox","xmlns","$attrs","fontAwesomeIcon","inheritAttrs","icons","_typeof","iterator","toPropertyKey"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/529.e05f38bd.js.map.gz b/frontend-dist/js/529.287c329f.js.map.gz similarity index 99% rename from frontend-dist/js/529.e05f38bd.js.map.gz rename to frontend-dist/js/529.287c329f.js.map.gz index ebd9ab8a887cfe83a0389d1db559fadd7e44848a..292583e41ca28b7eb1422fe1e05e833f946e57e1 100644 GIT binary patch delta 45 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.dialogVisible=e),title:a.isBatchMove?e.$t("moveFile.batchTitle"):e.$t("moveFile.title"),width:"500px","show-close":!0,class:"move-dialog",onClose:A.handleClose},{footer:(0,c.k6)(()=>[(0,c.Lk)("span",g,[(0,c.bF)(z,{onClick:A.handleClose},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.cancel")),1)]),_:1},8,["onClick"]),(0,c.bF)(z,{type:"primary",loading:E.loading,onClick:A.handleConfirm},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.confirm")),1)]),_:1},8,["loading","onClick"])])]),default:(0,c.k6)(()=>[(0,c.Lk)("div",f,[(0,c.Lk)("div",m,[(0,c.bF)(I,{modelValue:E.targetPath,"onUpdate:modelValue":t[0]||(t[0]=e=>E.targetPath=e),placeholder:e.$t("moveFile.targetPlaceholder"),class:"move-path-input"},{prepend:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.targetDirectory")),1)]),_:1},8,["modelValue","placeholder"]),(0,c.bF)(B,{"current-directory":a.currentDirectory,source:"admin",onSelect:A.handleDirectorySelect},{trigger:(0,c.k6)(()=>[(0,c.bF)(z,{class:"directory-picker-trigger"},{default:(0,c.k6)(()=>[(0,c.bF)(U,{icon:"folder-tree"})]),_:1})]),_:1},8,["current-directory","onSelect"])]),(0,c.Lk)("p",p,(0,h.v_)(e.$t("moveFile.hint")),1)])]),_:1},8,["modelValue","title","onClose"])):((0,c.uX)(),(0,c.Wv)(R,{key:1,modelValue:A.dialogVisible,"onUpdate:modelValue":t[5]||(t[5]=e=>A.dialogVisible=e),title:a.isBatchMove?e.$t("moveFile.batchTitle"):e.$t("moveFile.title"),direction:"btt",size:"auto","show-close":!0,class:"move-drawer",onClose:A.handleClose},{footer:(0,c.k6)(()=>[(0,c.Lk)("div",x,[(0,c.bF)(z,{onClick:A.handleClose,class:"footer-btn"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.cancel")),1)]),_:1},8,["onClick"]),(0,c.bF)(z,{type:"primary",loading:E.loading,onClick:A.handleConfirm,class:"footer-btn"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.confirm")),1)]),_:1},8,["loading","onClick"])])]),default:(0,c.k6)(()=>[(0,c.Lk)("div",b,[(0,c.Lk)("div",v,[(0,c.Lk)("div",k,(0,h.v_)(e.$t("moveFile.targetDirectory")),1),(0,c.Lk)("div",y,[(0,c.bF)(I,{modelValue:E.targetPath,"onUpdate:modelValue":t[2]||(t[2]=e=>E.targetPath=e),placeholder:e.$t("moveFile.targetPlaceholder"),class:"move-path-input"},null,8,["modelValue","placeholder"]),(0,c.bF)(z,{class:"directory-picker-trigger",onClick:t[3]||(t[3]=e=>E.showTreePicker=!0)},{default:(0,c.k6)(()=>[(0,c.bF)(U,{icon:"folder-tree"})]),_:1})]),(0,c.Lk)("p",_,(0,h.v_)(e.$t("moveFile.hintMobile")),1)]),E.showTreePicker?((0,c.uX)(),(0,c.CE)("div",w,[(0,c.Lk)("div",F,[(0,c.Lk)("span",C,(0,h.v_)(e.$t("moveFile.selectDirectory")),1),(0,c.bF)(z,{text:"",onClick:t[4]||(t[4]=e=>E.showTreePicker=!1)},{default:(0,c.k6)(()=>[(0,c.bF)(U,{icon:"times"})]),_:1})]),(0,c.bo)(((0,c.uX)(),(0,c.CE)("div",T,[E.treeError?((0,c.uX)(),(0,c.CE)("div",$,[(0,c.bF)(U,{icon:"exclamation-circle",class:"error-icon"}),(0,c.Lk)("span",L,(0,h.v_)(E.treeError),1),(0,c.bF)(z,{type:"primary",size:"small",onClick:A.fetchDirectoryTree},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.retry")),1)]),_:1},8,["onClick"])])):((0,c.uX)(),(0,c.Wv)(P,{key:1,ref:"treeRef",data:E.treeData,props:E.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":a.currentDirectory,class:"directory-tree",onNodeClick:A.handleTreeNodeClick},{default:(0,c.k6)(({node:e,data:t})=>[(0,c.Lk)("span",{class:(0,h.C4)(["tree-node",{"is-current":t.path===a.currentDirectory}])},[(0,c.bF)(U,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,c.Lk)("span",S,(0,h.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[O,E.treeLoading]])])):(0,c.Q3)("",!0)])]),_:1},8,["modelValue","title","onClose"]))])}var E=a(70797),A={name:"MoveFileDialog",components:{DirectoryTreePicker:o.A},props:{modelValue:{type:Boolean,default:!1},currentDirectory:{type:String,default:""},isBatchMove:{type:Boolean,default:!1},initialPath:{type:String,default:"/"}},emits:["update:modelValue","confirm","close"],data(){return{targetPath:"/",loading:!1,windowWidth:window.innerWidth,showTreePicker:!1,treeData:[],treeLoading:!1,treeError:"",treeProps:{children:"children",label:"name"}}},computed:{dialogVisible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},isDesktop(){return this.windowWidth>768}},watch:{modelValue(e){e&&(this.targetPath=this.initialPath||"/",this.showTreePicker=!1)},showTreePicker(e){e&&!this.isDesktop&&this.fetchDirectoryTree()}},mounted(){window.addEventListener("resize",this.handleResize)},beforeUnmount(){window.removeEventListener("resize",this.handleResize)},methods:{handleResize(){this.windowWidth=window.innerWidth},handleDirectorySelect(e){this.targetPath=e},handleConfirm(){this.$emit("confirm",this.targetPath)},handleClose(){this.$emit("update:modelValue",!1),this.$emit("close")},async fetchDirectoryTree(){this.treeLoading=!0,this.treeError="";try{const e=await(0,E.A)("/api/directoryTree",{method:"GET"});if(!e.ok)return void(401===e.status?this.treeError=this.$t("moveFile.authFailed"):this.treeError=this.$t("moveFile.serverError"));const t=await e.json();t.tree?this.treeData=[t.tree]:this.treeData=[]}catch(e){console.error("Failed to fetch directory tree:",e),this.treeError=this.$t("moveFile.loadTreeFailed")}finally{this.treeLoading=!1}},handleTreeNodeClick(e){let t=e.path;t&&!t.startsWith("/")?t="/"+t:t||(t="/"),this.targetPath=t,this.showTreePicker=!1}}},I=a(71241);const U=(0,I.A)(A,[["render",D],["__scopeId","data-v-7aaa437c"]]);var z=U,B=a(45130);const W={class:"mobile-drawer-header"},P={class:"mobile-drawer-title"},R={class:"mobile-drawer-content"},O=["onClick"];function N(e,t,a,i,n,s){const r=(0,c.g2)("font-awesome-icon");return(0,c.uX)(),(0,c.Wv)(c.Im,{to:"body"},[(0,c.bF)(B.eB,{name:"drawer-slide"},{default:(0,c.k6)(()=>[a.modelValue?((0,c.uX)(),(0,c.CE)("div",{key:0,class:"mobile-drawer-overlay",onClick:t[3]||(t[3]=(...e)=>s.close&&s.close(...e))},[(0,c.Lk)("div",{class:"mobile-drawer",onClick:t[2]||(t[2]=(0,B.D$)(()=>{},["stop"]))},[(0,c.Lk)("div",W,[(0,c.Lk)("span",P,(0,h.v_)(e.$t("mobileDirectory.title")),1),(0,c.bF)(r,{icon:"times",class:"mobile-drawer-close",onClick:s.close},null,8,["onClick"])]),(0,c.Lk)("div",R,[(0,c.Lk)("div",{class:(0,h.C4)(["mobile-drawer-item",{active:!a.currentPath}]),onClick:t[0]||(t[0]=e=>s.navigate(""))},[(0,c.bF)(r,{icon:"home",class:"mobile-drawer-item-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileDirectory.rootDirectory")),1)],2),((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.pathParts,(e,t)=>((0,c.uX)(),(0,c.CE)("div",{key:t,class:(0,h.C4)(["mobile-drawer-item",{active:t===s.pathParts.length-1}]),style:(0,h.Tr)({paddingLeft:16*(t+1)+16+"px"}),onClick:e=>s.navigate(s.pathParts.slice(0,t+1).join("/"))},[(0,c.bF)(r,{icon:"folder",class:"mobile-drawer-item-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e),1)],14,O))),128)),a.currentPath?((0,c.uX)(),(0,c.CE)("div",{key:0,class:"mobile-drawer-back",onClick:t[1]||(t[1]=(...e)=>s.goBack&&s.goBack(...e))},[(0,c.bF)(r,{icon:"arrow-left",class:"mobile-drawer-item-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileDirectory.goBack")),1)])):(0,c.Q3)("",!0)])])])):(0,c.Q3)("",!0)]),_:1})])}a(18111),a(22489);var M={name:"MobileDirectoryDrawer",props:{modelValue:{type:Boolean,default:!1},currentPath:{type:String,default:""}},emits:["update:modelValue","navigate","goBack"],computed:{pathParts(){return this.currentPath.split("/").filter(Boolean)}},methods:{close(){this.$emit("update:modelValue",!1)},navigate(e){this.$emit("navigate",e),this.close()},goBack(){this.$emit("goBack"),this.close()}}};const V=(0,I.A)(M,[["render",N],["__scopeId","data-v-768efd1f"]]);var X=V;const j={class:"bottom-sheet-header"},K={class:"bottom-sheet-title"},Z={class:"bottom-sheet-content"};function G(e,t,a,i,n,s){const r=(0,c.g2)("font-awesome-icon");return(0,c.uX)(),(0,c.Wv)(c.Im,{to:"body"},[(0,c.bF)(B.eB,{name:"bottom-sheet"},{default:(0,c.k6)(()=>[a.modelValue?((0,c.uX)(),(0,c.CE)("div",{key:0,class:"bottom-sheet-overlay",onClick:t[9]||(t[9]=(...e)=>s.close&&s.close(...e))},[(0,c.Lk)("div",{class:"bottom-sheet",onClick:t[8]||(t[8]=(0,B.D$)(()=>{},["stop"]))},[(0,c.Lk)("div",j,[t[10]||(t[10]=(0,c.Lk)("div",{class:"bottom-sheet-handle"},null,-1)),(0,c.Lk)("span",K,(0,h.v_)(a.title),1)]),(0,c.Lk)("div",Z,[a.isFolder?((0,c.uX)(),(0,c.CE)(c.FK,{key:1},[(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[5]||(t[5]=e=>s.handleAction("folderCopy"))},[(0,c.bF)(r,{icon:"copy",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.copyLink")),1)]),(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[6]||(t[6]=e=>s.handleAction("move"))},[(0,c.bF)(r,{icon:"file-export",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.moveFolder")),1)])],64)):((0,c.uX)(),(0,c.CE)(c.FK,{key:0},[(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[0]||(t[0]=e=>s.handleAction("detail"))},[(0,c.bF)(r,{icon:"info-circle",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.viewDetail")),1)]),(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[1]||(t[1]=e=>s.handleAction("copy"))},[(0,c.bF)(r,{icon:"copy",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.copyLink")),1)]),(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[2]||(t[2]=e=>s.handleAction("download"))},[(0,c.bF)(r,{icon:"download",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.downloadFile")),1)]),(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[3]||(t[3]=e=>s.handleAction("move"))},[(0,c.bF)(r,{icon:"file-export",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.moveFile")),1)]),(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[4]||(t[4]=e=>s.handleAction("tag"))},[(0,c.bF)(r,{icon:"tags",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.tagManagement")),1)])],64)),(0,c.Lk)("div",{class:"bottom-sheet-item bottom-sheet-danger",onClick:t[7]||(t[7]=e=>s.handleAction("delete"))},[(0,c.bF)(r,{icon:"trash-alt",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(a.isFolder?e.$t("mobileAction.deleteFolder"):e.$t("mobileAction.deleteFile")),1)])])])])):(0,c.Q3)("",!0)]),_:1})])}var H={name:"MobileActionSheet",props:{modelValue:{type:Boolean,default:!1},title:{type:String,default:""},isFolder:{type:Boolean,default:!1}},emits:["update:modelValue","action"],methods:{close(){this.$emit("update:modelValue",!1)},handleAction(e){this.$emit("action",e),this.close()}}};const q=(0,I.A)(H,[["render",G],["__scopeId","data-v-62bb601c"]]);var Q=q,Y=a(4275),J=a(89559),ee=a(12687);a(18785);const te={class:"batch-tag-container"},ae={class:"tab-content"},ie={class:"tab-description"},ne={class:"input-section"},se={key:0,class:"suggestions-panel"},re=["onClick"],oe={class:"tags-to-add-section"},le={key:0,class:"tags-container"},de={key:1,class:"empty-message"},ce={class:"action-buttons"},he={class:"tab-content"},ue={class:"tab-description"},fe={key:0,class:"common-tags-section"},me={class:"tags-container"},pe={key:1,class:"empty-message"},ge={class:"tab-content"},be={class:"tab-description"},ve={class:"action-buttons"};function ke(e,t,a,i,n,s){const o=(0,c.g2)("font-awesome-icon"),u=l.S2,f=d.WK,m=ee.u,p=Y.v$,g=J.KR,b=Y.q,v=r.kZ;return(0,c.uX)(),(0,c.Wv)(v,{title:e.$t("batchTag.title"),modelValue:s.visible,"onUpdate:modelValue":t[2]||(t[2]=e=>s.visible=e),width:s.dialogWidth,onClose:s.handleClose},{default:(0,c.k6)(()=>[(0,c.Lk)("div",te,[(0,c.bF)(b,{modelValue:n.activeTab,"onUpdate:modelValue":t[1]||(t[1]=e=>n.activeTab=e),type:"border-card"},{default:(0,c.k6)(()=>[(0,c.bF)(p,{label:e.$t("batchTag.addTab"),name:"add"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",ae,[(0,c.Lk)("p",ie,(0,h.v_)(e.$t("batchTag.addDescription",{count:s.fileCount})),1),(0,c.Lk)("div",ne,[(0,c.bF)(f,{modelValue:n.inputTag,"onUpdate:modelValue":t[0]||(t[0]=e=>n.inputTag=e),placeholder:e.$t("batchTag.inputPlaceholder"),onKeyup:(0,B.jR)(s.handleAddInputTag,["enter"]),onInput:s.handleInputChange,clearable:""},{append:(0,c.k6)(()=>[(0,c.bF)(u,{onClick:s.handleAddInputTag,type:"primary"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"plus"})]),_:1},8,["onClick"])]),_:1},8,["modelValue","placeholder","onKeyup","onInput"]),n.showSuggestions&&n.suggestions.length>0?((0,c.uX)(),(0,c.CE)("div",se,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.suggestions,e=>((0,c.uX)(),(0,c.CE)("div",{key:e,class:"suggestion-item",onClick:t=>s.selectSuggestion(e)},(0,h.v_)(e),9,re))),128))])):(0,c.Q3)("",!0)]),(0,c.Lk)("div",oe,[(0,c.Lk)("h4",null,(0,h.v_)(e.$t("batchTag.pendingTags")),1),n.tagsToAdd.length>0?((0,c.uX)(),(0,c.CE)("div",le,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.tagsToAdd,e=>((0,c.uX)(),(0,c.Wv)(m,{key:e,closable:"",onClose:t=>s.removeFromToAdd(e),class:"tag-item"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1032,["onClose"]))),128))])):((0,c.uX)(),(0,c.CE)("div",de,(0,h.v_)(e.$t("batchTag.noPendingTags")),1))]),(0,c.Lk)("div",ce,[(0,c.bF)(u,{type:"primary",onClick:s.executeAddTags,loading:n.loading,disabled:0===n.tagsToAdd.length},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("batchTag.addToAllFiles")),1)]),_:1},8,["onClick","loading","disabled"])])])]),_:1},8,["label"]),(0,c.bF)(p,{label:e.$t("batchTag.removeTab"),name:"remove"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",he,[(0,c.Lk)("p",ue,(0,h.v_)(e.$t("batchTag.removeDescription")),1),n.commonTags.length>0?((0,c.uX)(),(0,c.CE)("div",fe,[(0,c.Lk)("h4",null,(0,h.v_)(e.$t("batchTag.commonTags")),1),(0,c.Lk)("div",me,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.commonTags,e=>((0,c.uX)(),(0,c.Wv)(m,{key:e,closable:"",onClose:t=>s.handleRemoveCommonTag(e),class:"tag-item",type:"warning"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1032,["onClose"]))),128))])])):((0,c.uX)(),(0,c.CE)("div",pe,(0,h.v_)(e.$t("batchTag.noCommonTags")),1))])]),_:1},8,["label"]),(0,c.bF)(p,{label:e.$t("batchTag.clearTab"),name:"clear"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",ge,[(0,c.Lk)("p",be,(0,h.v_)(e.$t("batchTag.clearDescription",{count:s.fileCount})),1),(0,c.bF)(g,{title:e.$t("batchTag.clearWarningTitle"),type:"warning",description:e.$t("batchTag.clearWarningDesc"),closable:!1,style:{"margin-bottom":"20px"},center:""},null,8,["title","description"]),(0,c.Lk)("div",ve,[(0,c.bF)(u,{type:"danger",onClick:s.handleClearAllTags,loading:n.loading},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("batchTag.confirmClearAll")),1)]),_:1},8,["onClick","loading"])])])]),_:1},8,["label"])]),_:1},8,["modelValue"])])]),_:1},8,["title","modelValue","width","onClose"])}a(44114),a(61701),a(33110);var ye=a(51219),_e=a(12933),we={name:"BatchTagDialog",props:{modelValue:{type:Boolean,default:!1},selectedFiles:{type:Array,required:!0,default:()=>[]}},emits:["update:modelValue","tagsUpdated"],data(){return{activeTab:"add",inputTag:"",tagsToAdd:[],commonTags:[],suggestions:[],showSuggestions:!1,loading:!1,debounceTimer:null}},computed:{visible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},dialogWidth(){return window.innerWidth<768?"90%":"600px"},selectedFilesOnly(){return this.selectedFiles.filter(e=>!e.isFolder)},fileCount(){return this.selectedFilesOnly.length},fileIds(){return this.selectedFilesOnly.map(e=>e.name)}},watch:{visible(e){e?this.loadCommonTags():this.resetData()},activeTab(e){"remove"===e&&this.loadCommonTags()}},methods:{resetData(){this.tagsToAdd=[],this.inputTag="",this.showSuggestions=!1,this.activeTab="add"},async loadCommonTags(){if(0!==this.selectedFilesOnly.length)try{const e=this.selectedFilesOnly.map(e=>(0,E.A)(`/api/manage/tags/${encodeURIComponent(e.name)}`,{method:"GET"})),t=await Promise.all(e),a=[];for(const i of t)if(i.ok){const e=await i.json();a.push(e.tags||[])}a.length>0?this.commonTags=a[0].filter(e=>a.every(t=>t.includes(e))):this.commonTags=[]}catch(e){console.error("Error loading common tags:",e),ye.nk.error(this.$t("batchTag.loadCommonTagsFailed"))}else this.commonTags=[]},handleInputChange(){clearTimeout(this.debounceTimer),this.inputTag&&0!==this.inputTag.trim().length?this.debounceTimer=setTimeout(()=>{this.fetchSuggestions()},300):this.showSuggestions=!1},async fetchSuggestions(){try{const e=this.inputTag.trim().toLowerCase(),t=await(0,E.A)(`/api/manage/tags/autocomplete?prefix=${encodeURIComponent(e)}&limit=10`,{method:"GET"});if(t.ok){const e=await t.json();this.suggestions=(e.tags||[]).filter(e=>!this.tagsToAdd.includes(e)),this.showSuggestions=this.suggestions.length>0}}catch(e){console.error("Error fetching suggestions:",e)}},selectSuggestion(e){this.inputTag=e,this.showSuggestions=!1,this.handleAddInputTag()},handleAddInputTag(){const e=this.inputTag.trim();if(e){if(this.tagsToAdd.includes(e))return ye.nk.warning(this.$t("batchTag.tagAlreadyInList")),this.inputTag="",void(this.showSuggestions=!1);this.tagsToAdd.push(e),this.inputTag="",this.showSuggestions=!1}},removeFromToAdd(e){const t=this.tagsToAdd.indexOf(e);t>-1&&this.tagsToAdd.splice(t,1)},async executeAddTags(){if(0!==this.tagsToAdd.length){this.loading=!0;try{const e=await(0,E.A)("/api/manage/tags/batch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({fileIds:this.fileIds,action:"add",tags:this.tagsToAdd})});if(!e.ok)throw new Error(this.$t("batchTag.addFailed"));{const t=await e.json();if(!(t.success||t.updated>0))throw new Error(this.$t("batchTag.addFailed"));ye.nk.success(this.$t("batchTag.addSuccess",{count:t.updated})),this.$emit("tagsUpdated"),this.tagsToAdd=[]}}catch(e){console.error("Error adding tags:",e),ye.nk.error(this.$t("batchTag.addFailed"))}finally{this.loading=!1}}else ye.nk.warning(this.$t("batchTag.pleaseAddTags"))},async handleRemoveCommonTag(e){this.loading=!0;try{const t=await(0,E.A)("/api/manage/tags/batch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({fileIds:this.fileIds,action:"remove",tags:[e]})});if(!t.ok)throw new Error(this.$t("batchTag.removeFailed"));{const e=await t.json();if(!(e.success||e.updated>0))throw new Error(this.$t("batchTag.removeFailed"));ye.nk.success(this.$t("batchTag.removeSuccess",{count:e.updated})),this.$emit("tagsUpdated"),await this.loadCommonTags()}}catch(t){console.error("Error removing tag:",t),ye.nk.error(this.$t("batchTag.removeFailed"))}finally{this.loading=!1}},handleClearAllTags(){_e.s.confirm(this.$t("batchTag.clearConfirmMessage",{count:this.fileCount}),this.$t("batchTag.clearConfirmTitle"),{confirmButtonText:this.$t("batchTag.clearConfirmOk"),cancelButtonText:this.$t("batchTag.clearConfirmCancel"),type:"warning"}).then(()=>{this.executeClearTags()}).catch(()=>{ye.nk.info(this.$t("batchTag.clearCancelled"))})},async executeClearTags(){this.loading=!0;try{const e=await(0,E.A)("/api/manage/tags/batch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({fileIds:this.fileIds,action:"set",tags:[]})});if(!e.ok)throw new Error(this.$t("batchTag.clearFailed"));{const t=await e.json();if(!(t.success||t.updated>0))throw new Error(this.$t("batchTag.clearFailed"));ye.nk.success(this.$t("batchTag.clearSuccess",{count:t.updated})),this.$emit("tagsUpdated"),this.commonTags=[]}}catch(e){console.error("Error clearing tags:",e),ye.nk.error(this.$t("batchTag.clearFailed"))}finally{this.loading=!1}},handleClose(){this.visible=!1}}};const Fe=(0,I.A)(we,[["render",ke],["__scopeId","data-v-ec3adcfc"]]);var Ce=Fe,Te=a(813);a(34896);const $e={class:"tag-management-container"},Le={class:"input-section"},Se={key:0,class:"suggestions-panel"},xe=["onClick"],De={class:"current-tags-section"},Ee={key:0,class:"tags-container"},Ae={key:1,class:"empty-message"},Ie={class:"popular-tags-section"},Ue={key:0,class:"tags-container"},ze={key:1,class:"empty-message"},Be={key:2,class:"empty-message"},We={class:"dialog-footer"};function Pe(e,t,a,i,n,s){const o=(0,c.g2)("font-awesome-icon"),u=l.S2,f=d.WK,m=ee.u,p=(0,c.g2)("Loading"),g=Te.tk,b=r.kZ;return(0,c.uX)(),(0,c.Wv)(b,{title:e.$t("tagManagement.title"),modelValue:s.visible,"onUpdate:modelValue":t[1]||(t[1]=e=>s.visible=e),width:s.dialogWidth,onClose:s.handleClose},{footer:(0,c.k6)(()=>[(0,c.Lk)("span",We,[(0,c.bF)(u,{onClick:s.handleClose},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("tagManagement.close")),1)]),_:1},8,["onClick"])])]),default:(0,c.k6)(()=>[(0,c.Lk)("div",$e,[(0,c.Lk)("div",Le,[(0,c.bF)(f,{modelValue:n.inputTag,"onUpdate:modelValue":t[0]||(t[0]=e=>n.inputTag=e),placeholder:e.$t("tagManagement.inputPlaceholder"),onKeyup:(0,B.jR)(s.handleAddTag,["enter"]),onInput:s.handleInputChange,clearable:""},{append:(0,c.k6)(()=>[(0,c.bF)(u,{onClick:s.handleAddTag,type:"primary"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"plus"})]),_:1},8,["onClick"])]),_:1},8,["modelValue","placeholder","onKeyup","onInput"]),n.showSuggestions&&n.suggestions.length>0?((0,c.uX)(),(0,c.CE)("div",Se,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.suggestions,e=>((0,c.uX)(),(0,c.CE)("div",{key:e,class:"suggestion-item",onClick:t=>s.selectSuggestion(e)},(0,h.v_)(e),9,xe))),128))])):(0,c.Q3)("",!0)]),(0,c.Lk)("div",De,[(0,c.Lk)("h4",null,(0,h.v_)(e.$t("tagManagement.currentTags")),1),n.currentTags.length>0?((0,c.uX)(),(0,c.CE)("div",Ee,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.currentTags,e=>((0,c.uX)(),(0,c.Wv)(m,{key:e,closable:"",onClose:t=>s.handleRemoveTag(e),class:"tag-item"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1032,["onClose"]))),128))])):((0,c.uX)(),(0,c.CE)("div",Ae,(0,h.v_)(e.$t("tagManagement.noTags")),1))]),(0,c.Lk)("div",Ie,[(0,c.Lk)("h4",null,(0,h.v_)(e.$t("tagManagement.popularTags")),1),n.popularTags.length>0?((0,c.uX)(),(0,c.CE)("div",Ue,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.popularTags,e=>((0,c.uX)(),(0,c.Wv)(m,{key:e,onClick:t=>s.handleAddPopularTag(e),class:"tag-item clickable",type:"info"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1032,["onClick"]))),128))])):n.loadingPopularTags?((0,c.uX)(),(0,c.CE)("div",ze,[(0,c.bF)(g,{class:"is-loading"},{default:(0,c.k6)(()=>[(0,c.bF)(p)]),_:1}),(0,c.eW)(" "+(0,h.v_)(e.$t("tagManagement.loading")),1)])):((0,c.uX)(),(0,c.CE)("div",Be,(0,h.v_)(e.$t("tagManagement.noPopularTags")),1))])])]),_:1},8,["title","modelValue","width","onClose"])}var Re=a(57477),Oe={name:"TagManagementDialog",components:{Loading:Re.Loading},props:{modelValue:{type:Boolean,default:!1},fileId:{type:String,required:!0}},emits:["update:modelValue","tagsUpdated"],data(){return{currentTags:[],inputTag:"",suggestions:[],popularTags:[],showSuggestions:!1,loading:!1,loadingPopularTags:!1,debounceTimer:null}},computed:{visible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},dialogWidth(){return window.innerWidth<768?"90%":"500px"}},watch:{visible(e){e&&(this.loadFileTags(),this.loadPopularTags())}},methods:{async loadFileTags(){try{const e=await(0,E.A)(`/api/manage/tags/${encodeURIComponent(this.fileId)}`,{method:"GET"});if(!e.ok)throw new Error("Failed to load tags");{const t=await e.json();this.currentTags=t.tags||[]}}catch(e){console.error("Error loading file tags:",e),ye.nk.error(this.$t("tagManagement.loadFailed"))}},async loadPopularTags(){this.loadingPopularTags=!0;try{const e=await(0,E.A)("/api/manage/tags/autocomplete?limit=20",{method:"GET"});if(e.ok){const t=await e.json();this.popularTags=(t.tags||[]).filter(e=>!this.currentTags.includes(e))}}catch(e){console.error("Error loading popular tags:",e)}finally{this.loadingPopularTags=!1}},handleInputChange(){clearTimeout(this.debounceTimer),this.inputTag&&0!==this.inputTag.trim().length?this.debounceTimer=setTimeout(()=>{this.fetchSuggestions()},300):this.showSuggestions=!1},async fetchSuggestions(){try{const e=this.inputTag.trim().toLowerCase(),t=await(0,E.A)(`/api/manage/tags/autocomplete?prefix=${encodeURIComponent(e)}&limit=10`,{method:"GET"});if(t.ok){const e=await t.json();this.suggestions=(e.tags||[]).filter(e=>!this.currentTags.includes(e)),this.showSuggestions=this.suggestions.length>0}}catch(e){console.error("Error fetching suggestions:",e)}},selectSuggestion(e){this.inputTag=e,this.showSuggestions=!1,this.handleAddTag()},async handleAddTag(){const e=this.inputTag.trim();if(e){if(this.currentTags.includes(e))return ye.nk.warning(this.$t("tagManagement.tagExists")),this.inputTag="",void(this.showSuggestions=!1);try{const t=await(0,E.A)(`/api/manage/tags/${encodeURIComponent(this.fileId)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"add",tags:[e]})});if(!t.ok){const e=await t.json();throw new Error(e.message||this.$t("tagManagement.addFailed"))}{const e=await t.json();this.currentTags=e.tags||[],this.inputTag="",this.showSuggestions=!1,ye.nk.success(this.$t("tagManagement.addSuccess")),this.$emit("tagsUpdated",this.currentTags),this.loadPopularTags()}}catch(t){console.error("Error adding tag:",t),ye.nk.error(t.message||this.$t("tagManagement.addFailed"))}}},async handleRemoveTag(e){try{const t=await(0,E.A)(`/api/manage/tags/${encodeURIComponent(this.fileId)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"remove",tags:[e]})});if(!t.ok)throw new Error(this.$t("tagManagement.removeFailed"));{const e=await t.json();this.currentTags=e.tags||[],ye.nk.success(this.$t("tagManagement.removeSuccess")),this.$emit("tagsUpdated",this.currentTags),this.loadPopularTags()}}catch(t){console.error("Error removing tag:",t),ye.nk.error(this.$t("tagManagement.removeFailed"))}},handleAddPopularTag(e){this.inputTag=e,this.handleAddTag()},handleClose(){this.visible=!1,this.inputTag="",this.showSuggestions=!1,this.currentTags=[],this.popularTags=[]}}};const Ne=(0,I.A)(Oe,[["render",Pe],["__scopeId","data-v-689f94e2"]]);var Me=Ne,Ve=a(55558),Xe=(a(10456),a(66810)),je=(a(34396),a(4885),a(82006)),Ke=(a(98642),a(63003),a(59869)),Ze=(a(70415),a(73565),a(57009));a(78450);const Ge={class:"detail-actions"},He={class:"preview-section"},qe={class:"preview-content"},Qe=["src"],Ye=["src"],Je={key:1},et={key:1},tt={key:0,style:{display:"flex","align-items":"center",gap:"6px"}},at={key:1,style:{color:"#909399"}},it={key:0,style:{display:"flex","flex-wrap":"wrap",gap:"5px"}},nt={key:1,style:{color:"#909399"}};function st(e,t,a,i,n,s){const o=(0,c.g2)("font-awesome-icon"),u=l.S2,f=d.WK,m=Y.v$,p=Y.q,g=Ze.Zq,b=Ke.MF,v=ee.u,k=Ke.TS,y=je.xE,_=je.US,w=r.kZ;return(0,c.uX)(),(0,c.Wv)(w,{title:e.$t("fileDetail.title"),modelValue:s.visible,"onUpdate:modelValue":t[24]||(t[24]=e=>s.visible=e),width:s.dialogWidth},{default:(0,c.k6)(()=>[(0,c.Lk)("div",Ge,[n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:0,type:"primary",onClick:t[0]||(t[0]=t=>e.$emit("download")),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"download",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.download")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:1,type:"primary",onClick:t[1]||(t[1]=t=>e.$emit("tagManagement")),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"tags",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.tags")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:2,type:"primary",onClick:t[2]||(t[2]=t=>e.$emit("block")),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"ban",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.blacklist")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:3,type:"primary",onClick:t[3]||(t[3]=t=>e.$emit("white")),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"shield-alt",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.whitelist")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:4,type:"danger",onClick:t[4]||(t[4]=t=>e.$emit("delete")),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"trash-alt",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.deleteBtn")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:5,type:"warning",onClick:t[5]||(t[5]=e=>s.startEdit()),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"edit",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.edit")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:6,type:"info",onClick:t[6]||(t[6]=e=>s.openRenameDialog()),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"i-cursor",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.rename")),1)]),_:1})),n.isEditing?((0,c.uX)(),(0,c.Wv)(u,{key:7,type:"success",onClick:t[7]||(t[7]=e=>s.saveMetadata()),round:"",size:"small",class:"detail-action",loading:n.editSaving},{default:(0,c.k6)(()=>[n.editSaving?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(o,{key:0,icon:"save",style:{"margin-right":"3px"}})),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.save")),1)]),_:1},8,["loading"])):(0,c.Q3)("",!0),n.isEditing?((0,c.uX)(),(0,c.Wv)(u,{key:8,onClick:t[8]||(t[8]=e=>s.cancelEdit()),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("fileDetail.cancel")),1)]),_:1})):(0,c.Q3)("",!0)]),(0,c.bF)(p,{modelValue:n.activeTab,"onUpdate:modelValue":t[16]||(t[16]=e=>n.activeTab=e),onTabClick:s.handleTabClick,style:{"margin-bottom":"10px"}},{default:(0,c.k6)(()=>[(0,c.bF)(m,{label:e.$t("fileDetail.originUrl"),name:"originUrl"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.originUrl,"onUpdate:modelValue":t[9]||(t[9]=e=>a.urls.originUrl=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1},8,["label"]),(0,c.bF)(m,{label:"Markdown",name:"mdUrl"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.mdUrl,"onUpdate:modelValue":t[10]||(t[10]=e=>a.urls.mdUrl=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1}),(0,c.bF)(m,{label:"HTML",name:"htmlUrl"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.htmlUrl,"onUpdate:modelValue":t[11]||(t[11]=e=>a.urls.htmlUrl=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1}),(0,c.bF)(m,{label:"BBCode",name:"bbUrl"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.bbUrl,"onUpdate:modelValue":t[12]||(t[12]=e=>a.urls.bbUrl=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1}),a.file?.metadata?.TgFileId?((0,c.uX)(),(0,c.Wv)(m,{key:0,label:"TG File ID",name:"tgId"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.tgId,"onUpdate:modelValue":t[13]||(t[13]=e=>a.urls.tgId=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1})):(0,c.Q3)("",!0),a.file?.metadata?.S3Location?((0,c.uX)(),(0,c.Wv)(m,{key:1,label:"S3 Location",name:"s3Location"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.S3Location,"onUpdate:modelValue":t[14]||(t[14]=e=>a.urls.S3Location=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1})):(0,c.Q3)("",!0),a.file?.metadata?.S3CdnFileUrl?((0,c.uX)(),(0,c.Wv)(m,{key:2,label:"S3 CDN URL",name:"s3CdnFileUrl"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.S3CdnFileUrl,"onUpdate:modelValue":t[15]||(t[15]=e=>a.urls.S3CdnFileUrl=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1})):(0,c.Q3)("",!0)]),_:1},8,["modelValue","onTabClick"]),(0,c.Lk)("div",He,[(0,c.Lk)("div",qe,[s.isVideo?((0,c.uX)(),(0,c.CE)("video",{key:0,src:a.fileLink,autoplay:"",muted:"",loop:"",class:"video-preview",onClick:t[17]||(t[17]=(...e)=>s.openImageLink&&s.openImageLink(...e))},null,8,Qe)):s.isAudio?((0,c.uX)(),(0,c.CE)("audio",{key:1,src:a.fileLink,controls:"",autoplay:"",class:"audio-preview"},null,8,Ye)):s.isImage?((0,c.uX)(),(0,c.Wv)(g,{key:2,src:a.fileLink,"preview-src-list":[a.fileLink],"preview-teleported":!0,fit:"contain",lazy:"",class:"image-preview"},null,8,["src","preview-src-list"])):((0,c.uX)(),(0,c.Wv)(o,{key:3,icon:"file",class:"file-icon-detail"}))])]),(0,c.bF)(k,{border:"",column:s.descColumn},{default:(0,c.k6)(()=>[(0,c.bF)(b,{label:e.$t("fileDetail.fileNameLabel")},{default:(0,c.k6)(()=>[n.isEditing?((0,c.uX)(),(0,c.Wv)(f,{key:0,modelValue:n.editForm.FileName,"onUpdate:modelValue":t[18]||(t[18]=e=>n.editForm.FileName=e),size:"small",placeholder:e.$t("fileDetail.fileNamePlaceholder")},null,8,["modelValue","placeholder"])):((0,c.uX)(),(0,c.CE)("span",Je,(0,h.v_)(a.file?.metadata?.FileName||a.file?.name),1))]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.fileType")},{default:(0,c.k6)(()=>[n.isEditing?((0,c.uX)(),(0,c.Wv)(f,{key:0,modelValue:n.editForm.FileType,"onUpdate:modelValue":t[19]||(t[19]=e=>n.editForm.FileType=e),size:"small",placeholder:e.$t("fileDetail.fileTypePlaceholder")},null,8,["modelValue","placeholder"])):((0,c.uX)(),(0,c.CE)("span",et,(0,h.v_)(a.file?.metadata?.FileType||e.$t("fileDetail.unknown")),1))]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.fileSizeLabel")},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(s.fileSizeDisplay),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.imageDimensions")},{default:(0,c.k6)(()=>[s.imageDimensions?((0,c.uX)(),(0,c.CE)("div",tt,[(0,c.Lk)("span",null,(0,h.v_)(a.file?.metadata?.Width)+" × "+(0,h.v_)(a.file?.metadata?.Height),1),(0,c.bF)(v,{size:"small",type:"info",style:{display:"inline-flex","align-items":"center","justify-content":"center"}},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(s.orientationIcon),1)]),_:1})])):((0,c.uX)(),(0,c.CE)("span",at,(0,h.v_)(e.$t("fileDetail.noDimensions")),1))]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.uploadTimeLabel")},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(s.uploadTime),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.channelTypeAndName")},{default:(0,c.k6)(()=>[(0,c.bF)(v,{size:"small",type:"info",style:{"margin-right":"6px"}},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(a.file?.metadata?.Channel||e.$t("fileDetail.unknown")),1)]),_:1}),(0,c.Lk)("span",null,(0,h.v_)(a.file?.metadata?.ChannelName||"-"),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.accessStatusAndReview")},{default:(0,c.k6)(()=>[(0,c.bF)(v,{size:"small",type:s.accessTagType,style:{"margin-right":"6px"}},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(s.accessType),1)]),_:1},8,["type"]),(0,c.Lk)("span",null,(0,h.v_)(a.file?.metadata?.Label||e.$t("fileDetail.noTags")),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.uploadIP")},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(a.file?.metadata?.UploadIP||e.$t("fileDetail.unknown")),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.uploadAddressLabel")},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(a.file?.metadata?.UploadAddress||e.$t("fileDetail.unknown")),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.fileTags")},{default:(0,c.k6)(()=>[a.file?.metadata?.Tags&&a.file?.metadata?.Tags.length>0?((0,c.uX)(),(0,c.CE)("div",it,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(a.file?.metadata?.Tags,e=>((0,c.uX)(),(0,c.Wv)(v,{key:e,size:"small"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1024))),128))])):((0,c.uX)(),(0,c.CE)("span",nt,(0,h.v_)(e.$t("fileDetail.noTags")),1))]),_:1},8,["label"])]),_:1},8,["column"]),(0,c.bF)(w,{modelValue:n.showRenameDialog,"onUpdate:modelValue":t[23]||(t[23]=e=>n.showRenameDialog=e),title:e.$t("fileDetail.renameTitle"),width:s.dialogWidth,"append-to-body":""},{footer:(0,c.k6)(()=>[(0,c.bF)(u,{onClick:t[21]||(t[21]=e=>s.closeRenameDialog())},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("fileDetail.renameCancel")),1)]),_:1}),(0,c.bF)(u,{type:"primary",onClick:t[22]||(t[22]=e=>s.submitRename()),loading:n.renameSaving,disabled:!n.renameValidation.valid},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("fileDetail.renameConfirm")),1)]),_:1},8,["loading","disabled"])]),default:(0,c.k6)(()=>[(0,c.bF)(_,{onSubmit:(0,B.D$)(s.submitRename,["prevent"])},{default:(0,c.k6)(()=>[(0,c.bF)(y,{label:e.$t("fileDetail.renameLabel"),error:n.renameValidation.error},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:n.renameForm.newFileId,"onUpdate:modelValue":t[20]||(t[20]=e=>n.renameForm.newFileId=e),placeholder:e.$t("fileDetail.renamePlaceholder"),onInput:s.validateRenameInput,clearable:""},null,8,["modelValue","placeholder","onInput"])]),_:1},8,["label","error"])]),_:1},8,["onSubmit"])]),_:1},8,["modelValue","title","width"])]),_:1},8,["title","modelValue","width"])}const rt=/[\\:\*\?"'<>\| \(\)\[\]\{\}#%\^`~;@&=\+\$,]/;function ot(e,t){return e&&""!==e.trim()?e===t?{valid:!1,error:"文件名未发生变化"}:e.includes("..")?{valid:!1,error:'文件名不能包含路径穿越字符 ".."'}:/\/\.\//.test(e)||/^\.\//.test(e)?{valid:!1,error:'文件名不能包含单独的 "." 路径段'}:rt.test(e)?{valid:!1,error:"文件名包含非法字符,请使用合法的文件名格式"}:e.includes("//")?{valid:!1,error:"文件名不能包含连续的斜杠"}:{valid:!0}:{valid:!1,error:"文件名不能为空"}}var lt={name:"FileDetailDialog",props:{modelValue:{type:Boolean,default:!1},file:{type:Object,default:null},fileLink:{type:String,default:""},urls:{type:Object,default:()=>({originUrl:"",mdUrl:"",htmlUrl:"",bbUrl:"",tgId:"",S3Location:"",S3CdnFileUrl:""})}},emits:["update:modelValue","download","tagManagement","block","white","delete","metadataUpdated","fileRenamed"],watch:{visible(e){e||(this.isEditing=!1,this.editSaving=!1)}},data(){return{activeTab:"originUrl",isEditing:!1,editForm:{FileName:"",FileType:""},editSaving:!1,showRenameDialog:!1,renameForm:{newFileId:""},renameValidation:{valid:!0,error:""},renameSaving:!1}},computed:{visible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},dialogWidth(){return window.innerWidth<768?"95%":"900px"},descColumn(){return window.innerWidth<768?1:2},isVideo(){const e=this.file?.metadata?.FileType?.toLowerCase()||"";if(e.includes("video"))return!0;const t=this.file?.name?.toLowerCase()||"";return t.endsWith(".mp4")||t.endsWith(".webm")||t.endsWith(".mov")||t.endsWith(".avi")},isAudio(){const e=this.file?.metadata?.FileType?.toLowerCase()||"";if(e.includes("audio"))return!0;const t=this.file?.name?.toLowerCase()||"";return t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")||t.endsWith(".flac")},isImage(){const e=this.file?.metadata?.FileType?.toLowerCase()||"";if(e.includes("image"))return!0;const t=this.file?.name?.toLowerCase()||"";return t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".png")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")||t.endsWith(".bmp")||t.endsWith(".avif")||t.endsWith(".heic")||t.endsWith(".heif")},uploadTime(){return this.file?.metadata?.TimeStamp?new Date(this.file.metadata.TimeStamp).toLocaleString():this.$t("fileDetail.unknown")},accessType(){const e=this.file?.metadata?.ListType,t=this.file?.metadata?.Label;return"White"===e?this.$t("fileDetail.accessNormalWhitelist"):"Block"===e?this.$t("fileDetail.accessBlockedBlacklist"):"adult"===t?this.$t("fileDetail.accessBlockedReview"):this.$t("fileDetail.accessNormal")},accessTagType(){const e=this.file?.metadata?.ListType,t=this.file?.metadata?.Label;return"White"===e?"success":"Block"===e||"adult"===t?"danger":"success"},imageDimensions(){const e=this.file?.metadata?.Width,t=this.file?.metadata?.Height;return!(!e||!t)||null},orientationIcon(){const e=this.file?.metadata?.Width,t=this.file?.metadata?.Height;if(!e||!t)return"";const a=e/t;return a>1.1?this.$t("fileDetail.orientationLandscape"):a<.9?this.$t("fileDetail.orientationPortrait"):this.$t("fileDetail.orientationSquare")},fileSizeDisplay(){const e=this.file?.metadata?.FileSizeBytes,t=this.file?.metadata?.FileSize;return e?e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(2)} KB`:`${(e/1024/1024).toFixed(2)} MB`:t?`${t} MB`:this.$t("fileDetail.unknown")}},methods:{handleVideoClick(e){const t=e.target;t.paused?t.play():t.pause()},handleTabClick(){},handleUrlClick(e){const t=e.target;t.select(),navigator.clipboard.writeText(t.value).then(()=>{ye.nk.success(this.$t("fileDetail.linkCopied"))})},openImageLink(){this.fileLink&&window.open(this.fileLink,"_blank")},startEdit(){this.editForm.FileName=this.file?.metadata?.FileName||"",this.editForm.FileType=this.file?.metadata?.FileType||"",this.isEditing=!0},cancelEdit(){this.isEditing=!1,this.editForm.FileName=this.file?.metadata?.FileName||"",this.editForm.FileType=this.file?.metadata?.FileType||"",this.editSaving=!1},async saveMetadata(){this.editSaving=!0;try{const e=this.file.name,t=await(0,E.A)(`/api/manage/metadata/${e}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({FileName:this.editForm.FileName,FileType:this.editForm.FileType})});if(!t.ok){const e=await t.json().catch(()=>({}));throw new Error(e.message||this.$t("fileDetail.metadataSaveFailed"))}{const a=await t.json();ye.nk.success(this.$t("fileDetail.metadataSaved")),this.isEditing=!1,this.$emit("metadataUpdated",e,a.metadata)}}catch(e){console.error("Error saving metadata:",e),ye.nk.error(e.message||this.$t("fileDetail.metadataSaveFailed"))}finally{this.editSaving=!1}},openRenameDialog(){this.renameForm.newFileId=this.file?.name||"",this.renameValidation={valid:!0,error:""},this.showRenameDialog=!0},closeRenameDialog(){this.showRenameDialog=!1,this.renameForm.newFileId="",this.renameValidation={valid:!0,error:""}},validateRenameInput(){const e=ot(this.renameForm.newFileId,this.file?.name||"");this.renameValidation={valid:e.valid,error:e.error||""}},async submitRename(){if(!this.renameSaving&&(this.validateRenameInput(),this.renameValidation.valid)){this.renameSaving=!0;try{const e=this.file.name,t=await(0,E.A)(`/api/manage/rename/${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({newFileId:this.renameForm.newFileId})});if(t.ok){const a=await t.json();ye.nk.success(this.$t("fileDetail.renameSuccess")),this.showRenameDialog=!1,this.$emit("fileRenamed",e,this.renameForm.newFileId,a.metadata)}else{if(409!==t.status){const e=await t.json().catch(()=>({}));throw new Error(e.message||this.$t("fileDetail.renameFailed"))}this.renameValidation={valid:!1,error:this.$t("fileDetail.renameConflict")}}}catch(e){console.error("Error renaming file:",e),ye.nk.error(e.message||this.$t("fileDetail.renameFailed"))}finally{this.renameSaving=!1}}}}};const dt=(0,I.A)(lt,[["render",st],["__scopeId","data-v-3f80812c"]]);var ct=dt,ht=a(78507);a(213);const ut={key:0,class:"batch-floating-bar"},ft={class:"batch-selection-summary"},mt={class:"batch-selection-count"},pt={class:"batch-floating-actions"};function gt(e,t,a,i,n,s){const r=(0,c.g2)("font-awesome-icon"),o=l.S2,d=ht.R7;return(0,c.uX)(),(0,c.Wv)(B.eB,{name:"batch-toolbar"},{default:(0,c.k6)(()=>[a.selectedCount>0?((0,c.uX)(),(0,c.CE)("div",ut,[(0,c.bF)(d,{content:e.$t("dashboard.clearSelection"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{class:"batch-floating-btn ghost","aria-label":e.$t("dashboard.clearSelection"),onClick:s.handleClear},{default:(0,c.k6)(()=>[(0,c.bF)(r,{icon:"times",class:"batch-floating-icon"})]),_:1},8,["aria-label","onClick"])]),_:1},8,["content"]),(0,c.bF)(d,{content:`${a.selectedCount} ${e.$t("dashboard.selectedItems")}`,placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",ft,[(0,c.Lk)("span",mt,(0,h.v_)(a.selectedCount),1)])]),_:1},8,["content"]),t[0]||(t[0]=(0,c.Lk)("span",{class:"batch-toolbar-divider"},null,-1)),(0,c.Lk)("div",pt,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.actions,t=>((0,c.uX)(),(0,c.Wv)(d,{key:t.command,content:e.$t(t.label),placement:"top"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{class:(0,h.C4)(["batch-floating-btn",t.className]),"aria-label":e.$t(t.label),onClick:e=>s.handleAction(t.command)},{default:(0,c.k6)(()=>[(0,c.bF)(r,{icon:t.icon,class:"batch-floating-icon"},null,8,["icon"])]),_:2},1032,["class","aria-label","onClick"])]),_:2},1032,["content"]))),128))])])):(0,c.Q3)("",!0)]),_:1})}var bt={name:"BatchActionBar",props:{selectedCount:{type:Number,required:!0}},emits:["action","clear"],data(){return{actions:[{command:"copy",label:"dashboard.copy",icon:"copy",className:"copy"},{command:"download",label:"dashboard.download",icon:"download",className:"download"},{command:"move",label:"dashboard.move",icon:"file-export",className:"move"},{command:"tagManagement",label:"dashboard.tagManagement",icon:"tags",className:"tag"},{command:"ban",label:"dashboard.addToBlacklist",icon:"ban",className:"ban"},{command:"white",label:"dashboard.addToWhitelist",icon:"shield-alt",className:"white"},{command:"delete",label:"dashboard.delete",icon:"trash-alt",className:"danger"}]}},methods:{handleAction(e){this.$emit("action",e)},handleClear(){this.$emit("clear")}}};const vt=(0,I.A)(bt,[["render",gt],["__scopeId","data-v-7445695a"]]);var kt=vt,yt=a(54880),_t=(a(4318),a(77815));a(72907);const wt={class:"list-col list-col-checkbox"},Ft=["src"],Ct=["src"],Tt=["title"],$t={class:"filename-start"},Lt={class:"filename-end"},St={class:"list-col list-col-tags"},xt={key:1,class:"list-empty"},Dt={class:"list-col list-col-channel"},Et={class:"list-col list-col-channel-name"},At={key:0,class:"channel-name-box"},It={key:1,class:"list-empty"},Ut={class:"list-col list-col-address"},zt={key:0,class:"address-box"},Bt={key:1,class:"list-empty"},Wt={class:"list-col list-col-size"},Pt={class:"list-col list-col-date"},Rt={class:"list-col list-col-actions"};function Ot(e,t,a,i,n,s){const r=(0,c.g2)("font-awesome-icon"),o=ht.R7;return(0,c.uX)(),(0,c.CE)("div",{class:"list-item",onTouchstart:t[9]||(t[9]=t=>e.$emit("touchstart",t)),onTouchend:t[10]||(t[10]=t=>e.$emit("touchend",t)),onTouchmove:t[11]||(t[11]=t=>e.$emit("touchmove",t))},[(0,c.Lk)("div",wt,[(0,c.Lk)("span",{class:(0,h.C4)(["custom-checkbox",{checked:n.localSelected}]),onClick:t[0]||(t[0]=(0,B.D$)((...e)=>s.toggleSelect&&s.toggleSelect(...e),["stop"]))},[n.localSelected?((0,c.uX)(),(0,c.Wv)(r,{key:0,icon:"check",class:"check-icon"})):(0,c.Q3)("",!0)],2)]),(0,c.Lk)("div",{class:"list-col list-col-preview",onClick:t[1]||(t[1]=(...e)=>s.handlePreviewClick&&s.handlePreviewClick(...e))},[s.isFolder?((0,c.uX)(),(0,c.Wv)(r,{key:0,icon:"folder-open",class:"list-folder-icon"})):s.isVideo?((0,c.uX)(),(0,c.CE)("video",{key:1,src:a.fileLink,class:"list-preview-img",muted:"",preload:"metadata"},null,8,Ft)):s.isImage?((0,c.uX)(),(0,c.CE)("img",{key:2,src:a.fileLink,class:"list-preview-img",loading:"lazy",decoding:"async"},null,8,Ct)):((0,c.uX)(),(0,c.Wv)(r,{key:3,icon:"file",class:"list-file-icon"}))]),(0,c.Lk)("div",{class:"list-col list-col-name",onClick:t[2]||(t[2]=(...e)=>s.handlePreviewClick&&s.handlePreviewClick(...e))},[(0,c.Lk)("span",{class:"filename-ellipsis",title:s.displayName},[(0,c.Lk)("span",$t,(0,h.v_)(s.fileNameStart),1),(0,c.Lk)("span",Lt,(0,h.v_)(s.fileNameEnd),1)],8,Tt)]),(0,c.Lk)("div",St,[!s.isFolder&&a.item.metadata?.Tags&&a.item.metadata.Tags.length>0?((0,c.uX)(),(0,c.CE)(c.FK,{key:0},[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(a.item.metadata.Tags.slice(0,3),(e,t)=>((0,c.uX)(),(0,c.CE)("span",{key:t,class:"color-tag",style:(0,h.Tr)({background:s.getTagColor(t)})},(0,h.v_)(e),5))),128)),a.item.metadata.Tags.length>3?((0,c.uX)(),(0,c.CE)("span",{key:0,class:"color-tag color-tag-more",style:(0,h.Tr)({background:s.getTagColor(3)})},"+"+(0,h.v_)(a.item.metadata.Tags.length-3),5)):(0,c.Q3)("",!0)],64)):((0,c.uX)(),(0,c.CE)("span",xt,"-"))]),(0,c.Lk)("div",Dt,(0,h.v_)(s.isFolder?"-":a.item.metadata?.Channel||a.item.channelTag||"-"),1),(0,c.Lk)("div",Et,[!s.isFolder&&a.item.metadata?.ChannelName?((0,c.uX)(),(0,c.CE)("div",At,(0,h.v_)(a.item.metadata.ChannelName),1)):((0,c.uX)(),(0,c.CE)("span",It,"-"))]),(0,c.Lk)("div",Ut,[!s.isFolder&&a.item.metadata?.UploadIP?((0,c.uX)(),(0,c.CE)("div",zt,(0,h.v_)(a.item.metadata.UploadIP),1)):((0,c.uX)(),(0,c.CE)("span",Bt,"-"))]),(0,c.Lk)("div",Wt,(0,h.v_)(s.isFolder?"-":s.fileSizeDisplay),1),(0,c.Lk)("div",Pt,(0,h.v_)(s.uploadDate),1),(0,c.Lk)("div",Rt,[s.isFolder?((0,c.uX)(),(0,c.CE)(c.FK,{key:1},[(0,c.bF)(o,{content:e.$t("dashboard.copyLink"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn",onClick:t[6]||(t[6]=(0,B.D$)(t=>e.$emit("folderCopy"),["stop"]))},[(0,c.bF)(r,{icon:"copy"})])]),_:1},8,["content"]),(0,c.bF)(o,{content:e.$t("dashboard.moveFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn",onClick:t[7]||(t[7]=(0,B.D$)(t=>e.$emit("move"),["stop"]))},[(0,c.bF)(r,{icon:"file-export"})])]),_:1},8,["content"])],64)):((0,c.uX)(),(0,c.CE)(c.FK,{key:0},[(0,c.bF)(o,{content:e.$t("dashboard.copyLink"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn",onClick:t[3]||(t[3]=(0,B.D$)(t=>e.$emit("copy"),["stop"]))},[(0,c.bF)(r,{icon:"copy"})])]),_:1},8,["content"]),(0,c.bF)(o,{content:e.$t("dashboard.downloadFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn",onClick:t[4]||(t[4]=(0,B.D$)(t=>e.$emit("download"),["stop"]))},[(0,c.bF)(r,{icon:"download"})])]),_:1},8,["content"]),(0,c.bF)(o,{content:e.$t("dashboard.moveFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn",onClick:t[5]||(t[5]=(0,B.D$)(t=>e.$emit("move"),["stop"]))},[(0,c.bF)(r,{icon:"file-export"})])]),_:1},8,["content"])],64)),(0,c.bF)(o,{content:e.$t("dashboard.delete"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn list-action-danger",onClick:t[8]||(t[8]=(0,B.D$)(t=>e.$emit("delete"),["stop"]))},[(0,c.bF)(r,{icon:"trash-alt"})])]),_:1},8,["content"])])],32)}var Nt={name:"FileListItem",props:{item:{type:Object,required:!0},selected:{type:Boolean,default:!1},fileLink:{type:String,default:""}},emits:["update:selected","enter","detail","copy","folderCopy","move","delete","download","touchstart","touchend","touchmove"],data(){return{localSelected:this.selected,tagColors:["#f472b6","#a78bfa","#60a5fa","#34d399"]}},computed:{isFolder(){return this.item.isFolder||this.item.name?.endsWith("/")},isVideo(){const e=this.item.name?.toLowerCase()||"";return e.endsWith(".mp4")||e.endsWith(".webm")||e.endsWith(".mov")||e.endsWith(".avi")},isImage(){const e=this.item.name?.toLowerCase()||"";return e.endsWith(".jpg")||e.endsWith(".jpeg")||e.endsWith(".png")||e.endsWith(".gif")||e.endsWith(".webp")||e.endsWith(".svg")||e.endsWith(".bmp")},displayName(){if(this.isFolder){const e=this.item.name.split("/").filter(Boolean);return e[e.length-1]||this.item.name}return this.item.metadata?.FileName||this.getFileName(this.item.name)},fileNameStart(){const e=this.displayName;return e.length<=20?e:e.slice(0,-8)},fileNameEnd(){const e=this.displayName;return e.length<=20?"":e.slice(-8)},uploadDate(){return this.item.uploaded?new Date(this.item.uploaded).toLocaleDateString():this.item.metadata?.TimeStamp?new Date(this.item.metadata.TimeStamp).toLocaleDateString():"-"},fileSizeDisplay(){const e=this.item.metadata?.FileSizeBytes,t=this.item.metadata?.FileSize;return e?e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(2)} MB`:t?`${t} MB`:"-"}},watch:{selected(e){this.localSelected=e}},methods:{toggleSelect(){this.localSelected=!this.localSelected,this.$emit("update:selected",this.localSelected)},handlePreviewClick(){this.isFolder?this.$emit("enter"):this.$emit("detail")},getFileName(e){const t=(e||"").split("/");return t[t.length-1]},getTagColor(e){return this.tagColors[e%this.tagColors.length]}}};const Mt=(0,I.A)(Nt,[["render",Ot],["__scopeId","data-v-78d34f50"]]);var Vt=Mt,Xt=a(70683),jt=(a(95385),a(98469));a(38736);const Kt={class:"file-short-info"},Zt={key:0,class:"success-tag"},Gt={key:1,class:"fail-tag"},Ht={key:2,class:"success-tag"},qt={key:3,class:"primary-tag"},Qt={key:0,style:{"margin-left":"2px"}},Yt={key:0,class:"skeleton-wrapper"},Jt={class:"error-text"},ea=["src"],ta={class:"error-text"},aa={key:3,class:"file-preview"},ia={class:"card-bottom-overlay"},na={class:"file-name-row"},sa={class:"file-name"},ra={class:"action-bar"},oa={class:"action-bar-left"},la={class:"action-bar-right"};function da(e,t,a,i,n,s){const r=jt.dI,o=(0,c.g2)("font-awesome-icon"),l=Ze.Zq,d=ht.R7,u=Xt.Ik;return(0,c.uX)(),(0,c.Wv)(u,{class:"img-card",onTouchstart:t[17]||(t[17]=t=>e.$emit("touchstart",t)),onTouchend:t[18]||(t[18]=t=>e.$emit("touchend",t)),onTouchmove:t[19]||(t[19]=t=>e.$emit("touchmove",t))},{default:(0,c.k6)(()=>[(0,c.bF)(r,{modelValue:n.localSelected,"onUpdate:modelValue":t[0]||(t[0]=e=>n.localSelected=e),onChange:t[1]||(t[1]=t=>e.$emit("update:selected",n.localSelected))},null,8,["modelValue"]),(0,c.Lk)("div",Kt,["White"===a.item.metadata?.ListType?((0,c.uX)(),(0,c.CE)("div",Zt,(0,h.v_)(s.channelTag),1)):"Block"===a.item.metadata?.ListType||"adult"===a.item.metadata?.Label?((0,c.uX)(),(0,c.CE)("div",Gt,(0,h.v_)(s.channelTag),1)):((0,c.uX)(),(0,c.CE)("div",Ht,(0,h.v_)(s.channelTag),1)),a.item.metadata?.Tags&&a.item.metadata?.Tags.length>0?((0,c.uX)(),(0,c.CE)("div",qt,[(0,c.bF)(o,{icon:"tag",style:{"margin-right":"3px","font-size":"12px"}}),(0,c.eW)(" "+(0,h.v_)(a.item.metadata.Tags[0])+" ",1),a.item.metadata.Tags.length>1?((0,c.uX)(),(0,c.CE)("span",Qt," (+"+(0,h.v_)(a.item.metadata.Tags.length-1)+") ",1)):(0,c.Q3)("",!0)])):(0,c.Q3)("",!0)]),s.isVideo?((0,c.uX)(),(0,c.CE)(c.FK,{key:0},[n.videoLoading?((0,c.uX)(),(0,c.CE)("div",Yt)):n.videoError?((0,c.uX)(),(0,c.CE)("div",{key:1,class:"error-wrapper",onClick:t[2]||(t[2]=t=>e.$emit("detail"))},[(0,c.bF)(o,{icon:"exclamation-triangle",class:"error-icon"}),(0,c.Lk)("span",Jt,(0,h.v_)(e.$t("dashboard.loadFailed")),1)])):(0,c.Q3)("",!0),(0,c.bo)((0,c.Lk)("video",{src:a.fileLink,muted:"",loop:"",preload:"metadata",class:"video-preview",onClick:t[3]||(t[3]=(...e)=>s.handleVideoClick&&s.handleVideoClick(...e)),onMouseenter:t[4]||(t[4]=e=>s.handleVideoHover(e,!0)),onMouseleave:t[5]||(t[5]=e=>s.handleVideoHover(e,!1)),onFullscreenchange:t[6]||(t[6]=(...e)=>s.handleFullscreenChange&&s.handleFullscreenChange(...e)),onWebkitfullscreenchange:t[7]||(t[7]=(...e)=>s.handleFullscreenChange&&s.handleFullscreenChange(...e)),onLoadeddata:t[8]||(t[8]=e=>n.videoLoading=!1),onError:t[9]||(t[9]=(...e)=>s.handleVideoError&&s.handleVideoError(...e))},null,40,ea),[[B.aG,!n.videoLoading&&!n.videoError]])],64)):s.isAudio?((0,c.uX)(),(0,c.CE)("div",{key:1,class:"file-preview audio-card-preview",onClick:t[10]||(t[10]=t=>e.$emit("detail"))},[(0,c.bF)(o,{icon:"music",class:"file-icon audio-icon"})])):s.isImage?((0,c.uX)(),(0,c.Wv)(l,{key:2,"preview-teleported":!0,src:a.fileLink,"preview-src-list":a.previewSrcList,fit:"cover",lazy:"",decoding:"async",class:"image-preview"},{placeholder:(0,c.k6)(()=>[...t[20]||(t[20]=[(0,c.Lk)("div",{class:"skeleton-wrapper"},null,-1)])]),error:(0,c.k6)(()=>[(0,c.Lk)("div",{class:"error-wrapper",onClick:t[11]||(t[11]=(0,B.D$)(t=>e.$emit("detail"),["stop"]))},[(0,c.bF)(o,{icon:"image",class:"error-icon"}),(0,c.Lk)("span",ta,(0,h.v_)(e.$t("dashboard.loadFailed")),1)])]),_:1},8,["src","preview-src-list"])):((0,c.uX)(),(0,c.CE)("div",aa,[(0,c.bF)(o,{icon:"file",class:"file-icon"})])),(0,c.Lk)("div",ia,[(0,c.Lk)("div",na,[(0,c.Lk)("span",sa,(0,h.v_)(s.displayName),1)]),(0,c.Lk)("div",ra,[(0,c.Lk)("div",oa,[(0,c.bF)(d,{disabled:a.disableTooltip,content:e.$t("dashboard.detail"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[12]||(t[12]=(0,B.D$)(t=>e.$emit("detail"),["stop"]))},[(0,c.bF)(o,{icon:"info-circle"})])]),_:1},8,["disabled","content"])]),(0,c.Lk)("div",la,[(0,c.bF)(d,{disabled:a.disableTooltip,content:e.$t("dashboard.moveFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[13]||(t[13]=(0,B.D$)(t=>e.$emit("move"),["stop"]))},[(0,c.bF)(o,{icon:"file-export"})])]),_:1},8,["disabled","content"]),(0,c.bF)(d,{disabled:a.disableTooltip,content:e.$t("dashboard.delete"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn action-btn-danger",onClick:t[14]||(t[14]=(0,B.D$)(t=>e.$emit("delete"),["stop"]))},[(0,c.bF)(o,{icon:"trash-alt"})])]),_:1},8,["disabled","content"]),(0,c.bF)(d,{disabled:a.disableTooltip,content:e.$t("dashboard.downloadFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[15]||(t[15]=(0,B.D$)(t=>e.$emit("download"),["stop"]))},[(0,c.bF)(o,{icon:"download"})])]),_:1},8,["disabled","content"]),(0,c.bF)(d,{disabled:a.disableTooltip,content:e.$t("dashboard.copyLink"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[16]||(t[16]=(0,B.D$)(t=>e.$emit("copy"),["stop"]))},[(0,c.bF)(o,{icon:"copy"})])]),_:1},8,["disabled","content"])])])])]),_:1})}var ca={name:"FileCard",props:{item:{type:Object,required:!0},selected:{type:Boolean,default:!1},fileLink:{type:String,required:!0},previewSrcList:{type:Array,default:()=>[]},disableTooltip:{type:Boolean,default:!1}},emits:["update:selected","detail","copy","move","delete","download","touchstart","touchend","touchmove"],data(){return{localSelected:this.selected,videoLoading:!0,videoError:!1}},computed:{channelTag(){return this.item.channelTag||""},isVideo(){const e=this.item.metadata?.FileType?.toLowerCase()||"";if(e.includes("video"))return!0;const t=this.item.name?.toLowerCase()||"";return t.endsWith(".mp4")||t.endsWith(".webm")||t.endsWith(".mov")||t.endsWith(".avi")},isAudio(){const e=this.item.metadata?.FileType?.toLowerCase()||"";if(e.includes("audio"))return!0;const t=this.item.name?.toLowerCase()||"";return t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")||t.endsWith(".flac")},isImage(){const e=this.item.metadata?.FileType?.toLowerCase()||"";if(e.includes("image"))return!0;const t=this.item.name?.toLowerCase()||"";return t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".png")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")||t.endsWith(".bmp")||t.endsWith(".avif")||t.endsWith(".heic")||t.endsWith(".heif")},displayName(){const e=this.item.metadata?.FileName||this.item.name||"",t=e.split("/");return t[t.length-1]}},watch:{selected(e){this.localSelected=e},fileLink(){this.videoLoading=!0,this.videoError=!1}},methods:{handleVideoError(){this.videoLoading=!1,this.videoError=!0},handleVideoClick(e){const t=e.target;t.requestFullscreen?t.requestFullscreen():t.webkitRequestFullscreen?t.webkitRequestFullscreen():t.mozRequestFullScreen?t.mozRequestFullScreen():t.msRequestFullscreen&&t.msRequestFullscreen()},handleFullscreenChange(e){const t=e.target,a=document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement;a?(t.muted=!1,t.loop=!1):(t.muted=!0,t.loop=!0,t.pause(),t.currentTime=0)},handleVideoHover(e,t){const a=e.target;t?a.play().catch(()=>{}):(a.pause(),a.currentTime=0)}}};const ha=(0,I.A)(ca,[["render",da],["__scopeId","data-v-e367e94e"]]);var ua=ha;const fa={class:"card-bottom-overlay"},ma={class:"file-name-row"},pa={class:"file-name"},ga={key:0,class:"action-bar"},ba={class:"action-bar-right"};function va(e,t,a,i,n,s){const r=jt.dI,o=(0,c.g2)("font-awesome-icon"),l=ht.R7,d=Xt.Ik;return(0,c.uX)(),(0,c.Wv)(d,{class:"img-card folder-card",onTouchstart:t[6]||(t[6]=t=>e.$emit("touchstart",t)),onTouchend:t[7]||(t[7]=t=>e.$emit("touchend",t)),onTouchmove:t[8]||(t[8]=t=>e.$emit("touchmove",t))},{default:(0,c.k6)(()=>[(0,c.bF)(r,{modelValue:n.localSelected,"onUpdate:modelValue":t[0]||(t[0]=e=>n.localSelected=e),onChange:t[1]||(t[1]=t=>e.$emit("update:selected",n.localSelected))},null,8,["modelValue"]),(0,c.Lk)("div",{class:"folder-icon",onClick:t[2]||(t[2]=t=>e.$emit("enter"))},[(0,c.bF)(o,{icon:"folder-open",class:"folder-icon-svg"})]),(0,c.Lk)("div",fa,[(0,c.Lk)("div",ma,[(0,c.Lk)("span",pa,(0,h.v_)(s.folderName),1)]),a.showActions?((0,c.uX)(),(0,c.CE)("div",ga,[t[9]||(t[9]=(0,c.Lk)("div",{class:"action-bar-left"},null,-1)),(0,c.Lk)("div",ba,[(0,c.bF)(l,{disabled:a.disableTooltip,content:e.$t("dashboard.copyLink"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[3]||(t[3]=(0,B.D$)(t=>e.$emit("copy"),["stop"]))},[(0,c.bF)(o,{icon:"copy"})])]),_:1},8,["disabled","content"]),(0,c.bF)(l,{disabled:a.disableTooltip,content:e.$t("dashboard.moveFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[4]||(t[4]=(0,B.D$)(t=>e.$emit("move"),["stop"]))},[(0,c.bF)(o,{icon:"file-export"})])]),_:1},8,["disabled","content"]),(0,c.bF)(l,{disabled:a.disableTooltip,content:e.$t("dashboard.delete"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn action-btn-danger",onClick:t[5]||(t[5]=(0,B.D$)(t=>e.$emit("delete"),["stop"]))},[(0,c.bF)(o,{icon:"trash-alt"})])]),_:1},8,["disabled","content"])])])):(0,c.Q3)("",!0)])]),_:1})}var ka={name:"FolderCard",props:{name:{type:String,required:!0},selected:{type:Boolean,default:!1},showActions:{type:Boolean,default:!0},disableTooltip:{type:Boolean,default:!1}},emits:["update:selected","enter","copy","move","delete","touchstart","touchend","touchmove"],data(){return{localSelected:this.selected}},computed:{folderName(){const e=this.name.split("/").filter(Boolean);return e[e.length-1]||this.name}},watch:{selected(e){this.localSelected=e}}};const ya=(0,I.A)(ka,[["render",va],["__scopeId","data-v-5f22ef48"]]);var _a=ya;function wa(e,t,a,i,n,s){return"card"===a.type?((0,c.uX)(!0),(0,c.CE)(c.FK,{key:0},(0,c.pI)(a.count,e=>((0,c.uX)(),(0,c.CE)("div",{key:"skeleton-"+e,class:"skeleton-card"},[...t[0]||(t[0]=[(0,c.Lk)("div",{class:"skeleton-image"},null,-1),(0,c.Lk)("div",{class:"skeleton-info"},[(0,c.Lk)("div",{class:"skeleton-text"})],-1)])]))),128)):"list"===a.type?((0,c.uX)(!0),(0,c.CE)(c.FK,{key:1},(0,c.pI)(a.count,e=>((0,c.uX)(),(0,c.CE)("div",{key:"list-skeleton-"+e,class:"list-item skeleton-list-item"},[...t[1]||(t[1]=[(0,c.Fv)('
    ',10)])]))),128)):(0,c.Q3)("",!0)}var Fa={name:"SkeletonLoader",props:{type:{type:String,default:"card",validator:e=>["card","list"].includes(e)},count:{type:Number,default:15}}};const Ca=(0,I.A)(Fa,[["render",wa],["__scopeId","data-v-5060702c"]]);var Ta=Ca,$a=a(81095),La=(a(77128),a(62086)),Sa=(a(40670),a(88830),a(23597),a(49187),a(77788));a(72099);const xa={class:"el-dropdown-link filter-trigger"},Da={class:"filter-section"},Ea={class:"filter-title"},Aa={class:"filter-options"},Ia={class:"filter-section"},Ua={class:"filter-title"},za={class:"filter-options"},Ba={class:"filter-section"},Wa={class:"filter-title"},Pa={class:"filter-options"},Ra={class:"filter-section"},Oa={class:"filter-title"},Na={class:"filter-options"},Ma={class:"filter-section"},Va={class:"filter-title"},Xa={class:"filter-options"},ja={key:0,class:"filter-section"},Ka={class:"filter-title"},Za={class:"filter-options"},Ga={key:0,class:"channel-divider"},Ha={class:"channel-group-title"},qa={class:"filter-actions"};function Qa(e,t,a,i,n,s){const r=(0,c.g2)("font-awesome-icon"),o=Sa.z_,d=jt.dI,u=jt.o5,f=l.S2,m=La.Iy,p=La.dW;return(0,c.uX)(),(0,c.Wv)(p,{"hide-on-click":!1,trigger:"click",class:"filter-dropdown",ref:"dropdownRef"},{dropdown:(0,c.k6)(()=>[(0,c.bF)(m,{class:"filter-dropdown-menu"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",Da,[(0,c.Lk)("div",Ea,(0,h.v_)(e.$t("filter.accessStatus")),1),(0,c.Lk)("div",Aa,[(0,c.bF)(u,{modelValue:n.localFilters.accessStatus,"onUpdate:modelValue":t[0]||(t[0]=e=>n.localFilters.accessStatus=e),onChange:t[1]||(t[1]=e=>s.handleFilterChange("accessStatus"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.accessStatusOptions,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"accessStatus-"+e.value,label:e.value},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])])]),(0,c.Lk)("div",Ia,[(0,c.Lk)("div",Ua,(0,h.v_)(e.$t("filter.blackWhiteList")),1),(0,c.Lk)("div",za,[(0,c.bF)(u,{modelValue:n.localFilters.listType,"onUpdate:modelValue":t[2]||(t[2]=e=>n.localFilters.listType=e),onChange:t[3]||(t[3]=e=>s.handleFilterChange("listType"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.listTypeOptions,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"listType-"+e.value,label:e.value},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])])]),(0,c.Lk)("div",Ba,[(0,c.Lk)("div",Wa,(0,h.v_)(e.$t("filter.reviewResult")),1),(0,c.Lk)("div",Pa,[(0,c.bF)(u,{modelValue:n.localFilters.label,"onUpdate:modelValue":t[4]||(t[4]=e=>n.localFilters.label=e),onChange:t[5]||(t[5]=e=>s.handleFilterChange("label"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.labelOptions,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"label-"+e.value,label:e.value},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])])]),(0,c.Lk)("div",Ra,[(0,c.Lk)("div",Oa,(0,h.v_)(e.$t("filter.fileType")),1),(0,c.Lk)("div",Na,[(0,c.bF)(u,{modelValue:n.localFilters.fileType,"onUpdate:modelValue":t[6]||(t[6]=e=>n.localFilters.fileType=e),onChange:t[7]||(t[7]=e=>s.handleFilterChange("fileType"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.fileTypeOptions,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"fileType-"+e.value,label:e.value},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])])]),(0,c.Lk)("div",Ma,[(0,c.Lk)("div",Va,(0,h.v_)(e.$t("filter.channelType")),1),(0,c.Lk)("div",Xa,[(0,c.bF)(u,{modelValue:n.localFilters.channel,"onUpdate:modelValue":t[8]||(t[8]=e=>n.localFilters.channel=e),onChange:t[9]||(t[9]=e=>s.handleFilterChange("channel"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.channelOptions,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"channel-"+e.value,label:e.value},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])])]),a.channelNameOptions.length>0?((0,c.uX)(),(0,c.CE)("div",ja,[(0,c.Lk)("div",Ka,(0,h.v_)(e.$t("filter.channelName")),1),(0,c.Lk)("div",Za,[(0,c.bF)(u,{modelValue:n.localFilters.channelName,"onUpdate:modelValue":t[10]||(t[10]=e=>n.localFilters.channelName=e),onChange:t[11]||(t[11]=e=>s.handleFilterChange("channelName"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.groupedChannelNames,(e,t)=>((0,c.uX)(),(0,c.CE)(c.FK,{key:"group-"+e.type},[t>0?((0,c.uX)(),(0,c.CE)("div",Ga)):(0,c.Q3)("",!0),(0,c.Lk)("div",Ha,(0,h.v_)(e.typeLabel),1),((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(e.channels,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"channelName-"+e.type+"-"+e.name,label:e.type+":"+e.name},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.name),1)]),_:2},1032,["label"]))),128))],64))),128))]),_:1},8,["modelValue"])])])):(0,c.Q3)("",!0),(0,c.Lk)("div",qa,[(0,c.bF)(f,{size:"small",onClick:s.clearFilters,disabled:0===s.activeFilterCount},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("filter.clearFilters")),1)]),_:1},8,["onClick","disabled"])])]),_:1})]),default:(0,c.k6)(()=>[(0,c.Lk)("span",xa,[(0,c.bF)(o,{value:s.activeFilterCount,hidden:0===s.activeFilterCount,class:"filter-badge"},{default:(0,c.k6)(()=>[(0,c.bF)(r,{icon:"filter",class:"header-icon"})]),_:1},8,["value","hidden"])])]),_:1},512)}a(7588),a(18237);var Ya={name:"FilterDropdown",props:{filters:{type:Object,default:()=>({accessStatus:[],listType:[],label:[],fileType:[],channel:[],channelName:[]})},channelNameOptions:{type:Array,default:()=>[]}},emits:["update:filters","change"],data(){return{localFilters:{accessStatus:[],listType:[],label:[],fileType:[],channel:[],channelName:[]}}},computed:{accessStatusOptions(){return[{label:this.$t("filter.normal"),value:"normal"},{label:this.$t("filter.blocked"),value:"blocked"}]},listTypeOptions(){return[{label:this.$t("filter.whiteList"),value:"White"},{label:this.$t("filter.blackList"),value:"Block"},{label:this.$t("filter.notSet"),value:"None"}]},labelOptions(){return[{label:this.$t("filter.normal"),value:"normal"},{label:this.$t("filter.teenContent"),value:"teen"},{label:this.$t("filter.adultContent"),value:"adult"}]},fileTypeOptions(){return[{label:this.$t("filter.image"),value:"image"},{label:this.$t("filter.video"),value:"video"},{label:this.$t("filter.audio"),value:"audio"},{label:this.$t("filter.other"),value:"other"}]},channelOptions(){return[{label:"Telegram",value:"TelegramNew"},{label:"Cloudflare R2",value:"CloudflareR2"},{label:"S3",value:"S3"},{label:"Discord",value:"Discord"},{label:"HuggingFace",value:"HuggingFace"},{label:"WebDAV",value:"WebDAV"},{label:this.$t("filter.externalLink"),value:"External"}]},activeFilterCount(){return Object.values(this.localFilters).reduce((e,t)=>e+t.length,0)},groupedChannelNames(){const e={};return this.channelNameOptions.forEach(t=>{e[t.type]||(e[t.type]={type:t.type,typeLabel:t.typeLabel,channels:[]}),e[t.type].channels.push(t)}),Object.values(e)}},watch:{filters:{handler(e){this.localFilters={accessStatus:Array.isArray(e.accessStatus)?[...e.accessStatus]:[],listType:Array.isArray(e.listType)?[...e.listType]:[],label:Array.isArray(e.label)?[...e.label]:[],fileType:Array.isArray(e.fileType)?[...e.fileType]:[],channel:Array.isArray(e.channel)?[...e.channel]:[],channelName:Array.isArray(e.channelName)?[...e.channelName]:[]}},immediate:!0,deep:!0}},methods:{handleFilterChange(e){this.$emit("update:filters",{...this.localFilters}),this.$emit("change",{type:e,filters:{...this.localFilters}})},clearFilters(){this.localFilters={accessStatus:[],listType:[],label:[],fileType:[],channel:[],channelName:[]},this.$emit("update:filters",{...this.localFilters}),this.$emit("change",{type:"clear",filters:{...this.localFilters}})}}};const Ja=(0,I.A)(Ya,[["render",Qa],["__scopeId","data-v-c3aeeea0"]]);var ei=Ja,ti=a(97247);const ai={class:"container"},ii={class:"header-content"},ni={class:"search-area"},si={class:"search-card"},ri={class:"actions"},oi={class:"el-dropdown-link"},li={class:"el-dropdown-link"},di={class:"breadcrumb-container"},ci={class:"mobile-directory-path"},hi={class:"breadcrumb desktop-only"},ui=["title"],fi={key:1,class:"empty-state"},mi={class:"empty-text"},pi={class:"empty-hint"},gi={class:"list-header"},bi={class:"list-col list-col-checkbox"},vi={class:"list-col list-col-preview"},ki={class:"list-col list-col-name"},yi={class:"list-col list-col-tags"},_i={class:"list-col list-col-channel"},wi={class:"list-col list-col-channel-name"},Fi={class:"list-col list-col-address"},Ci={class:"list-col list-col-size"},Ti={class:"list-col list-col-date"},$i={class:"list-col list-col-actions"},Li={key:1,class:"empty-state list-empty"},Si={class:"empty-text"},xi={class:"empty-hint"},Di={class:"pagination-container"},Ei={class:"pagination-center"},Ai={class:"pagination-right"},Ii={class:"page-total"},Ui={class:"page-jump"},zi={class:"dialog-section"},Bi={class:"section-header"},Wi={class:"section-title"},Pi={class:"section-content"},Ri={class:"dialog-section"},Oi={class:"section-header"},Ni={class:"section-title"},Mi={class:"section-content"},Vi={class:"setting-item"},Xi={class:"setting-label"},ji={key:0,class:"setting-item"},Ki={class:"setting-label"},Zi={class:"dialog-action"};function Gi(e,t,a,i,n,s){const o=ti.A,u=(0,c.g2)("font-awesome-icon"),f=d.WK,m=ei,p=La.c6,g=La.Iy,b=La.dW,v=ht.R7,k=yt.bZ,y=$a.WZ,_=$a.vp,w=Ta,F=_a,C=ua,T=Vt,$=_t.aQ,L=l.S2,S=yt.ZO,x=yt.lX,D=kt,E=ct,A=Xe.ll,I=Xe.MQ,U=Ve.qi,W=r.kZ,P=Me,R=Ce,O=Q,N=X,M=z;return(0,c.uX)(),(0,c.CE)("div",ai,[(0,c.bF)(x,null,{default:(0,c.k6)(()=>[(0,c.bF)(k,null,{default:(0,c.k6)(()=>[(0,c.Lk)("div",ii,[(0,c.bF)(o,{activeTab:"dashboard"}),(0,c.Lk)("div",ni,[(0,c.Lk)("div",si,[(0,c.bF)(f,{modelValue:n.tempSearch,"onUpdate:modelValue":t[0]||(t[0]=e=>n.tempSearch=e),size:"small",placeholder:e.$t("dashboard.searchPlaceholder"),onKeyup:(0,B.jR)(s.handleSearch,["enter"])},{suffix:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"search",class:"search-icon",onClick:s.handleSearch},null,8,["onClick"])]),_:1},8,["modelValue","placeholder","onKeyup"])]),(0,c.bF)(m,{filters:n.filters,"onUpdate:filters":t[1]||(t[1]=e=>n.filters=e),channelNameOptions:n.channelNameOptions,onChange:s.handleFilterChange},null,8,["filters","channelNameOptions","onChange"])]),(0,c.Lk)("div",ri,[(0,c.bF)(b,{onCommand:s.sort,"hide-on-click":!1},{dropdown:(0,c.k6)(()=>[(0,c.bF)(g,null,{default:(0,c.k6)(()=>[(0,c.bF)(p,{command:"dateDesc"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("dashboard.sortByDateDesc")),1)]),_:1}),(0,c.bF)(p,{command:"nameAsc"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("dashboard.sortByNameAsc")),1)]),_:1})]),_:1})]),default:(0,c.k6)(()=>[(0,c.Lk)("span",oi,[(0,c.bF)(u,{icon:s.sortIcon,class:"header-icon"},null,8,["icon"])])]),_:1},8,["onCommand"]),(0,c.bF)(v,{disabled:s.disableTooltip,content:e.$t("dashboard.linkFormat"),placement:"bottom"},{default:(0,c.k6)(()=>[(0,c.Lk)("span",li,[(0,c.bF)(u,{icon:"link",class:"header-icon",onClick:t[2]||(t[2]=e=>n.showUrlDialog=!0)})])]),_:1},8,["disabled","content"]),(0,c.bF)(v,{disabled:s.disableTooltip,content:"card"===n.viewMode?e.$t("dashboard.listView"):e.$t("dashboard.cardView"),placement:"bottom"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"card"===n.viewMode?"list":"th-large",class:"header-icon",onClick:s.toggleViewMode},null,8,["icon","onClick"])]),_:1},8,["disabled","content"]),(0,c.bF)(v,{disabled:s.disableTooltip,content:e.$t("dashboard.logout"),placement:"bottom"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"sign-out-alt",class:"header-icon",onClick:s.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,c.bF)(S,{class:(0,h.C4)(["main-container",{"has-batch-toolbar":n.selectedFiles.length>0}])},{default:(0,c.k6)(()=>[(0,c.Lk)("div",di,[(0,c.Lk)("button",{class:"breadcrumb-select-button",type:"button",onClick:t[3]||(t[3]=(...e)=>s.handleSelectPage&&s.handleSelectPage(...e))},[(0,c.bF)(u,{icon:s.selectPageIcon,class:"breadcrumb-select-icon"},null,8,["icon"])]),(0,c.Lk)("div",{class:"mobile-directory-trigger",onClick:t[4]||(t[4]=e=>n.showMobileDirectoryDrawer=!0)},[(0,c.bF)(u,{icon:"folder-open",class:"mobile-directory-icon"}),(0,c.Lk)("span",ci,(0,h.v_)(n.currentPath&&n.currentPath.split("/").filter(Boolean).length>0?n.currentPath.split("/").filter(Boolean).pop():e.$t("dashboard.rootDirectory")),1),(0,c.bF)(u,{icon:"chevron-down",class:"mobile-directory-arrow"})]),(0,c.Lk)("div",hi,[(0,c.bF)(_,{separator:"/"},{default:(0,c.k6)(()=>[(0,c.bF)(y,{onClick:t[5]||(t[5]=e=>s.navigateToFolder(""))},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"home",class:"breadcrumb-home-icon"})]),_:1}),((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.currentPath.split("/").filter(Boolean),(e,t)=>((0,c.uX)(),(0,c.Wv)(y,{key:t,onClick:e=>s.navigateToFolder(n.currentPath.split("/").filter(Boolean).slice(0,t+1).join("/"))},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1032,["onClick"]))),128))]),_:1})]),(0,c.Lk)("span",{class:"stats-badge",title:e.$t("dashboard.totalFiles",{count:e.$data.Number})},[(0,c.bF)(u,{icon:"database",class:"stats-badge-icon"}),(0,c.eW)(" "+(0,h.v_)(n.Number),1)],8,ui)]),"card"===n.viewMode?((0,c.uX)(),(0,c.CE)("div",{key:0,class:(0,h.C4)(["content",{"is-drag-selecting":i.isDragging}]),ref:"cardContainerRef"},[n.loading?((0,c.uX)(),(0,c.Wv)(w,{key:0,type:"card",count:15})):0===s.paginatedTableData.length?((0,c.uX)(),(0,c.CE)("div",fi,[(0,c.bF)(u,{icon:"folder-open",class:"empty-icon"}),(0,c.Lk)("p",mi,(0,h.v_)(s.hasSearchOrFilter?e.$t("dashboard.noMatchingFiles"):e.$t("dashboard.currentDirEmpty")),1),(0,c.Lk)("p",pi,(0,h.v_)(s.hasSearchOrFilter?e.$t("dashboard.adjustSearchHint"):e.$t("dashboard.uploadHint")),1)])):((0,c.uX)(!0),(0,c.CE)(c.FK,{key:2},(0,c.pI)(s.paginatedTableData,(e,t)=>((0,c.uX)(),(0,c.CE)(c.FK,{key:t},[s.isFolder(e)?((0,c.uX)(),(0,c.Wv)(F,{key:0,name:e.name,selected:e.selected,"onUpdate:selected":t=>e.selected=t,showActions:!n.isSearchMode,disableTooltip:s.disableTooltip,onEnter:t=>s.enterFolder(e.name),onCopy:t=>s.handleFolderCopy(e.name),onMove:a=>s.handleMove(t,e.name),onDelete:a=>s.handleDelete(t,e.name),onTouchstart:a=>s.handleFolderTouchStart(e,t),onTouchend:s.handleTouchEnd,onTouchmove:s.handleTouchEnd},null,8,["name","selected","onUpdate:selected","showActions","disableTooltip","onEnter","onCopy","onMove","onDelete","onTouchstart","onTouchend","onTouchmove"])):((0,c.uX)(),(0,c.Wv)(C,{key:1,item:e,selected:e.selected,"onUpdate:selected":t=>e.selected=t,fileLink:s.getFileLink(e.name),previewSrcList:e.previewSrcList,disableTooltip:s.disableTooltip,onDetail:a=>s.openDetailDialog(t,e.name),onCopy:a=>s.handleCopy(t,e.name),onMove:a=>s.handleMove(t,e.name),onDelete:a=>s.handleDelete(t,e.name),onDownload:t=>s.handleDownload(e.name),onTouchstart:a=>s.handleTouchStart(e,t),onTouchend:s.handleTouchEnd,onTouchmove:s.handleTouchEnd},null,8,["item","selected","onUpdate:selected","fileLink","previewSrcList","disableTooltip","onDetail","onCopy","onMove","onDelete","onDownload","onTouchstart","onTouchend","onTouchmove"]))],64))),128))],2)):((0,c.uX)(),(0,c.CE)("div",{key:1,class:(0,h.C4)(["list-view",{"is-drag-selecting":i.isDragging}]),ref:"listContainerRef"},[(0,c.Lk)("div",gi,[(0,c.Lk)("div",bi,[(0,c.Lk)("span",{class:(0,h.C4)(["custom-checkbox",{checked:s.isSelectAll,indeterminate:s.isIndeterminate}]),onClick:t[6]||(t[6]=e=>s.handleSelectAllPage(!s.isSelectAll))},[s.isSelectAll?((0,c.uX)(),(0,c.Wv)(u,{key:0,icon:"check",class:"check-icon"})):s.isIndeterminate?((0,c.uX)(),(0,c.Wv)(u,{key:1,icon:"minus",class:"check-icon"})):(0,c.Q3)("",!0)],2)]),(0,c.Lk)("div",vi,(0,h.v_)(e.$t("dashboard.preview")),1),(0,c.Lk)("div",ki,(0,h.v_)(e.$t("dashboard.fileName")),1),(0,c.Lk)("div",yi,(0,h.v_)(e.$t("dashboard.tags")),1),(0,c.Lk)("div",_i,(0,h.v_)(e.$t("dashboard.channelType")),1),(0,c.Lk)("div",wi,(0,h.v_)(e.$t("dashboard.channelNameCol")),1),(0,c.Lk)("div",Fi,(0,h.v_)(e.$t("dashboard.uploadAddress")),1),(0,c.Lk)("div",Ci,(0,h.v_)(e.$t("dashboard.fileSize")),1),(0,c.Lk)("div",Ti,(0,h.v_)(e.$t("dashboard.uploadTime")),1),(0,c.Lk)("div",$i,(0,h.v_)(e.$t("dashboard.actions")),1)]),n.loading?((0,c.uX)(),(0,c.Wv)(w,{key:0,type:"list",count:15})):0===s.paginatedTableData.length?((0,c.uX)(),(0,c.CE)("div",Li,[(0,c.bF)(u,{icon:"folder-open",class:"empty-icon"}),(0,c.Lk)("p",Si,(0,h.v_)(s.hasSearchOrFilter?e.$t("dashboard.noMatchingFiles"):e.$t("dashboard.currentDirEmpty")),1),(0,c.Lk)("p",xi,(0,h.v_)(s.hasSearchOrFilter?e.$t("dashboard.adjustSearchHint"):e.$t("dashboard.uploadHint")),1)])):((0,c.uX)(!0),(0,c.CE)(c.FK,{key:2},(0,c.pI)(s.paginatedTableData,(e,t)=>((0,c.uX)(),(0,c.Wv)(T,{key:t,item:e,selected:e.selected,"onUpdate:selected":t=>e.selected=t,fileLink:s.getFileLink(e.name),onEnter:t=>s.enterFolder(e.name),onDetail:a=>s.openDetailDialog(t,e.name),onCopy:a=>s.handleCopy(t,e.name),onFolderCopy:t=>s.handleFolderCopy(e.name),onMove:a=>s.handleMove(t,e.name),onDelete:a=>s.handleDelete(t,e.name),onDownload:t=>s.handleDownload(e.name),onTouchstart:a=>s.isFolder(e)?s.handleFolderTouchStart(e,t):s.handleTouchStart(e,t),onTouchend:s.handleTouchEnd,onTouchmove:s.handleTouchEnd},null,8,["item","selected","onUpdate:selected","fileLink","onEnter","onDetail","onCopy","onFolderCopy","onMove","onDelete","onDownload","onTouchstart","onTouchend","onTouchmove"]))),128))],2)),i.isDragging?((0,c.uX)(),(0,c.CE)("div",{key:2,class:"drag-select-overlay",style:(0,h.Tr)({position:"fixed",left:i.selectionRect.left+"px",top:i.selectionRect.top+"px",width:i.selectionRect.width+"px",height:i.selectionRect.height+"px"})},null,4)):(0,c.Q3)("",!0),(0,c.Lk)("div",Di,[(0,c.Lk)("div",Ei,[(0,c.bF)($,{background:"",layout:"prev, pager, next",total:s.filteredTableData.length,"page-size":n.pageSize,"current-page":n.currentPage,"pager-count":s.pagerCount,onCurrentChange:s.handlePageChange},null,8,["total","page-size","current-page","pager-count","onCurrentChange"]),(0,c.bF)(L,{type:"primary",onClick:s.refreshFileList,class:"refresh-btn"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"sync",class:(0,h.C4)({"fa-spin":n.refreshLoading})},null,8,["class"])]),_:1},8,["onClick"]),n.currentPage===Math.ceil(s.filteredTableData.length/n.pageSize)?((0,c.uX)(),(0,c.Wv)(L,{key:0,type:"primary",onClick:s.loadMoreData,loading:n.loading,class:"load-more"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("dashboard.loadMore")),1)]),_:1},8,["onClick","loading"])):(0,c.Q3)("",!0)]),(0,c.Lk)("div",Ai,[(0,c.Lk)("span",Ii,(0,h.v_)(e.$t("dashboard.totalPages",{count:s.realTotalPages})),1),(0,c.Lk)("div",Ui,[(0,c.Lk)("span",null,(0,h.v_)(e.$t("dashboard.jumpTo")),1),(0,c.bF)(f,{modelValue:n.jumpPage,"onUpdate:modelValue":t[7]||(t[7]=e=>n.jumpPage=e),size:"small",class:"jump-input",onKeyup:(0,B.jR)(s.handleJumpPage,["enter"])},null,8,["modelValue","onKeyup"]),(0,c.bF)(L,{size:"small",type:"primary",onClick:s.handleJumpPage,class:"jump-btn"},{default:(0,c.k6)(()=>[...t[24]||(t[24]=[(0,c.eW)("GO",-1)])]),_:1},8,["onClick"])])])])]),_:1},8,["class"])]),_:1}),(0,c.bF)(D,{"selected-count":n.selectedFiles.length,onAction:s.handleBatchAction,onClear:s.clearSelection},null,8,["selected-count","onAction","onClear"]),(0,c.bF)(E,{modelValue:n.showdetailDialog,"onUpdate:modelValue":t[8]||(t[8]=e=>n.showdetailDialog=e),file:n.detailFile,fileLink:s.getFileLink(n.detailFile?.name),urls:s.allUrl,onDownload:t[9]||(t[9]=e=>s.handleDownload(n.detailFile?.name)),onTagManagement:t[10]||(t[10]=e=>s.handleTagManagement(n.detailFile?.name)),onBlock:t[11]||(t[11]=e=>s.handleBlock(n.detailFile?.name)),onWhite:t[12]||(t[12]=e=>s.handleWhite(n.detailFile?.name)),onDelete:t[13]||(t[13]=e=>s.handleDetailDelete(n.detailFile?.name)),onMetadataUpdated:s.handleMetadataUpdated,onFileRenamed:s.handleFileRenamed},null,8,["modelValue","file","fileLink","urls","onMetadataUpdated","onFileRenamed"]),(0,c.bF)(W,{title:e.$t("dashboard.linkFormat"),modelValue:n.showUrlDialog,"onUpdate:modelValue":t[18]||(t[18]=e=>n.showUrlDialog=e),width:s.dialogWidth,"show-close":!1,class:"settings-dialog"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",zi,[(0,c.Lk)("div",Bi,[(0,c.Lk)("span",Wi,(0,h.v_)(e.$t("settings.defaultCopyLink")),1)]),(0,c.Lk)("div",Pi,[(0,c.bF)(I,{modelValue:n.defaultUrlFormat,"onUpdate:modelValue":t[14]||(t[14]=e=>n.defaultUrlFormat=e),class:"radio-card-group grid-2x2"},{default:(0,c.k6)(()=>[(0,c.bF)(A,{label:"originUrl",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"link",class:"radio-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("settings.rawLink")),1)]),_:1}),(0,c.bF)(A,{label:"mdUrl",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"code",class:"radio-icon"}),t[25]||(t[25]=(0,c.Lk)("span",null,"Markdown",-1))]),_:1}),(0,c.bF)(A,{label:"htmlUrl",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"code-branch",class:"radio-icon"}),t[26]||(t[26]=(0,c.Lk)("span",null,"HTML",-1))]),_:1}),(0,c.bF)(A,{label:"bbUrl",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"quote-right",class:"radio-icon"}),t[27]||(t[27]=(0,c.Lk)("span",null,"BBCode",-1))]),_:1}),(0,c.bF)(A,{label:"tgId",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"paper-plane",class:"radio-icon"}),t[28]||(t[28]=(0,c.Lk)("span",null,"TG File ID",-1))]),_:1}),(0,c.bF)(A,{label:"s3Location",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"cloud",class:"radio-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("settings.s3Link")),1)]),_:1})]),_:1},8,["modelValue"])])]),(0,c.Lk)("div",Ri,[(0,c.Lk)("div",Oi,[(0,c.Lk)("span",Ni,(0,h.v_)(e.$t("settings.customLink")),1),(0,c.bF)(v,{content:e.$t("settings.customLinkTooltip"),placement:"top","raw-content":""},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,c.Lk)("div",Mi,[(0,c.Lk)("div",Vi,[(0,c.Lk)("span",Xi,(0,h.v_)(e.$t("settings.enableCustom")),1),(0,c.bF)(U,{modelValue:n.useCustomUrl,"onUpdate:modelValue":t[15]||(t[15]=e=>n.useCustomUrl=e),"active-value":"true","inactive-value":"false"},null,8,["modelValue"])]),"true"===n.useCustomUrl?((0,c.uX)(),(0,c.CE)("div",ji,[(0,c.Lk)("span",Ki,(0,h.v_)(e.$t("settings.customPrefix")),1),(0,c.bF)(f,{modelValue:n.customUrlPrefix,"onUpdate:modelValue":t[16]||(t[16]=e=>n.customUrlPrefix=e),placeholder:e.$t("settings.customPrefixPlaceholder"),class:"setting-input"},null,8,["modelValue","placeholder"])])):(0,c.Q3)("",!0)])]),(0,c.Lk)("div",Zi,[(0,c.bF)(L,{type:"primary",onClick:t[17]||(t[17]=e=>n.showUrlDialog=!1),class:"confirm-btn"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("settings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"]),(0,c.bF)(P,{modelValue:n.showTagDialog,"onUpdate:modelValue":t[19]||(t[19]=e=>n.showTagDialog=e),fileId:n.currentTagFile,onTagsUpdated:s.handleTagsUpdated},null,8,["modelValue","fileId","onTagsUpdated"]),(0,c.bF)(R,{modelValue:n.showBatchTagDialog,"onUpdate:modelValue":t[20]||(t[20]=e=>n.showBatchTagDialog=e),selectedFiles:n.selectedFiles,onTagsUpdated:s.handleBatchTagsUpdated},null,8,["modelValue","selectedFiles","onTagsUpdated"]),(0,c.bF)(O,{modelValue:n.showMobileActionModal,"onUpdate:modelValue":t[21]||(t[21]=e=>n.showMobileActionModal=e),title:n.mobileActionIsFolder?s.getFolderName(n.mobileActionFile?.name||""):n.mobileActionFile?.metadata?.FileName||s.getFileName(n.mobileActionFile?.name||""),isFolder:n.mobileActionIsFolder,onAction:s.handleMobileAction},null,8,["modelValue","title","isFolder","onAction"]),(0,c.bF)(N,{modelValue:n.showMobileDirectoryDrawer,"onUpdate:modelValue":t[22]||(t[22]=e=>n.showMobileDirectoryDrawer=e),currentPath:n.currentPath,onNavigate:s.navigateToFolder,onGoBack:s.handleGoBack},null,8,["modelValue","currentPath","onNavigate","onGoBack"]),(0,c.bF)(M,{modelValue:n.showMoveDialog,"onUpdate:modelValue":t[23]||(t[23]=e=>n.showMoveDialog=e),"current-directory":n.currentPath,"is-batch-move":n.isBatchMove,"initial-path":n.moveTargetPath,onConfirm:s.confirmMove},null,8,["modelValue","current-directory","is-batch-move","initial-path","onConfirm"])])}a(81148),a(20116),a(13579),a(17642),a(58004),a(33853),a(45876),a(32475),a(15024),a(31698),a(14603),a(47566),a(98721);var Hi=a(60782),qi=a(44813),Qi=a.n(qi),Yi=a(54047),Ji=(a(58335),a(46638));class en{constructor(){this.FILE_LIST_PATH="data/fileList.json",this.fileListCache=null,this.storageWarningShown=!1}getLocalFileList(){const e=this.getMutableFileList();return{...e,files:[...e.files||[]],directories:[...e.directories||[]]}}getMutableFileList(){if(this.fileListCache)return this.fileListCache;try{const e=localStorage.getItem(this.FILE_LIST_PATH);return this.fileListCache=e?JSON.parse(e):this.createEmptyFileList(),this.fileListCache}catch(e){return console.error("Error reading local file list:",e),this.fileListCache=this.createEmptyFileList(),this.fileListCache}}updateFileListCache(e){this.fileListCache=e||this.createEmptyFileList();const t=this.persistFileListCache();return{cacheUpdated:!0,persisted:t}}persistFileListCache(){try{return localStorage.setItem(this.FILE_LIST_PATH,JSON.stringify(this.fileListCache)),!0}catch(e){return this.handleStoragePersistError(e),!1}}createEmptyFileList(){return{files:[],directories:[]}}handleStoragePersistError(e){console.warn("File list is kept in memory because localStorage persistence failed:",e);try{localStorage.removeItem(this.FILE_LIST_PATH)}catch(t){console.warn("Failed to remove stale file list cache:",t)}this.storageWarningShown||(this.storageWarningShown=!0,ye.nk.warning(Ji.Ay.global.t("dashboard.fileListMemoryCacheWarning")))}addFile(e){try{const t=this.getMutableFileList();return t.files.push(e),this.updateFileListCache(t).cacheUpdated}catch(t){return console.error("Error adding file:",t),!1}}addFolder(e){try{const t=this.getMutableFileList();return!t.directories.includes(e)&&(t.directories.push(e),this.updateFileListCache(t).cacheUpdated)}catch(t){return console.error("Error adding folder:",t),!1}}moveFile(e,t,a=!1,i=""){try{let n=this.getMutableFileList();if(a){const t=n.directories.indexOf(e);-1!==t&&n.directories.splice(t,1)}else{const t=n.files.findIndex(t=>t.name===e);-1!==t&&n.files.splice(t,1)}if(t.startsWith(i)){const e=t.substring(i.length).split("/");if(e.length>1){const t=i+e[0];n.directories.includes(t)||n.directories.push(t)}}return this.updateFileListCache(n).cacheUpdated}catch(n){return console.error("Error moving file:",n),!1}}removeFile(e){try{let t=this.getMutableFileList();return t.files=t.files.filter(t=>t.name!==e),this.updateFileListCache(t).cacheUpdated}catch(t){return console.error("Error removing file:",t),!1}}removeFolder(e){try{let t=this.getMutableFileList();return t.files=t.files.filter(t=>!t.name.startsWith(e+"/")),t.directories=t.directories.filter(t=>t!==e),this.updateFileListCache(t).cacheUpdated}catch(t){return console.error("Error removing folder:",t),!1}}getFilesInFolder(e){try{const t=this.getMutableFileList(),a=t.files.filter(t=>t.name.startsWith(e+"/")),i=t.directories.filter(t=>t.startsWith(e+"/"));return{files:a,directories:i}}catch(t){return console.error("Error getting files in folder:",t),{files:[],directories:[]}}}buildFilterParams(e){let t="";return e.accessStatus&&e.accessStatus.length>0&&(t+=`&accessStatus=${encodeURIComponent(e.accessStatus.join(","))}`),e.listType&&e.listType.length>0&&(t+=`&listType=${encodeURIComponent(e.listType.join(","))}`),e.label&&e.label.length>0&&(t+=`&label=${encodeURIComponent(e.label.join(","))}`),e.fileType&&e.fileType.length>0&&(t+=`&fileType=${encodeURIComponent(e.fileType.join(","))}`),e.channel&&e.channel.length>0&&(t+=`&channel=${encodeURIComponent(e.channel.join(","))}`),e.channelName&&e.channelName.length>0&&(t+=`&channelName=${encodeURIComponent(e.channelName.join(","))}`),t}async refreshFileList(e,t="",a="",i="",n={}){t=t.trim();try{let s=`/api/manage/list?count=60&dir=${e}&search=${encodeURIComponent(t)}`;a&&(s+=`&includeTags=${encodeURIComponent(a)}`),i&&(s+=`&excludeTags=${encodeURIComponent(i)}`),s+=this.buildFilterParams(n);const r=await(0,E.A)(s,{method:"GET"}),o=await r.json();return o.isIndexedResponse||ye.nk.warning(Ji.Ay.global.t("dashboard.indexingWarning")),this.updateFileListCache(o).cacheUpdated}catch(s){return console.error("Error refreshing file list:",s),!1}}async loadMoreFiles(e,t="",a="",i="",n=60,s={}){t=t.trim();try{const r=this.getMutableFileList(),o=r.files.length;let l=`/api/manage/list?dir=${e}&start=${o}&count=${n}&search=${encodeURIComponent(t)}`;a&&(l+=`&includeTags=${encodeURIComponent(a)}`),i&&(l+=`&excludeTags=${encodeURIComponent(i)}`),l+=this.buildFilterParams(s);const d=await(0,E.A)(l,{method:"GET"}),c=await d.json();return r.files.push(...c.files),this.updateFileListCache(r).cacheUpdated}catch(r){return console.error("Error loading more files:",r),{files:[],directories:[]}}}}const tn=new en;var an=a(62388),nn=a(48903),sn=a(90144);function rn(e,t){return!(e.right<=t.left||e.left>=t.right||e.bottom<=t.top||e.top>=t.bottom)}function on(e,t){const a=Math.min(e.x,t.x),i=Math.min(e.y,t.y),n=Math.abs(t.x-e.x),s=Math.abs(t.y-e.y);return{left:a,top:i,width:n,height:s,right:a+n,bottom:i+s}}function ln(e){const{modes:t,mainSelector:a=".main-container",viewMode:i,items:n}=e,s=(0,sn.KR)(!1),r=(0,sn.KR)({left:0,top:0,width:0,height:0,right:0,bottom:0});let o=null,l=[],d=!1;const h=768;let u=!1;const f=50,m=10;let p=null,g="";function b(){const e=(0,sn.BA)(i);return t[e]||void 0}function v(){const e=(0,sn.BA)(i);return("card"===e||"list"===e)&&window.innerWidth>h}function k(){v()?u||A():u&&(U(),I())}function y(e){const t=e.target,i=t.closest(a);if(!i)return!1;const n=b();if(n){const e=t.closest(n.itemSelector);if(e){const t=(0,sn.BA)(n.containerRef);if(t&&t.contains(e))return!1}}const s=t.closest("button, a, input, .el-input, .el-dropdown, .el-checkbox, .el-breadcrumb, .el-pagination, .el-pager, .header-content, .breadcrumb-container");return!s}function _(e){return e.shiftKey||e.ctrlKey||e.metaKey}function w(){const e=(0,sn.BA)(n);l=e.map(e=>!!e.selected)}let F=0;function C(){function e(){const t=window.innerHeight;let a=0;F>=t-f?a=m:F<=f&&(a=-m),0!==a&&(window.scrollBy(0,a),o&&(o.y-=a,r.value=on(o,{x:r.value.right>=o.x?r.value.right:r.value.left,y:F}),S())),p=requestAnimationFrame(e)}null===p&&(p=requestAnimationFrame(e))}function T(){null!==p&&(cancelAnimationFrame(p),p=null)}function $(){g=document.body.style.userSelect,document.body.style.userSelect="none"}function L(){document.body.style.userSelect=g}function S(){const e=b();if(!e)return;const t=(0,sn.BA)(e.containerRef);if(!t)return;const a=(0,sn.BA)(n),i=r.value,s={left:i.left,top:i.top,right:i.right,bottom:i.bottom},o=t.querySelectorAll(e.itemSelector);a.forEach((e,t)=>{const a=o[t];if(!a)return;const i=a.getBoundingClientRect(),n={left:i.left,top:i.top,right:i.right,bottom:i.bottom},r=rn(s,n);d&&l[t]?e.selected=!0:e.selected=r})}function x(e){if(0===e.button&&y(e)){if(o={x:e.clientX,y:e.clientY},d=_(e),w(),!d){const e=(0,sn.BA)(n);e.forEach(e=>{e.selected=!1})}s.value=!0,r.value=on(o,o),$(),document.addEventListener("mousemove",D),document.addEventListener("mouseup",E)}}function D(e){if(!s.value||!o)return;const t={x:e.clientX,y:e.clientY};F=e.clientY,r.value=on(o,t),S();const a=window.innerHeight;F<=f||F>=a-f?C():T()}function E(e){s.value&&(T(),L(),s.value=!1,r.value={left:0,top:0,width:0,height:0,right:0,bottom:0},o=null,document.removeEventListener("mousemove",D),document.removeEventListener("mouseup",E))}function A(){u||(document.addEventListener("mousedown",x),u=!0)}function I(){u&&(document.removeEventListener("mousedown",x),u=!1)}function U(){s.value&&(T(),L(),s.value=!1,r.value={left:0,top:0,width:0,height:0,right:0,bottom:0},o=null,document.removeEventListener("mousemove",D),document.removeEventListener("mouseup",E))}function z(){k()}return(0,c.wB)(()=>(0,sn.BA)(i),()=>{U(),k()}),(0,c.sV)(()=>{v()&&A(),window.addEventListener("resize",z)}),(0,c.xo)(()=>{U(),L(),T(),I(),window.removeEventListener("resize",z)}),{isDragging:s,selectionRect:r}}var dn={name:"AdminDashBoard",mixins:[nn.A],data(){return{Number:0,directFileCount:0,directFolderCount:0,showLogoutButton:!1,tableData:[],tempSearch:"",search:"",searchKeywords:"",searchIncludeTags:"",searchExcludeTags:"",isSearchMode:!1,currentPage:1,pageSize:15,selectedFiles:[],sortOption:"dateDesc",isUploading:!1,showdetailDialog:!1,detailFile:null,activeUrlTab:"originUrl",defaultUrlFormat:"originUrl",showUrlDialog:!1,useCustomUrl:"false",customUrlPrefix:"",loading:!1,currentPath:"",refreshLoading:!1,showTagDialog:!1,showBatchTagDialog:!1,currentTagFile:"",viewMode:"card",showMobileActionModal:!1,mobileActionFile:null,mobileActionIndex:-1,mobileActionIsFolder:!1,longPressTimer:null,showMobileDirectoryDrawer:!1,jumpPage:"",filters:{accessStatus:[],listType:[],label:[],fileType:[],channel:[],channelName:[]},channelNameOptions:[],showMoveDialog:!1,moveTargetPath:"/",moveFileKey:"",moveFileIndex:-1,isBatchMove:!1}},components:{DashboardTabs:ti.A,TagManagementDialog:Me,BatchTagDialog:Ce,SkeletonLoader:Ta,FileCard:ua,FolderCard:_a,FileListItem:Vt,FileDetailDialog:ct,BatchActionBar:kt,MobileActionSheet:Q,MobileDirectoryDrawer:X,FilterDropdown:ei,MoveFileDialog:z,LanguageSwitcher:Yi.A},setup(){const e=(0,sn.KR)(null),t=(0,sn.KR)(null),a=(0,sn.KR)("card"),i=(0,sn.KR)([]),{isDragging:n,selectionRect:s}=ln({modes:{card:{containerRef:e,itemSelector:".img-card"},list:{containerRef:t,itemSelector:".list-item"}},viewMode:a,items:i});return{cardContainerRef:e,listContainerRef:t,viewModeRef:a,itemsRef:i,isDragging:n,selectionRect:s}},computed:{...(0,Hi.L8)(["adminUrlSettings","userConfig"]),filteredTableData(){return this.tableData},totalPages(){return Math.ceil(this.filteredTableData.length/this.pageSize)||1},realTotalPages(){const e=this.directFolderCount+this.directFileCount;return Math.ceil(e/this.pageSize)||1},activeFilterCount(){return Object.values(this.filters).reduce((e,t)=>e+(Array.isArray(t)?t.length:0),0)},hasSearchOrFilter(){return this.isSearchMode||this.activeFilterCount>0},paginatedTableData(){const e=this.sortData(this.filteredTableData),t=(this.currentPage-1)*this.pageSize,a=t+this.pageSize;let i=e.slice(t,a);const n=i.filter(e=>this.isImage(e)).map(e=>this.getFileLink(e.name));return i.forEach(e=>{this.isImage(e)&&(e.previewSrcList=n.slice(n.indexOf(this.getFileLink(e.name))).concat(n.slice(0,n.indexOf(this.getFileLink(e.name)))))}),i.forEach(e=>{"TelegramNew"===e.metadata?.Channel||"Telegram"===e.metadata?.Channel?e.channelTag="TG":"CloudflareR2"===e.metadata?.Channel?e.channelTag="R2":"S3"===e.metadata?.Channel?e.channelTag="S3":"Discord"===e.metadata?.Channel?e.channelTag="DC":"HuggingFace"===e.metadata?.Channel?e.channelTag="HF":"WebDAV"===e.metadata?.Channel?e.channelTag="WD":"External"===e.metadata?.Channel?e.channelTag=this.$t("dashboard.externalTag"):e.channelTag=this.$t("dashboard.unknownTag")}),i},sortIcon(){return"dateDesc"===this.sortOption?"sort-amount-down":"sort-alpha-up"},dialogWidth(){return window.innerWidth>768?"50%":"90%"},detailDialogWidth(){return window.innerWidth>768?"70%":"90%"},accessType(){return"White"===this.detailFile?.metadata?.ListType?this.$t("filter.normal"):"Block"===this.detailFile?.metadata?.ListType||"adult"===this.detailFile?.metadata?.Label?this.$t("filter.blocked"):this.$t("filter.normal")},allUrl(){return"External"===this.detailFile?.metadata?.Channel?{originUrl:`${this.detailFile?.metadata?.ExternalLink}`,mdUrl:`![${this.detailFile?.metadata?.FileName||this.detailFile?.name}](${this.detailFile?.metadata?.ExternalLink})`,htmlUrl:`${this.detailFile?.metadata?.FileName||this.detailFile?.name}`,bbUrl:`[img]${this.detailFile?.metadata?.ExternalLink}[/img]`,tgId:this.detailFile?.metadata?.TgFileId||this.$t("fileDetail.unknown"),S3Location:this.detailFile?.metadata?.S3Location||this.$t("fileDetail.unknown"),S3CdnFileUrl:this.detailFile?.metadata?.S3CdnFileUrl||this.$t("fileDetail.unknown")}:{originUrl:`${this.rootUrl}${this.detailFile?.name}`,mdUrl:`![${this.detailFile?.metadata?.FileName||this.detailFile?.name}](${this.rootUrl}${this.detailFile?.name})`,htmlUrl:`${this.detailFile?.metadata?.FileName||this.detailFile?.name}`,bbUrl:`[img]${this.rootUrl}${this.detailFile?.name}[/img]`,tgId:this.detailFile?.metadata?.TgFileId||this.$t("fileDetail.unknown"),S3Location:this.detailFile?.metadata?.S3Location||this.$t("fileDetail.unknown"),S3CdnFileUrl:this.detailFile?.metadata?.S3CdnFileUrl||this.$t("fileDetail.unknown")}},tableColumnNum(){return window.innerWidth>768?3:1},tablePreviewSpan(){return window.innerWidth>768?2:1},disableTooltip(){return window.innerWidth<768},selectPage(){return this.paginatedTableData.every(e=>e.selected)},selectedPageFiles(){return this.paginatedTableData.some(e=>e.selected)},selectPageIcon(){return this.selectPage?"check-square":this.selectedPageFiles?"minus-square":"square"},rootUrl(){return"true"===this.useCustomUrl?this.customUrlPrefix:this.userConfig?.urlPrefix||`${document.location.origin}/file/`},isSelectAll:{get(){return this.paginatedTableData.length>0&&this.paginatedTableData.every(e=>e.selected)},set(e){this.paginatedTableData.forEach(t=>t.selected=e)}},isIndeterminate(){const e=this.paginatedTableData.filter(e=>e.selected).length;return e>0&&ee.selected&&!this.selectedFiles.includes(e))),this.selectedFiles=this.selectedFiles.filter(e=>e.selected),this.selectedFiles=this.selectedFiles.filter(t=>e.includes(t))},deep:!0},sortOption(e){localStorage.setItem("sortOption",e)},defaultUrlFormat(e){localStorage.setItem("defaultUrlFormat",e)},showdetailDialog(e){e&&(this.activeUrlTab=this.defaultUrlFormat||"originUrl")},customUrlPrefix(e){this.$store.commit("setAdminUrlSettings",{key:"customUrlPrefix",value:e})},useCustomUrl(e){this.$store.commit("setAdminUrlSettings",{key:"useCustomUrl",value:e})},currentPath(e){this.tableData.forEach(e=>e.selected=!1)}},methods:{toggleViewMode(){this.viewMode="card"===this.viewMode?"list":"card",localStorage.setItem("viewMode",this.viewMode)},handleSelectAllPage(e){this.paginatedTableData.forEach(t=>t.selected=e)},handleTouchStart(e,t){this.longPressTimer=setTimeout(()=>{this.mobileActionFile=e,this.mobileActionIndex=t,this.mobileActionIsFolder=!1,this.showMobileActionModal=!0},500)},handleTouchEnd(){this.longPressTimer&&(clearTimeout(this.longPressTimer),this.longPressTimer=null)},handleFolderTouchStart(e,t){this.longPressTimer=setTimeout(()=>{this.mobileActionFile=e,this.mobileActionIndex=t,this.mobileActionIsFolder=!0,this.showMobileActionModal=!0},500)},handleMobileAction(e){const t=this.mobileActionFile,a=this.mobileActionIndex;if(this.showMobileActionModal=!1,t)switch(e){case"detail":this.openDetailDialog(a,t.name);break;case"copy":this.handleCopy(a,t.name);break;case"folderCopy":this.handleFolderCopy(t.name);break;case"download":this.handleDownload(t.name);break;case"move":this.handleMove(a,t.name);break;case"delete":this.handleDelete(a,t.name);break;case"tag":this.handleTagManagement(t.name);break}},handleGoBack(){const e=this.currentPath.split("/").filter(Boolean);if(e.length>0){e.pop();const t=e.join("/");this.navigateToFolder(t)}this.showMobileDirectoryDrawer=!1},getTagColor(e){const t=["linear-gradient(135deg, #667eea 0%, #764ba2 100%)","linear-gradient(135deg, #f093fb 0%, #f5576c 100%)","linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)","linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)","linear-gradient(135deg, #fa709a 0%, #fee140 100%)","linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)"];return t[e%t.length]},handleVideoHover(e,t){const a=e.target;t?a.play().catch(()=>{}):(a.pause(),a.currentTime=0)},formatFileSize(e){if(!e||0===e)return"-";if(e=Number(e),isNaN(e))return"-";const t=["B","KB","MB","GB","TB"];let a=0;while(e>=1024&&a0?1:0)+" "+t[a]},handleSearch(){if(this.search=this.tempSearch,this.isSearchMode=""!==this.search.trim(),this.currentPage=1,this.search&&this.search.trim()){const e=[],t=[];let a=this.search;const i=/-#([\w\u4e00-\u9fa5\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af\.\+\-]+)/g;a=a.replace(i,(e,a)=>(t.push(a.toLowerCase())," "));const n=/#([\w\u4e00-\u9fa5\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af\.\+\-]+)/g;a=a.replace(n,(t,a)=>(e.push(a.toLowerCase())," ")),this.searchKeywords=a.replace(/\s+/g," ").trim(),this.searchIncludeTags=e.join(","),this.searchExcludeTags=t.join(","),console.log("Search keywords:",this.searchKeywords),console.log("Include tags:",this.searchIncludeTags),console.log("Exclude tags:",this.searchExcludeTags)}else this.searchKeywords="",this.searchIncludeTags="",this.searchExcludeTags="";this.refreshFileList()},handleFilterChange({type:e,filters:t}){this.filters=t,this.currentPage=1,this.refreshFileList()},clearFilters(){this.filters={listType:[],label:[],fileType:[],channel:[],channelName:[]},this.currentPage=1,this.refreshFileList()},async extractChannelNames(){try{const e=await(0,E.A)("/api/channels?includeDisabled=true",{method:"GET"});if(e.ok){const t=await e.json(),a=[],i={telegram:"Telegram",cfr2:"Cloudflare R2",s3:"S3",discord:"Discord",huggingface:"HuggingFace",webdav:"WebDAV"};Object.entries(t).forEach(([e,t])=>{Array.isArray(t)&&t.length>0&&t.forEach(t=>{t.name&&a.push({name:t.name,type:t.type,typeLabel:i[e]||e,value:`${t.type}:${t.name}`})})}),a.sort((e,t)=>e.type!==t.type?e.type.localeCompare(t.type):e.name.localeCompare(t.name)),this.channelNameOptions=a}}catch(e){console.error("Failed to fetch channel names:",e)}},handleDownload(e){const t=document.createElement("a");t.href=this.getFileLink(e),t.download=e,t.click()},openDetailDialog(e,t){this.detailFile=this.paginatedTableData[e],this.showdetailDialog=!0},handleTabClick(e){this.activeUrlTab=e.props.name},handleUrlClick(e){navigator.clipboard.writeText(e.target.value).then(()=>{this.$message({type:"success",message:this.$t("dashboard.copySuccess")})}).catch(()=>{this.$message({type:"error",message:this.$t("dashboard.copyFailed")})})},handleDetailDelete(e){this.$confirm(this.$t("dashboard.deleteConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{(0,E.A)(`/api/manage/delete/${e}`,{method:"GET"}).then(t=>{if(!t.ok)return Promise.reject("Request failed");{const t=this.tableData.findIndex(t=>t.name===e);-1!==t&&this.tableData.splice(t,1)}}).then(()=>{this.updateStats(-1,!1),this.$message.success(this.$t("dashboard.deleteSuccess")),this.showdetailDialog=!1}).catch(()=>this.$message.error(this.$t("dashboard.deleteFailed")))}).catch(()=>console.log("Delete cancelled"))},handleBlock(e){this.$confirm(this.$t("dashboard.blockConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{(0,E.A)(`/api/manage/block/${e}`,{method:"GET"}).then(t=>{if(!t.ok)return Promise.reject("Request failed");{const t=this.tableData.findIndex(t=>t.name===e);-1!==t&&(this.tableData[t].metadata.ListType="Block")}}).then(()=>{this.$message.success(this.$t("dashboard.blockSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.blockFailed")))}).catch(()=>console.log("Block cancelled"))},handleWhite(e){this.$confirm(this.$t("dashboard.whiteConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{(0,E.A)(`/api/manage/white/${e}`,{method:"GET"}).then(t=>{if(!t.ok)return Promise.reject("Request failed");{const t=this.tableData.findIndex(t=>t.name===e);-1!==t&&(this.tableData[t].metadata.ListType="White")}}).then(()=>{this.$message.success(this.$t("dashboard.whiteSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.whiteFailed")))}).catch(()=>console.log("White cancelled"))},handleDelete(e,t){const a=this.tableData.find(e=>e.name===t).isFolder;this.$confirm(a?this.$t("dashboard.deleteFolderConfirm"):this.$t("dashboard.deleteFileConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{(0,E.A)(`/api/manage/delete/${t}?folder=${a}`,{method:"GET"}).then(e=>{if(!e.ok)return Promise.reject("Request failed");{const e=this.tableData.findIndex(e=>e.name===t);-1!==e&&this.tableData.splice(e,1)}}).then(()=>{this.updateStats(-1,!1),tn.removeFile(t),this.$message.success(this.$t("dashboard.deleteSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.deleteFailed")))}).catch(()=>console.log("Delete cancelled"))},handleBatchDelete(){this.$confirm(this.$t("dashboard.batchDeleteConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{const e=this.selectedFiles.map(e=>{const t=e.isFolder;return(0,E.A)(`/api/manage/delete/${e.name}?folder=${t}`,{method:"GET"})});Promise.all(e).then(e=>{let t=0;e.forEach((e,a)=>{if(e.ok){t++;const e=this.tableData.findIndex(e=>e.name===this.selectedFiles[a].name);-1!==e&&this.tableData.splice(e,1),tn.removeFile(this.selectedFiles[a].name)}}),this.selectedFiles=[],this.updateStats(-t,!1),this.$message.success(this.$t("dashboard.batchDeleteSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.batchDeleteFailed")))}).catch(()=>console.log("Batch delete cancelled"))},async handleBatchCopy(){const e=this.selectedFiles.filter(e=>!e.isFolder),t=this.selectedFiles.filter(e=>e.isFolder);let a=null;t.length>0&&(a=this.$loading({lock:!0,text:this.$t("dashboard.fetchingFileList")}));try{let n=[...e];for(const e of t)try{const t=await(0,E.A)(`/api/manage/list?dir=${encodeURIComponent(e.name)}&recursive=true&count=-1`,{method:"GET"}),a=await t.json();a.files&&a.files.length>0&&(n=n.concat(a.files))}catch(i){console.error(`获取文件夹 ${e.name} 内容失败:`,i)}if(a&&a.close(),0===n.length)return void this.$message.warning(this.$t("dashboard.noLinksAvailable"));const s=n.map(e=>this.generateFileLink(e.name,e.metadata)).filter(e=>e);if(0===s.length)return void this.$message.warning(this.$t("dashboard.noLinksAvailable"));const r=s.join("\n");navigator.clipboard?(await navigator.clipboard.writeText(r),this.$message.success(this.$t("dashboard.batchCopySuccess",{count:s.length}))):this.copyToClipboardFallback(r)}catch(i){a&&a.close(),console.error("Batch copy failed:",i),this.$message.error(this.$t("dashboard.batchCopyFailed"))}},copyToClipboardFallback(e){const t=document.createElement("textarea");document.body.appendChild(t),t.style.position="fixed",t.style.clip="rect(0 0 0 0)",t.style.top="10px",t.value=e,t.select(),document.execCommand("copy"),document.body.removeChild(t),this.$message.success(this.$t("dashboard.batchCopyLinksSuccess"))},handleCopy(e,t){let a="";if("External"===this.paginatedTableData[e].metadata?.Channel)switch(this.defaultUrlFormat){case"originUrl":a=this.paginatedTableData[e].metadata?.ExternalLink;break;case"mdUrl":a=`![${this.paginatedTableData[e].metadata?.FileName||t}](${this.paginatedTableData[e].metadata?.ExternalLink})`;break;case"htmlUrl":a=`${this.paginatedTableData[e].metadata?.FileName||t}`;break;case"bbUrl":a=`[img]${this.paginatedTableData[e].metadata?.ExternalLink}[/img]`;break;case"tgId":a=this.paginatedTableData[e].metadata?.TgFileId||"none";break;case"s3Location":a=this.paginatedTableData[e].metadata?.S3Location||"none";break}else switch(this.defaultUrlFormat){case"originUrl":a=`${this.rootUrl}${t}`;break;case"mdUrl":a=`![${this.paginatedTableData[e].metadata?.FileName||t}](${this.rootUrl}${t})`;break;case"htmlUrl":a=`${this.paginatedTableData[e].metadata?.FileName||t}`;break;case"bbUrl":a=`[img]${this.rootUrl}${t}[/img]`;break;case"tgId":a=this.paginatedTableData[e].metadata?.TgFileId||"none";break;case"s3Location":a=this.paginatedTableData[e].metadata?.S3Location||"none";break}navigator.clipboard?navigator.clipboard.writeText(a).then(()=>this.$message.success(this.$t("dashboard.copyFileLinkSuccess"))):this.copyToClipboardFallback(a)},async loadMoreData(){this.loading=!0;try{await tn.loadMoreFiles(this.currentPath,this.searchKeywords,this.searchIncludeTags,this.searchExcludeTags,60,this.filters),await this.fetchFileList()}catch(e){this.$message.error(this.$t("dashboard.loadMoreFailed"))}finally{this.loading=!1}},updateStats(e,t=!1){t?this.Number=e:this.Number+=e},sort(e){this.sortOption=e},sortData(e){const t=e.filter(e=>e.isFolder),a=e.filter(e=>!e.isFolder);return"dateDesc"===this.sortOption?(t.sort((e,t)=>new Date(t.metadata?.TimeStamp)-new Date(e.metadata?.TimeStamp)),a.sort((e,t)=>new Date(t.metadata?.TimeStamp)-new Date(e.metadata?.TimeStamp))):(t.sort((e,t)=>e.name.localeCompare(t.name)),a.sort((e,t)=>e.name.localeCompare(t.name))),t.concat(a)},handleVideoClick(e){const t=e.target;t.requestFullscreen?t.requestFullscreen():t.webkitRequestFullscreen?t.webkitRequestFullscreen():t.mozRequestFullScreen?t.mozRequestFullScreen():t.msRequestFullscreen&&t.msRequestFullscreen()},handleLogout(){const e="/api/auth/logout";fetch(e,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:"admin"})}).finally(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")})},handleSelectPage(){this.selectPage?this.paginatedTableData.forEach(e=>e.selected=!1):this.paginatedTableData.forEach(e=>e.selected=!0)},clearSelection(){this.tableData.forEach(e=>e.selected=!1),this.selectedFiles=[]},handleBatchAction(e){"copy"===e?this.handleBatchCopy():"delete"===e?this.handleBatchDelete():"download"===e?this.handleBatchDownload():"move"===e?this.handleBatchMove():"tagManagement"===e?this.handleBatchTagManagement():"ban"===e?this.handleBatchBlock():"white"===e&&this.handleBatchWhite()},handleMove(e,t){this.moveFileKey=t,this.moveFileIndex=e,this.isBatchMove=!1,this.moveTargetPath="/",this.showMoveDialog=!0},handleBatchMove(){this.isBatchMove=!0,this.moveTargetPath="/",this.showMoveDialog=!0},confirmMove(e){const t=e,a=(0,an.G)(t);if(!a.valid)return void this.$message.error(a.error);const i=t.replace(/^\/+/,"")+(t.endsWith("/")||""===t?"":"/");i!==this.currentPath?(this.showMoveDialog=!1,this.isBatchMove?this.executeBatchMove(i):this.executeSingleMove(i)):this.$message.warning(this.$t("dashboard.moveTargetSameAsCurrent"))},executeSingleMove(e){const t=this.moveFileKey,a=this.tableData.find(e=>e.name===t)?.isFolder;(0,E.A)(`/api/manage/move/${t}?folder=${a}&dist=${encodeURIComponent(e)}`,{method:"GET"}).then(i=>{if(!i.ok)return Promise.reject("Request failed");{const i=this.tableData.findIndex(e=>e.name===t);if(-1!==i){const n=e+t.split("/").pop();tn.moveFile(t,n,a,this.currentPath),this.tableData.splice(i,1),this.$nextTick(()=>{const e=[...this.tableData];this.tableData=[],this.$nextTick(()=>{this.tableData=e})})}this.updateStats(-1,!1),this.$message.success(this.$t("dashboard.moveSuccess"))}}).then(()=>{this.refreshLocalFileList()}).catch(()=>this.$message.error(this.$t("dashboard.moveFailed")))},executeBatchMove(e){const t=this.selectedFiles.map(t=>{const a=t.isFolder;return(0,E.A)(`/api/manage/move/${t.name}?folder=${a}&dist=${encodeURIComponent(e)}`,{method:"GET"})});Promise.all(t).then(t=>{let a=0;t.forEach((t,i)=>{if(t.ok){a++;const t=this.selectedFiles[i];t.selected=!1;const n=this.tableData.findIndex(e=>e.name===t.name);if(-1!==n){const a=e+t.name.split("/").pop();tn.moveFile(t.name,a,t.isFolder,this.currentPath),this.tableData.splice(n,1)}}}),this.$nextTick(()=>{const e=[...this.tableData];this.tableData=[],this.$nextTick(()=>{this.tableData=e})}),this.updateStats(-a,!1),this.$message.success(this.$t("dashboard.moveSuccess"))}).then(()=>{this.refreshLocalFileList()}).catch(()=>this.$message.error(this.$t("dashboard.moveFailed")))},handleBatchBlock(){this.$confirm(this.$t("dashboard.batchBlockConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{const e=this.selectedFiles.map(e=>e.isFolder?Promise.resolve({ok:!1}):(0,E.A)(`/api/manage/block/${e.name}`,{method:"GET"}));Promise.all(e).then(e=>{e.forEach((e,t)=>{if(e.ok){const e=this.tableData.findIndex(e=>e.name===this.selectedFiles[t].name);-1!==e&&(this.tableData[e].metadata.ListType="Block")}}),this.$message.success(this.$t("dashboard.batchBlockSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.batchBlockFailed")))}).catch(()=>console.log("Batch block cancelled"))},handleBatchWhite(){this.$confirm(this.$t("dashboard.batchWhiteConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{const e=this.selectedFiles.map(e=>e.isFolder?Promise.resolve({ok:!1}):(0,E.A)(`/api/manage/white/${e.name}`,{method:"GET"}));Promise.all(e).then(e=>{e.forEach((e,t)=>{if(e.ok){const e=this.tableData.findIndex(e=>e.name===this.selectedFiles[t].name);-1!==e&&(this.tableData[e].metadata.ListType="White")}}),this.$message.success(this.$t("dashboard.batchWhiteSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.batchWhiteFailed")))}).catch(()=>console.log("Batch white cancelled"))},handleBatchDownload(){const e=new(Qi()),t=e.folder("files"),a={},i=this.selectedFiles.map(async e=>{if(e.isFolder)return;const i=await fetch(this.getFileLink(e.name)),n=await i.blob();let s=e.metadata?.FileName||e.name;if(a[s]){const t=s.substring(s.lastIndexOf(".")),i=s.substring(0,s.lastIndexOf("."));s=`${i}(${a[s]})${t}`,a[e.name]++}else a[s]=1;t.file(s,n)});Promise.all(i).then(()=>e.generateAsync({type:"blob"})).then(e=>{const t=document.createElement("a");t.href=URL.createObjectURL(e),t.download="files.zip",t.click()})},isVideo(e){if(this.isAudio(e))return!1;let t=e.metadata?.FileType?.includes("video");if(!t){const a=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","rmvb","3gp","mpg","mpeg","m4v","f4v","rm","asf","dat","ts","vob","swf","divx","xvid","m2ts","mts","m2v","3g2","3gp2","3gpp","3gpp2","mpe","m1v","mpv","mpv2","mp2v","m2t","m2ts","m2v","m4v"],i=e.name.substring(e.name.lastIndexOf(".")+1).toLowerCase();t=a.includes(i)}return t},isAudio(e){let t=e.metadata?.FileType?.includes("audio");if(!t){const a=["mp3","wav","flac","aac","ogg","wma","m4a","ape","aiff","alac","opus","mid","midi","m4b","m4p","m4r","amr","au","ra","ram"],i=e.name.substring(e.name.lastIndexOf(".")+1).toLowerCase();t=a.includes(i)}return t},isImage(e){let t=e.metadata?.FileType?.includes("image");if(!t){const a=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","psd","ai","eps","raw","cr2","nef","orf","sr2","dng","arw","rw2","raf","pef","x3f","srf","erf","mrw","nrw","kdc","dcr","mef","mos","crw","raf","rwl","srw","3fr","fff","iiq","qtk","bay","k25","kdc","dcs","drf","dng","erf","kdc","mdc","mef","mos","mrw","nef","nrw","orf","pef","ptx","pxn","r3d","raf","raw","rwl","rw2","rwz","sr2","srf","x3f"],i=e.name.substring(e.name.lastIndexOf(".")+1).toLowerCase();t=a.includes(i)}return t},getFileLink(e){const t=`/file/${e}?from=admin`;return t},handlePageChange(e){this.currentPage=e,this.currentPage===Math.ceil(this.tableData.length/this.pageSize)&&this.loadMoreData()},handleJumpPage(){const e=parseInt(this.jumpPage);isNaN(e)||e<1?this.$message.warning(this.$t("dashboard.invalidPageNumber")):e>this.realTotalPages?this.$message.warning(this.$t("dashboard.pageExceedsMax",{max:this.realTotalPages})):(e>this.totalPages?(this.$message.info(this.$t("dashboard.loadingData")),this.loadMoreDataUntilPage(e)):this.currentPage=e,this.jumpPage="")},async loadMoreDataUntilPage(e){this.loading=!0;try{const t=e*this.pageSize,a=this.filteredTableData.filter(e=>e.isFolder).length,i=this.filteredTableData.filter(e=>!e.isFolder).length,n=Math.max(0,t-a-i);n>0&&(await tn.loadMoreFiles(this.currentPath,this.searchKeywords,this.searchIncludeTags,this.searchExcludeTags,n,this.filters),await this.fetchFileList()),this.currentPage=Math.min(e,this.totalPages)}catch(t){this.$message.error(this.$t("dashboard.loadDataFailed"))}finally{this.loading=!1}},isFolder(e){if(e.isFolder)return!0;let t=e.name;if(t.startsWith("http")&&(t=t.split("/file/")[1]),t&&t.includes("/")){const e=this.currentPath?t.substring(this.currentPath.length):t;return""===this.currentPath?!t.split("/")[0].includes("."):e.includes("/")}return!1},getFolderName(e){let t="";if(e&&e.includes("/")){const a=e.split("/");if(""===this.currentPath)t=a[0];else{const a=e.substring(this.currentPath.length);t=a.split("/")[0]}}else t=e;const a=20;if(t.length>a){const e=Math.floor((a-3)/2),i=Math.ceil((a-3)/2);return`${t.substring(0,e)}...${t.substring(t.length-i)}`}return t},getFileName(e){let t=e.split("/").pop();const a=20;if(t.length>a){const e=Math.floor((a-3)/2),i=Math.ceil((a-3)/2);return`${t.substring(0,e)}...${t.substring(t.length-i)}`}return t},getFileNameStart(e){if(!e)return"";if(e.length<=30)return e;const t=e.lastIndexOf(".");if(t>0){const a=e.substring(0,t),i=Math.min(a.length,Math.floor(.6*e.length));return a.substring(0,i)}return e.substring(0,Math.floor(.6*e.length))},getFileNameEnd(e){if(!e)return"";if(e.length<=30)return"";const t=e.lastIndexOf(".");if(t>0){const a=e.substring(t),i=e.substring(0,t),n=Math.min(8,Math.floor(.2*i.length));return"…"+i.substring(i.length-n)+a}const a=Math.min(10,Math.floor(.3*e.length));return"…"+e.substring(e.length-a)},enterFolder(e){this.currentPath=e+(e.endsWith("/")?"":"/"),this.refreshFileList()},navigateToFolder(e){this.currentPath=e?e+(e.endsWith("/")?"":"/"):"",this.refreshFileList()},async fetchFileList(){this.loading=!0;try{const e=tn.getLocalFileList(),t=new Set(e.directories||[]),a=e.files||[],i=Array.from(t).map(e=>({name:e,isFolder:!0,selected:!1,metadata:{FileName:e.split("/").pop()}})),n=a.map(e=>({name:e.name,isFolder:!1,selected:!1,metadata:e.metadata}));this.tableData=[...i,...n],this.updateStats(e.totalCount,!0),this.directFileCount=e.directFileCount||0,this.directFolderCount=e.directFolderCount||0}catch(e){console.error("Error fetching file list:",e),this.$message.error(this.$t("dashboard.fetchFileListFailed"))}finally{this.loading=!1}},async refreshFileList(){this.refreshLoading=!0,this.loading=!0;try{const e=await tn.refreshFileList(this.currentPath,this.searchKeywords,this.searchIncludeTags,this.searchExcludeTags,this.filters);if(!e)throw new Error("Refresh failed");await this.fetchFileList()}catch(e){!e.message?.includes("Unauthorized")&&this.$store.state.adminLoggedIn&&(console.error("Error refreshing file list:",e),this.$message.error(this.$t("dashboard.refreshFailed")))}finally{this.refreshLoading=!1,this.loading=!1}},async refreshLocalFileList(){this.refreshLoading=!0,this.loading=!0;try{await this.fetchFileList()}catch(e){console.error("Error refreshing local file list:",e),this.$message.error(this.$t("dashboard.refreshFailed"))}finally{this.refreshLoading=!1,this.loading=!1}},handleTagManagement(e){this.currentTagFile=e,this.showTagDialog=!0},handleBatchTagManagement(){0!==this.selectedFiles.length?this.showBatchTagDialog=!0:this.$message.warning(this.$t("dashboard.selectFilesFirst"))},async handleTagsUpdated(e){const t=this.tableData.findIndex(e=>e.name===this.currentTagFile);-1!==t&&(this.tableData[t].metadata||(this.tableData[t].metadata={}),this.tableData[t].metadata.Tags=e,this.showdetailDialog&&this.detailFile?.name===this.currentTagFile&&(this.detailFile.metadata||(this.detailFile.metadata={}),this.detailFile.metadata.Tags=e))},async handleBatchTagsUpdated(){await this.refreshLocalFileList()},handleMetadataUpdated(e,t){const a=this.tableData.findIndex(t=>t.name===e);-1!==a&&(this.tableData[a].metadata={...this.tableData[a].metadata,...t}),this.detailFile&&this.detailFile.name===e&&(this.detailFile.metadata={...this.detailFile.metadata,...t})},handleFileRenamed(e,t,a){const i=this.tableData.findIndex(t=>t.name===e);-1!==i&&(this.tableData[i].name=t,this.tableData[i].metadata={...this.tableData[i].metadata,...a}),this.detailFile&&this.detailFile.name===e&&(this.detailFile.name=t,this.detailFile.metadata={...this.detailFile.metadata,...a},this.showdetailDialog=!1,this.$nextTick(()=>{this.showdetailDialog=!0}))},generateFileLink(e,t){const a="External"===t?.Channel,i=a?t?.ExternalLink:`${this.rootUrl}${e}`,n=t?.FileName||e;switch(this.defaultUrlFormat){case"originUrl":return i;case"mdUrl":return`![${n}](${i})`;case"htmlUrl":return`${n}`;case"bbUrl":return`[img]${i}[/img]`;case"tgId":return t?.TgFileId||"";case"s3Location":return t?.S3Location||"";default:return i}},async handleFolderCopy(e){const t=this.$loading({lock:!0,text:this.$t("dashboard.fetchingFileList")});try{const a=await(0,E.A)(`/api/manage/list?dir=${encodeURIComponent(e)}&recursive=true&count=-1`,{method:"GET"}),i=await a.json();if(t.close(),!i.files||0===i.files.length)return void this.$message.warning(this.$t("dashboard.folderEmptyNoLinks"));const n=i.files.map(e=>this.generateFileLink(e.name,e.metadata)).filter(e=>e);if(0===n.length)return void this.$message.warning(this.$t("dashboard.noLinksAvailable"));const s=n.join("\n");navigator.clipboard?(await navigator.clipboard.writeText(s),this.$message.success(this.$t("dashboard.copiedFileLinks",{count:n.length}))):(this.copyToClipboardFallback(s),this.$message.success(this.$t("dashboard.copiedFileLinks",{count:n.length})))}catch(a){t.close(),console.error("Copy folder links failed:",a),this.$message.error(this.$t("dashboard.copyFolderLinksFailed"))}}},mounted(){this.initializeBackground("adminBkImg",".container",!1,!0),this.loading=!0,this.showLogoutButton=this.$store.state.adminLoggedIn,this.refreshFileList().then(()=>this.extractChannelNames()).catch(e=>{"Unauthorized"!==e.message&&this.$message.error(this.$t("dashboard.syncDataError"))}).finally(()=>{this.loading=!1}),this.customUrlPrefix=this.adminUrlSettings.customUrlPrefix,this.useCustomUrl=this.adminUrlSettings.useCustomUrl;const e=localStorage.getItem("viewMode");"card"!==e&&"list"!==e||(this.viewMode=e)}};const cn=(0,I.A)(dn,[["render",Gi],["__scopeId","data-v-437b7a30"]]);var hn=cn},15616:function(e,t,a){"use strict";a(85331),a(97197)},33892:function(e,t,a){"use strict";a.d(t,{A:function(){return $}});var i=a(99114),n=(a(85331),a(30694),a(49385)),s=(a(37952),a(30650)),r=(a(19104),a(31802)),o=(a(13378),a(80047)),l=(a(99648),a(56768)),d=a(45130),c=a(24232);const h={class:"directory-tree-picker"},u={class:"tree-container"},f={key:0,class:"error-state"},m={class:"error-text"},p={class:"node-label"},g={class:"tree-container"},b={key:0,class:"error-state"},v={class:"error-text"},k={class:"node-label"};function y(e,t,a,y,_,w){const F=(0,l.g2)("font-awesome-icon"),C=o.S2,T=r.qk,$=s.Vc,L=n.pw,S=i.A;return(0,l.uX)(),(0,l.CE)("div",h,[w.isDesktop?((0,l.uX)(),(0,l.Wv)($,{key:0,visible:_.popoverVisible,"onUpdate:visible":t[1]||(t[1]=e=>_.popoverVisible=e),placement:"bottom-start",width:320,trigger:"click","popper-class":"directory-tree-popover","show-arrow":!0,"hide-after":0,"show-after":50,transition:"el-zoom-in-top"},{reference:(0,l.k6)(()=>[(0,l.Lk)("span",{class:"popover-trigger-wrapper",onClick:t[0]||(t[0]=(0,d.D$)(()=>{},["stop"]))},[(0,l.RG)(e.$slots,"trigger",{},void 0,!0)])]),default:(0,l.k6)(()=>[(0,l.bo)(((0,l.uX)(),(0,l.CE)("div",u,[_.error?((0,l.uX)(),(0,l.CE)("div",f,[(0,l.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,l.Lk)("span",m,(0,c.v_)(_.error),1),(0,l.bF)(C,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,l.k6)(()=>[(0,l.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,l.uX)(),(0,l.Wv)(T,{key:1,ref:"treeRef",data:_.treeData,props:_.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":a.currentDirectory,class:"directory-tree",onNodeClick:w.handleNodeClick},{default:(0,l.k6)(({node:e,data:t})=>[(0,l.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===a.currentDirectory}])},[(0,l.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,l.Lk)("span",p,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[S,_.loading]])]),_:3},8,["visible"])):((0,l.uX)(),(0,l.CE)(l.FK,{key:1},[(0,l.Lk)("span",{class:"drawer-trigger-wrapper",onClick:t[2]||(t[2]=(...e)=>w.openDrawer&&w.openDrawer(...e))},[(0,l.RG)(e.$slots,"trigger",{},void 0,!0)]),(0,l.bF)(L,{modelValue:_.drawerVisible,"onUpdate:modelValue":t[3]||(t[3]=e=>_.drawerVisible=e),direction:"btt",size:"60%","show-close":!0,"with-header":!0,"z-index":3e3,title:e.$t("directoryTree.selectDirectory"),class:"directory-tree-drawer"},{default:(0,l.k6)(()=>[(0,l.bo)(((0,l.uX)(),(0,l.CE)("div",g,[_.error?((0,l.uX)(),(0,l.CE)("div",b,[(0,l.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,l.Lk)("span",v,(0,c.v_)(_.error),1),(0,l.bF)(C,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,l.k6)(()=>[(0,l.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,l.uX)(),(0,l.Wv)(T,{key:1,ref:"treeRefMobile",data:_.treeData,props:_.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":a.currentDirectory,class:"directory-tree mobile-tree",onNodeClick:w.handleNodeClick},{default:(0,l.k6)(({node:e,data:t})=>[(0,l.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===a.currentDirectory}])},[(0,l.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,l.Lk)("span",k,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[S,_.loading]])]),_:1},8,["modelValue","title"])],64))])}var _=a(457),w=a(70797),F={name:"DirectoryTreePicker",props:{currentDirectory:{type:String,default:""},source:{type:String,default:"upload",validator:e=>["upload","admin"].includes(e)}},data(){return{popoverVisible:!1,drawerVisible:!1,treeData:[],loading:!1,error:"",treeProps:{children:"children",label:"name"},windowWidth:window.innerWidth}},computed:{isDesktop(){return this.windowWidth>=769}},watch:{popoverVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.popoverVisible&&this.$refs.treeRef){const e=this.$refs.treeRef.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},200)},drawerVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.drawerVisible&&this.$refs.treeRefMobile){const e=this.$refs.treeRefMobile.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},300)},currentDirectory(e){this.$nextTick(()=>{this.$refs.treeRef&&e&&this.$refs.treeRef.setCurrentKey(e),this.$refs.treeRefMobile&&e&&this.$refs.treeRefMobile.setCurrentKey(e)})}},mounted(){window.addEventListener("resize",this.handleResize)},beforeUnmount(){window.removeEventListener("resize",this.handleResize)},methods:{handleResize(){this.windowWidth=window.innerWidth},openDrawer(){this.drawerVisible=!0},async fetchDirectoryTree(){this.loading=!0,this.error="";try{let e;if("admin"===this.source){const t=await(0,w.A)("/api/directoryTree",{method:"GET"});if(!t.ok)return void(401===t.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.serverError"));e=await t.json()}else{const t=await _.A.get("/api/directoryTree",{withAuthCode:!0});e=t.data}e.tree?this.treeData=[e.tree]:this.treeData=[]}catch(e){console.error("Failed to fetch directory tree:",e),401===e.response?.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.loadFailed")}finally{this.loading=!1}},handleNodeClick(e){let t=e.path;t&&!t.startsWith("/")?t="/"+t:t||(t="/"),this.$emit("select",t),this.popoverVisible=!1,this.drawerVisible=!1}}},C=a(71241);const T=(0,C.A)(F,[["render",y],["__scopeId","data-v-62eab69a"]]);var $=T},34396:function(e,t,a){"use strict";a(85331),a(4885)},34896:function(e,t,a){"use strict";a(85331)},37952:function(e,t,a){"use strict";a(85331),a(97197)},44813:function(e,t,a){a(44114),a(16573),a(78100),a(77936),a(18111),a(22489),a(7588),a(79577),a(41549),a(49797),a(49631),a(35623),a(59848),function(t){e.exports=t()}(function(){return function e(t,a,i){function n(r,o){if(!a[r]){if(!t[r]){var l=void 0;if(!o&&l)return require(r,!0);if(s)return s(r,!0);var d=new Error("Cannot find module '"+r+"'");throw d.code="MODULE_NOT_FOUND",d}var c=a[r]={exports:{}};t[r][0].call(c.exports,function(e){var a=t[r][1][e];return n(a||e)},c,c.exports,e,t,a,i)}return a[r].exports}for(var s=void 0,r=0;r>2,o=(3&t)<<4|a>>4,l=1>6:64,d=2>4,a=(15&r)<<4|(o=s.indexOf(e.charAt(d++)))>>2,i=(3&o)<<6|(l=s.indexOf(e.charAt(d++))),u[c++]=t,64!==o&&(u[c++]=a),64!==l&&(u[c++]=i);return u}},{"./support":30,"./utils":32}],2:[function(e,t,a){"use strict";var i=e("./external"),n=e("./stream/DataWorker"),s=e("./stream/Crc32Probe"),r=e("./stream/DataLengthProbe");function o(e,t,a,i,n){this.compressedSize=e,this.uncompressedSize=t,this.crc32=a,this.compression=i,this.compressedContent=n}o.prototype={getContentWorker:function(){var e=new n(i.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new r("data_length")),t=this;return e.on("end",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),e},getCompressedWorker:function(){return new n(i.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},o.createWorkerFrom=function(e,t,a){return e.pipe(new s).pipe(new r("uncompressedSize")).pipe(t.compressWorker(a)).pipe(new r("compressedSize")).withStreamInfo("compression",t)},t.exports=o},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(e,t,a){"use strict";var i=e("./stream/GenericWorker");a.STORE={magic:"\0\0",compressWorker:function(){return new i("STORE compression")},uncompressWorker:function(){return new i("STORE decompression")}},a.DEFLATE=e("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(e,t,a){"use strict";var i=e("./utils"),n=function(){for(var e,t=[],a=0;a<256;a++){e=a;for(var i=0;i<8;i++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?"string"!==i.getTypeOf(e)?function(e,t,a,i){var s=n,r=i+a;e^=-1;for(var o=i;o>>8^s[255&(e^t[o])];return-1^e}(0|t,e,e.length,0):function(e,t,a,i){var s=n,r=i+a;e^=-1;for(var o=i;o>>8^s[255&(e^t.charCodeAt(o))];return-1^e}(0|t,e,e.length,0):0}},{"./utils":32}],5:[function(e,t,a){"use strict";a.base64=!1,a.binary=!1,a.dir=!1,a.createFolders=!0,a.date=null,a.compression=null,a.compressionOptions=null,a.comment=null,a.unixPermissions=null,a.dosPermissions=null},{}],6:[function(e,t,a){"use strict";var i=null;i="undefined"!=typeof Promise?Promise:e("lie"),t.exports={Promise:i}},{lie:37}],7:[function(e,t,a){"use strict";var i="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,n=e("pako"),s=e("./utils"),r=e("./stream/GenericWorker"),o=i?"uint8array":"array";function l(e,t){r.call(this,"FlateWorker/"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}a.magic="\b\0",s.inherits(l,r),l.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},l.prototype.flush=function(){r.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},l.prototype.cleanUp=function(){r.prototype.cleanUp.call(this),this._pako=null},l.prototype._createPako=function(){this._pako=new n[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var e=this;this._pako.onData=function(t){e.push({data:t,meta:e.meta})}},a.compressWorker=function(e){return new l("Deflate",e)},a.uncompressWorker=function(){return new l("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(e,t,a){"use strict";function i(e,t){var a,i="";for(a=0;a>>=8;return i}function n(e,t,a,n,r,c){var h,u,f=e.file,m=e.compression,p=c!==o.utf8encode,g=s.transformTo("string",c(f.name)),b=s.transformTo("string",o.utf8encode(f.name)),v=f.comment,k=s.transformTo("string",c(v)),y=s.transformTo("string",o.utf8encode(v)),_=b.length!==f.name.length,w=y.length!==v.length,F="",C="",T="",$=f.dir,L=f.date,S={crc32:0,compressedSize:0,uncompressedSize:0};t&&!a||(S.crc32=e.crc32,S.compressedSize=e.compressedSize,S.uncompressedSize=e.uncompressedSize);var x=0;t&&(x|=8),p||!_&&!w||(x|=2048);var D=0,E=0;$&&(D|=16),"UNIX"===r?(E=798,D|=function(e,t){var a=e;return e||(a=t?16893:33204),(65535&a)<<16}(f.unixPermissions,$)):(E=20,D|=function(e){return 63&(e||0)}(f.dosPermissions)),h=L.getUTCHours(),h<<=6,h|=L.getUTCMinutes(),h<<=5,h|=L.getUTCSeconds()/2,u=L.getUTCFullYear()-1980,u<<=4,u|=L.getUTCMonth()+1,u<<=5,u|=L.getUTCDate(),_&&(C=i(1,1)+i(l(g),4)+b,F+="up"+i(C.length,2)+C),w&&(T=i(1,1)+i(l(k),4)+y,F+="uc"+i(T.length,2)+T);var A="";return A+="\n\0",A+=i(x,2),A+=m.magic,A+=i(h,2),A+=i(u,2),A+=i(S.crc32,4),A+=i(S.compressedSize,4),A+=i(S.uncompressedSize,4),A+=i(g.length,2),A+=i(F.length,2),{fileRecord:d.LOCAL_FILE_HEADER+A+g+F,dirRecord:d.CENTRAL_FILE_HEADER+i(E,2)+A+i(k.length,2)+"\0\0\0\0"+i(D,4)+i(n,4)+g+F+k}}var s=e("../utils"),r=e("../stream/GenericWorker"),o=e("../utf8"),l=e("../crc32"),d=e("../signature");function c(e,t,a,i){r.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=a,this.encodeFileName=i,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}s.inherits(c,r),c.prototype.push=function(e){var t=e.meta.percent||0,a=this.entriesCount,i=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,r.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:a?(t+100*(a-i-1))/a:100}}))},c.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var a=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:a.fileRecord,meta:{percent:0}})}else this.accumulate=!0},c.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,a=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(a.dirRecord),t)this.push({data:function(e){return d.DATA_DESCRIPTOR+i(e.crc32,4)+i(e.compressedSize,4)+i(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:a.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},c.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)a=(a<<8)+this.byteAt(t);return this.index+=e,a},readString:function(e){return i.transformTo("string",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=n},{"../utils":32}],19:[function(e,t,a){"use strict";var i=e("./Uint8ArrayReader");function n(e){i.call(this,e)}e("../utils").inherits(n,i),n.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=n},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(e,t,a){"use strict";var i=e("./DataReader");function n(e){i.call(this,e)}e("../utils").inherits(n,i),n.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},n.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},n.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},n.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=n},{"../utils":32,"./DataReader":18}],21:[function(e,t,a){"use strict";var i=e("./ArrayReader");function n(e){i.call(this,e)}e("../utils").inherits(n,i),n.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=n},{"../utils":32,"./ArrayReader":17}],22:[function(e,t,a){"use strict";var i=e("../utils"),n=e("../support"),s=e("./ArrayReader"),r=e("./StringReader"),o=e("./NodeBufferReader"),l=e("./Uint8ArrayReader");t.exports=function(e){var t=i.getTypeOf(e);return i.checkSupport(t),"string"!==t||n.uint8array?"nodebuffer"===t?new o(e):n.uint8array?new l(i.transformTo("uint8array",e)):new s(i.transformTo("array",e)):new r(e)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(e,t,a){"use strict";a.LOCAL_FILE_HEADER="PK",a.CENTRAL_FILE_HEADER="PK",a.CENTRAL_DIRECTORY_END="PK",a.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",a.ZIP64_CENTRAL_DIRECTORY_END="PK",a.DATA_DESCRIPTOR="PK\b"},{}],24:[function(e,t,a){"use strict";var i=e("./GenericWorker"),n=e("../utils");function s(e){i.call(this,"ConvertWorker to "+e),this.destType=e}n.inherits(s,i),s.prototype.processChunk=function(e){this.push({data:n.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{"../utils":32,"./GenericWorker":28}],25:[function(e,t,a){"use strict";var i=e("./GenericWorker"),n=e("../crc32");function s(){i.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}e("../utils").inherits(s,i),s.prototype.processChunk=function(e){this.streamInfo.crc32=n(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(e,t,a){"use strict";var i=e("../utils"),n=e("./GenericWorker");function s(e){n.call(this,"DataLengthProbe for "+e),this.propName=e,this.withStreamInfo(e,0)}i.inherits(s,n),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}n.prototype.processChunk.call(this,e)},t.exports=s},{"../utils":32,"./GenericWorker":28}],27:[function(e,t,a){"use strict";var i=e("../utils"),n=e("./GenericWorker");function s(e){n.call(this,"DataWorker");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=i.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}i.inherits(s,n),s.prototype.cleanUp=function(){n.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!n.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,i.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(i.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":e=this.data.substring(this.index,t);break;case"uint8array":e=this.data.subarray(this.index,t);break;case"array":case"nodebuffer":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{"../utils":32,"./GenericWorker":28}],28:[function(e,t,a){"use strict";function i(e){this.name=e||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}i.prototype={push:function(e){this.emit("data",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit("error",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit("error",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var a=0;a "+e:e}},t.exports=i},{}],29:[function(e,t,a){"use strict";var i=e("../utils"),n=e("./ConvertWorker"),s=e("./GenericWorker"),r=e("../base64"),o=e("../support"),l=e("../external"),d=null;if(o.nodestream)try{d=e("../nodejs/NodejsStreamOutputAdapter")}catch(e){}function c(e,t){return new l.Promise(function(a,n){var s=[],o=e._internalType,l=e._outputType,d=e._mimeType;e.on("data",function(e,a){s.push(e),t&&t(a)}).on("error",function(e){s=[],n(e)}).on("end",function(){try{var e=function(e,t,a){switch(e){case"blob":return i.newBlob(i.transformTo("arraybuffer",t),a);case"base64":return r.encode(t);default:return i.transformTo(e,t)}}(l,function(e,t){var a,i=0,n=null,s=0;for(a=0;a>>6:(a<65536?t[r++]=224|a>>>12:(t[r++]=240|a>>>18,t[r++]=128|a>>>12&63),t[r++]=128|a>>>6&63),t[r++]=128|63&a);return t}(e)},a.utf8decode=function(e){return n.nodebuffer?i.transformTo("nodebuffer",e).toString("utf-8"):function(e){var t,a,n,s,r=e.length,l=new Array(2*r);for(t=a=0;t>10&1023,l[a++]=56320|1023&n)}return l.length!==a&&(l.subarray?l=l.subarray(0,a):l.length=a),i.applyFromCharCode(l)}(e=i.transformTo(n.uint8array?"uint8array":"array",e))},i.inherits(d,r),d.prototype.processChunk=function(e){var t=i.transformTo(n.uint8array?"uint8array":"array",e.data);if(this.leftOver&&this.leftOver.length){if(n.uint8array){var s=t;(t=new Uint8Array(s.length+this.leftOver.length)).set(this.leftOver,0),t.set(s,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var r=function(e,t){var a;for((t=t||e.length)>e.length&&(t=e.length),a=t-1;0<=a&&128==(192&e[a]);)a--;return a<0||0===a?t:a+o[e[a]]>t?a:t}(t),l=t;r!==t.length&&(n.uint8array?(l=t.subarray(0,r),this.leftOver=t.subarray(r,t.length)):(l=t.slice(0,r),this.leftOver=t.slice(r,t.length))),this.push({data:a.utf8decode(l),meta:e.meta})},d.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:a.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},a.Utf8DecodeWorker=d,i.inherits(c,r),c.prototype.processChunk=function(e){this.push({data:a.utf8encode(e.data),meta:e.meta})},a.Utf8EncodeWorker=c},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(e,t,a){"use strict";var i=e("./support"),n=e("./base64"),s=e("./nodejsUtils"),r=e("./external");function o(e){return e}function l(e,t){for(var a=0;a>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=i(this.extraFields[1].value);this.uncompressedSize===n.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===n.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===n.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===n.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,a,i,n=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(a<65536?t[r++]=224|a>>>12:(t[r++]=240|a>>>18,t[r++]=128|a>>>12&63),t[r++]=128|a>>>6&63),t[r++]=128|63&a);return t},a.buf2binstring=function(e){return l(e,e.length)},a.binstring2buf=function(e){for(var t=new i.Buf8(e.length),a=0,n=t.length;a>10&1023,d[i++]=56320|1023&n)}return l(d,i)},a.utf8border=function(e,t){var a;for((t=t||e.length)>e.length&&(t=e.length),a=t-1;0<=a&&128==(192&e[a]);)a--;return a<0||0===a?t:a+r[e[a]]>t?a:t}},{"./common":41}],43:[function(e,t,a){"use strict";t.exports=function(e,t,a,i){for(var n=65535&e,s=e>>>16&65535,r=0;0!==a;){for(a-=r=2e3>>1:e>>>1;t[a]=e}return t}();t.exports=function(e,t,a,n){var s=i,r=n+a;e^=-1;for(var o=n;o>>8^s[255&(e^t[o])];return-1^e}},{}],46:[function(e,t,a){"use strict";var i,n=e("../utils/common"),s=e("./trees"),r=e("./adler32"),o=e("./crc32"),l=e("./messages"),d=0,c=4,h=0,u=-2,f=-1,m=4,p=2,g=8,b=9,v=286,k=30,y=19,_=2*v+1,w=15,F=3,C=258,T=C+F+1,$=42,L=113,S=1,x=2,D=3,E=4;function A(e,t){return e.msg=l[t],t}function I(e){return(e<<1)-(4e.avail_out&&(a=e.avail_out),0!==a&&(n.arraySet(e.output,t.pending_buf,t.pending_out,a,e.next_out),e.next_out+=a,t.pending_out+=a,e.total_out+=a,e.avail_out-=a,t.pending-=a,0===t.pending&&(t.pending_out=0))}function B(e,t){s._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,z(e.strm)}function W(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function R(e,t){var a,i,n=e.max_chain_length,s=e.strstart,r=e.prev_length,o=e.nice_match,l=e.strstart>e.w_size-T?e.strstart-(e.w_size-T):0,d=e.window,c=e.w_mask,h=e.prev,u=e.strstart+C,f=d[s+r-1],m=d[s+r];e.prev_length>=e.good_match&&(n>>=2),o>e.lookahead&&(o=e.lookahead);do{if(d[(a=t)+r]===m&&d[a+r-1]===f&&d[a]===d[s]&&d[++a]===d[s+1]){s+=2,a++;do{}while(d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&sl&&0!=--n);return r<=e.lookahead?r:e.lookahead}function O(e){var t,a,i,s,l,d,c,h,u,f,m=e.w_size;do{if(s=e.window_size-e.lookahead-e.strstart,e.strstart>=m+(m-T)){for(n.arraySet(e.window,e.window,m,m,0),e.match_start-=m,e.strstart-=m,e.block_start-=m,t=a=e.hash_size;i=e.head[--t],e.head[t]=m<=i?i-m:0,--a;);for(t=a=m;i=e.prev[--t],e.prev[t]=m<=i?i-m:0,--a;);s+=m}if(0===e.strm.avail_in)break;if(d=e.strm,c=e.window,h=e.strstart+e.lookahead,u=s,f=void 0,f=d.avail_in,u=F)for(l=e.strstart-e.insert,e.ins_h=e.window[l],e.ins_h=(e.ins_h<=F&&(e.ins_h=(e.ins_h<=F)if(i=s._tr_tally(e,e.strstart-e.match_start,e.match_length-F),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=F){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=F&&(e.ins_h=(e.ins_h<=F&&e.match_length<=e.prev_length){for(n=e.strstart+e.lookahead-F,i=s._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-F),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=n&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(a=e.pending_buf_size-5);;){if(e.lookahead<=1){if(O(e),0===e.lookahead&&t===d)return S;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var i=e.block_start+a;if((0===e.strstart||e.strstart>=i)&&(e.lookahead=e.strstart-i,e.strstart=i,B(e,!1),0===e.strm.avail_out))return S;if(e.strstart-e.block_start>=e.w_size-T&&(B(e,!1),0===e.strm.avail_out))return S}return e.insert=0,t===c?(B(e,!0),0===e.strm.avail_out?D:E):(e.strstart>e.block_start&&(B(e,!1),e.strm.avail_out),S)}),new V(4,4,8,4,N),new V(4,5,16,8,N),new V(4,6,32,32,N),new V(4,4,16,16,M),new V(8,16,32,32,M),new V(8,16,128,128,M),new V(8,32,128,256,M),new V(32,128,258,1024,M),new V(32,258,258,4096,M)],a.deflateInit=function(e,t){return Z(e,t,g,15,8,0)},a.deflateInit2=Z,a.deflateReset=K,a.deflateResetKeep=j,a.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?u:(e.state.gzhead=t,h):u},a.deflate=function(e,t){var a,n,r,l;if(!e||!e.state||5>8&255),W(n,n.gzhead.time>>16&255),W(n,n.gzhead.time>>24&255),W(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),W(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(W(n,255&n.gzhead.extra.length),W(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=o(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(W(n,0),W(n,0),W(n,0),W(n,0),W(n,0),W(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),W(n,3),n.status=L);else{var f=g+(n.w_bits-8<<4)<<8;f|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(f|=32),f+=31-f%31,n.status=L,P(n,f),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(r=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>r&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),z(e),r=n.pending,n.pending!==n.pending_buf_size));)W(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>r&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){r=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>r&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),z(e),r=n.pending,n.pending===n.pending_buf_size)){l=1;break}l=n.gzindexr&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),0===l&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){r=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>r&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),z(e),r=n.pending,n.pending===n.pending_buf_size)){l=1;break}l=n.gzindexr&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),0===l&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&z(e),n.pending+2<=n.pending_buf_size&&(W(n,255&e.adler),W(n,e.adler>>8&255),e.adler=0,n.status=L)):n.status=L),0!==n.pending){if(z(e),0===e.avail_out)return n.last_flush=-1,h}else if(0===e.avail_in&&I(t)<=I(a)&&t!==c)return A(e,-5);if(666===n.status&&0!==e.avail_in)return A(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==d&&666!==n.status){var m=2===n.strategy?function(e,t){for(var a;;){if(0===e.lookahead&&(O(e),0===e.lookahead)){if(t===d)return S;break}if(e.match_length=0,a=s._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,a&&(B(e,!1),0===e.strm.avail_out))return S}return e.insert=0,t===c?(B(e,!0),0===e.strm.avail_out?D:E):e.last_lit&&(B(e,!1),0===e.strm.avail_out)?S:x}(n,t):3===n.strategy?function(e,t){for(var a,i,n,r,o=e.window;;){if(e.lookahead<=C){if(O(e),e.lookahead<=C&&t===d)return S;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=F&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=F?(a=s._tr_tally(e,1,e.match_length-F),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(a=s._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),a&&(B(e,!1),0===e.strm.avail_out))return S}return e.insert=0,t===c?(B(e,!0),0===e.strm.avail_out?D:E):e.last_lit&&(B(e,!1),0===e.strm.avail_out)?S:x}(n,t):i[n.level].func(n,t);if(m!==D&&m!==E||(n.status=666),m===S||m===D)return 0===e.avail_out&&(n.last_flush=-1),h;if(m===x&&(1===t?s._tr_align(n):5!==t&&(s._tr_stored_block(n,0,0,!1),3===t&&(U(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),z(e),0===e.avail_out))return n.last_flush=-1,h}return t!==c?h:n.wrap<=0?1:(2===n.wrap?(W(n,255&e.adler),W(n,e.adler>>8&255),W(n,e.adler>>16&255),W(n,e.adler>>24&255),W(n,255&e.total_in),W(n,e.total_in>>8&255),W(n,e.total_in>>16&255),W(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),z(e),0=a.w_size&&(0===o&&(U(a.head),a.strstart=0,a.block_start=0,a.insert=0),f=new n.Buf8(a.w_size),n.arraySet(f,t,m-a.w_size,a.w_size,0),t=f,m=a.w_size),l=e.avail_in,d=e.next_in,c=e.input,e.avail_in=m,e.next_in=0,e.input=t,O(a);a.lookahead>=F;){for(i=a.strstart,s=a.lookahead-(F-1);a.ins_h=(a.ins_h<>>=y=k>>>24,m-=y,0===(y=k>>>16&255))$[s++]=65535&k;else{if(!(16&y)){if(0==(64&y)){k=p[(65535&k)+(f&(1<>>=y,m-=y),m<15&&(f+=T[i++]<>>=y=k>>>24,m-=y,!(16&(y=k>>>16&255))){if(0==(64&y)){k=g[(65535&k)+(f&(1<>>=y,m-=y,(y=s-r)>3,f&=(1<<(m-=_<<3))-1,e.next_in=i,e.next_out=s,e.avail_in=i>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function g(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new i.Buf16(320),this.work=new i.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function b(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=u,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new i.Buf32(f),t.distcode=t.distdyn=new i.Buf32(m),t.sane=1,t.back=-1,c):h}function v(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,b(e)):h}function k(e,t){var a,i;return e&&e.state?(i=e.state,t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=r.wsize?(i.arraySet(r.window,t,a-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):(n<(s=r.wsize-r.wnext)&&(s=n),i.arraySet(r.window,t,a-n,s,r.wnext),(n-=s)?(i.arraySet(r.window,t,a-n,n,0),r.wnext=n,r.whave=r.wsize):(r.wnext+=s,r.wnext===r.wsize&&(r.wnext=0),r.whave>>8&255,a.check=s(a.check,O,2,0),_=y=0,a.mode=2;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&y)<<8)+(y>>8))%31){e.msg="incorrect header check",a.mode=30;break}if(8!=(15&y)){e.msg="unknown compression method",a.mode=30;break}if(_-=4,z=8+(15&(y>>>=4)),0===a.wbits)a.wbits=z;else if(z>a.wbits){e.msg="invalid window size",a.mode=30;break}a.dmax=1<>8&1),512&a.flags&&(O[0]=255&y,O[1]=y>>>8&255,a.check=s(a.check,O,2,0)),_=y=0,a.mode=3;case 3:for(;_<32;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}a.head&&(a.head.time=y),512&a.flags&&(O[0]=255&y,O[1]=y>>>8&255,O[2]=y>>>16&255,O[3]=y>>>24&255,a.check=s(a.check,O,4,0)),_=y=0,a.mode=4;case 4:for(;_<16;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}a.head&&(a.head.xflags=255&y,a.head.os=y>>8),512&a.flags&&(O[0]=255&y,O[1]=y>>>8&255,a.check=s(a.check,O,2,0)),_=y=0,a.mode=5;case 5:if(1024&a.flags){for(;_<16;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}a.length=y,a.head&&(a.head.extra_len=y),512&a.flags&&(O[0]=255&y,O[1]=y>>>8&255,a.check=s(a.check,O,2,0)),_=y=0}else a.head&&(a.head.extra=null);a.mode=6;case 6:if(1024&a.flags&&(v<($=a.length)&&($=v),$&&(a.head&&(z=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Array(a.head.extra_len)),i.arraySet(a.head.extra,f,g,$,z)),512&a.flags&&(a.check=s(a.check,f,$,g)),v-=$,g+=$,a.length-=$),a.length))break e;a.length=0,a.mode=7;case 7:if(2048&a.flags){if(0===v)break e;for($=0;z=f[g+$++],a.head&&z&&a.length<65536&&(a.head.name+=String.fromCharCode(z)),z&&$>9&1,a.head.done=!0),e.adler=a.check=0,a.mode=12;break;case 10:for(;_<32;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}e.adler=a.check=p(y),_=y=0,a.mode=11;case 11:if(0===a.havedict)return e.next_out=b,e.avail_out=k,e.next_in=g,e.avail_in=v,a.hold=y,a.bits=_,2;e.adler=a.check=1,a.mode=12;case 12:if(5===t||6===t)break e;case 13:if(a.last){y>>>=7&_,_-=7&_,a.mode=27;break}for(;_<3;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}switch(a.last=1&y,_-=1,3&(y>>>=1)){case 0:a.mode=14;break;case 1:if(C(a),a.mode=20,6!==t)break;y>>>=2,_-=2;break e;case 2:a.mode=17;break;case 3:e.msg="invalid block type",a.mode=30}y>>>=2,_-=2;break;case 14:for(y>>>=7&_,_-=7&_;_<32;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if((65535&y)!=(y>>>16^65535)){e.msg="invalid stored block lengths",a.mode=30;break}if(a.length=65535&y,_=y=0,a.mode=15,6===t)break e;case 15:a.mode=16;case 16:if($=a.length){if(v<$&&($=v),k<$&&($=k),0===$)break e;i.arraySet(m,f,g,$,b),v-=$,g+=$,k-=$,b+=$,a.length-=$;break}a.mode=12;break;case 17:for(;_<14;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if(a.nlen=257+(31&y),y>>>=5,_-=5,a.ndist=1+(31&y),y>>>=5,_-=5,a.ncode=4+(15&y),y>>>=4,_-=4,286>>=3,_-=3}for(;a.have<19;)a.lens[N[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,W={bits:a.lenbits},B=o(0,a.lens,0,19,a.lencode,0,a.work,W),a.lenbits=W.bits,B){e.msg="invalid code lengths set",a.mode=30;break}a.have=0,a.mode=19;case 19:for(;a.have>>16&255,E=65535&R,!((x=R>>>24)<=_);){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if(E<16)y>>>=x,_-=x,a.lens[a.have++]=E;else{if(16===E){for(P=x+2;_>>=x,_-=x,0===a.have){e.msg="invalid bit length repeat",a.mode=30;break}z=a.lens[a.have-1],$=3+(3&y),y>>>=2,_-=2}else if(17===E){for(P=x+3;_>>=x)),y>>>=3,_-=3}else{for(P=x+7;_>>=x)),y>>>=7,_-=7}if(a.have+$>a.nlen+a.ndist){e.msg="invalid bit length repeat",a.mode=30;break}for(;$--;)a.lens[a.have++]=z}}if(30===a.mode)break;if(0===a.lens[256]){e.msg="invalid code -- missing end-of-block",a.mode=30;break}if(a.lenbits=9,W={bits:a.lenbits},B=o(l,a.lens,0,a.nlen,a.lencode,0,a.work,W),a.lenbits=W.bits,B){e.msg="invalid literal/lengths set",a.mode=30;break}if(a.distbits=6,a.distcode=a.distdyn,W={bits:a.distbits},B=o(d,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,W),a.distbits=W.bits,B){e.msg="invalid distances set",a.mode=30;break}if(a.mode=20,6===t)break e;case 20:a.mode=21;case 21:if(6<=v&&258<=k){e.next_out=b,e.avail_out=k,e.next_in=g,e.avail_in=v,a.hold=y,a.bits=_,r(e,F),b=e.next_out,m=e.output,k=e.avail_out,g=e.next_in,f=e.input,v=e.avail_in,y=a.hold,_=a.bits,12===a.mode&&(a.back=-1);break}for(a.back=0;D=(R=a.lencode[y&(1<>>16&255,E=65535&R,!((x=R>>>24)<=_);){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if(D&&0==(240&D)){for(A=x,I=D,U=E;D=(R=a.lencode[U+((y&(1<>A)])>>>16&255,E=65535&R,!(A+(x=R>>>24)<=_);){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}y>>>=A,_-=A,a.back+=A}if(y>>>=x,_-=x,a.back+=x,a.length=E,0===D){a.mode=26;break}if(32&D){a.back=-1,a.mode=12;break}if(64&D){e.msg="invalid literal/length code",a.mode=30;break}a.extra=15&D,a.mode=22;case 22:if(a.extra){for(P=a.extra;_>>=a.extra,_-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=23;case 23:for(;D=(R=a.distcode[y&(1<>>16&255,E=65535&R,!((x=R>>>24)<=_);){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if(0==(240&D)){for(A=x,I=D,U=E;D=(R=a.distcode[U+((y&(1<>A)])>>>16&255,E=65535&R,!(A+(x=R>>>24)<=_);){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}y>>>=A,_-=A,a.back+=A}if(y>>>=x,_-=x,a.back+=x,64&D){e.msg="invalid distance code",a.mode=30;break}a.offset=E,a.extra=15&D,a.mode=24;case 24:if(a.extra){for(P=a.extra;_>>=a.extra,_-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){e.msg="invalid distance too far back",a.mode=30;break}a.mode=25;case 25:if(0===k)break e;if($=F-k,a.offset>$){if(($=a.offset-$)>a.whave&&a.sane){e.msg="invalid distance too far back",a.mode=30;break}L=$>a.wnext?($-=a.wnext,a.wsize-$):a.wnext-$,$>a.length&&($=a.length),S=a.window}else S=m,L=b-a.offset,$=a.length;for(k<$&&($=k),k-=$,a.length-=$;m[b++]=S[L++],--$;);0===a.length&&(a.mode=21);break;case 26:if(0===k)break e;m[b++]=a.length,k--,a.mode=21;break;case 27:if(a.wrap){for(;_<32;){if(0===v)break e;v--,y|=f[g++]<<_,_+=8}if(F-=k,e.total_out+=F,a.total+=F,F&&(e.adler=a.check=a.flags?s(a.check,m,F,b-F):n(a.check,m,F,b-F)),F=k,(a.flags?y:p(y))!==a.check){e.msg="incorrect data check",a.mode=30;break}_=y=0}a.mode=28;case 28:if(a.wrap&&a.flags){for(;_<32;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if(y!==(4294967295&a.total)){e.msg="incorrect length check",a.mode=30;break}_=y=0}a.mode=29;case 29:B=1;break e;case 30:B=-3;break e;case 31:return-4;case 32:default:return h}return e.next_out=b,e.avail_out=k,e.next_in=g,e.avail_in=v,a.hold=y,a.bits=_,(a.wsize||F!==e.avail_out&&a.mode<30&&(a.mode<27||4!==t))&&T(e,e.output,e.next_out,F-e.avail_out)?(a.mode=31,-4):(w-=e.avail_in,F-=e.avail_out,e.total_in+=w,e.total_out+=F,a.total+=F,a.wrap&&F&&(e.adler=a.check=a.flags?s(a.check,m,F,e.next_out-F):n(a.check,m,F,e.next_out-F)),e.data_type=a.bits+(a.last?64:0)+(12===a.mode?128:0)+(20===a.mode||15===a.mode?256:0),(0==w&&0===F||4===t)&&B===c&&(B=-5),B)},a.inflateEnd=function(e){if(!e||!e.state)return h;var t=e.state;return t.window&&(t.window=null),e.state=null,c},a.inflateGetHeader=function(e,t){var a;return e&&e.state?0==(2&(a=e.state).wrap)?h:((a.head=t).done=!1,c):h},a.inflateSetDictionary=function(e,t){var a,i=t.length;return e&&e.state?0!==(a=e.state).wrap&&11!==a.mode?h:11===a.mode&&n(1,t,i,0)!==a.check?-3:T(e,t,i,i)?(a.mode=31,-4):(a.havedict=1,c):h},a.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":41,"./adler32":43,"./crc32":45,"./inffast":48,"./inftrees":50}],50:[function(e,t,a){"use strict";var i=e("../utils/common"),n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],s=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],r=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],o=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,a,l,d,c,h,u){var f,m,p,g,b,v,k,y,_,w=u.bits,F=0,C=0,T=0,$=0,L=0,S=0,x=0,D=0,E=0,A=0,I=null,U=0,z=new i.Buf16(16),B=new i.Buf16(16),W=null,P=0;for(F=0;F<=15;F++)z[F]=0;for(C=0;Cv?(y=W[P+h[C]],I[U+h[C]]):(y=96,0),f=1<>x)+(m-=f)]=k<<24|y<<16|_,0!==m;);for(f=1<>=1;if(0!==f?(A&=f-1,A+=f):A=0,C++,0==--z[F]){if(F===$)break;F=t[a+h[C]]}if(L>>7)]}function W(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,a){e.bi_valid>p-a?(e.bi_buf|=t<>p-e.bi_valid,e.bi_valid+=a-p):(e.bi_buf|=t<>>=1,a<<=1,0<--t;);return a>>>1}function N(e,t,a){var i,n,s=new Array(m+1),r=0;for(i=1;i<=m;i++)s[i]=r=r+a[i-1]<<1;for(n=0;n<=t;n++){var o=e[2*n+1];0!==o&&(e[2*n]=O(s[o]++,o))}}function M(e){var t;for(t=0;t>1;1<=a;a--)j(e,s,a);for(n=l;a=e.heap[1],e.heap[1]=e.heap[e.heap_len--],j(e,s,1),i=e.heap[1],e.heap[--e.heap_max]=a,e.heap[--e.heap_max]=i,s[2*n]=s[2*a]+s[2*i],e.depth[n]=(e.depth[a]>=e.depth[i]?e.depth[a]:e.depth[i])+1,s[2*a+1]=s[2*i+1]=n,e.heap[1]=n++,j(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var a,i,n,s,r,o,l=t.dyn_tree,d=t.max_code,c=t.stat_desc.static_tree,h=t.stat_desc.has_stree,u=t.stat_desc.extra_bits,p=t.stat_desc.extra_base,g=t.stat_desc.max_length,b=0;for(s=0;s<=m;s++)e.bl_count[s]=0;for(l[2*e.heap[e.heap_max]+1]=0,a=e.heap_max+1;a>=7;i>>=1)if(1&a&&0!==e.dyn_ltree[2*t])return n;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return s;for(t=32;t>>3,(o=e.static_len+3+7>>>3)<=r&&(r=o)):r=o=a+5,a+4<=r&&-1!==t?Q(e,t,a,i):4===e.strategy||o===r?(P(e,2+(i?1:0),3),K(e,T,$)):(P(e,4+(i?1:0),3),function(e,t,a,i){var n;for(P(e,t-257,5),P(e,a-1,5),P(e,i-4,4),n=0;n>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&a,e.last_lit++,0===t?e.dyn_ltree[2*a]++:(e.matches++,t--,e.dyn_ltree[2*(S[a]+d+1)]++,e.dyn_dtree[2*B(t)]++),e.last_lit===e.lit_bufsize-1},a._tr_align=function(e){P(e,2,3),R(e,b,T),function(e){16===e.bi_valid?(W(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{"../utils/common":41}],53:[function(e,t,a){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,i){(function(e){!function(e,t){"use strict";if(!e.setImmediate){var a,i,n,s,r=1,o={},l=!1,d=e.document,c=Object.getPrototypeOf&&Object.getPrototypeOf(e);c=c&&c.setTimeout?c:e,a="[object process]"==={}.toString.call(e.process)?function(e){process.nextTick(function(){u(e)})}:function(){if(e.postMessage&&!e.importScripts){var t=!0,a=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=a,t}}()?(s="setImmediate$"+Math.random()+"$",e.addEventListener?e.addEventListener("message",f,!1):e.attachEvent("onmessage",f),function(t){e.postMessage(s+t,"*")}):e.MessageChannel?((n=new MessageChannel).port1.onmessage=function(e){u(e.data)},function(e){n.port2.postMessage(e)}):d&&"onreadystatechange"in d.createElement("script")?(i=d.documentElement,function(e){var t=d.createElement("script");t.onreadystatechange=function(){u(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):function(e){setTimeout(u,0,e)},c.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),i=0;i\| \(\)\[\]\{\}#%\^`~;@&=\+\$,]/;return n.test(e)?{valid:!1,error:i.Ay.global.t("validation.invalidCharacters")}:{valid:!0}}},63003:function(e,t,a){"use strict";a(85331)},70415:function(e,t,a){"use strict";a(85331),a(73565)},72907:function(e,t,a){"use strict";a(85331),a(96808),a(29092)},73565:function(e,t,a){"use strict";a(85331)},79899:function(e,t,a){"use strict";a(85331)},95385:function(e,t,a){"use strict";a(85331)},98642:function(e,t,a){"use strict";a(85331)}}]); -//# sourceMappingURL=770.865557c0.js.map \ No newline at end of file diff --git a/frontend-dist/js/770.865557c0.js.gz b/frontend-dist/js/770.865557c0.js.gz deleted file mode 100644 index c77e890c7455c4a7fc2a5d8193ec1162100f983f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57686 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 diff --git a/frontend-dist/js/770.865557c0.js.map b/frontend-dist/js/770.865557c0.js.map deleted file mode 100644 index 85ec91b8..00000000 --- a/frontend-dist/js/770.865557c0.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/770.865557c0.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/dashboard/MoveFileDialog.vue?cb6d","webpack://sanyue_imghub/./src/components/dashboard/MoveFileDialog.vue","webpack://sanyue_imghub/./src/components/dashboard/MoveFileDialog.vue?cba1","webpack://sanyue_imghub/./src/components/dashboard/MobileDirectoryDrawer.vue?99b2","webpack://sanyue_imghub/./src/components/dashboard/MobileDirectoryDrawer.vue","webpack://sanyue_imghub/./src/components/dashboard/MobileDirectoryDrawer.vue?256e","webpack://sanyue_imghub/./src/components/dashboard/MobileActionSheet.vue?5420","webpack://sanyue_imghub/./src/components/dashboard/MobileActionSheet.vue","webpack://sanyue_imghub/./src/components/dashboard/MobileActionSheet.vue?f2e3","webpack://sanyue_imghub/./src/components/dashboard/BatchTagDialog.vue?ffce","webpack://sanyue_imghub/./src/components/dashboard/BatchTagDialog.vue","webpack://sanyue_imghub/./src/components/dashboard/BatchTagDialog.vue?9ca8","webpack://sanyue_imghub/./src/components/dashboard/TagManagementDialog.vue?e1c6","webpack://sanyue_imghub/./src/components/dashboard/TagManagementDialog.vue","webpack://sanyue_imghub/./src/components/dashboard/TagManagementDialog.vue?e3f8","webpack://sanyue_imghub/./src/components/dashboard/FileDetailDialog.vue?25b5","webpack://sanyue_imghub/./src/utils/fileIdValidator.js","webpack://sanyue_imghub/./src/components/dashboard/FileDetailDialog.vue","webpack://sanyue_imghub/./src/components/dashboard/FileDetailDialog.vue?8cda","webpack://sanyue_imghub/./src/components/dashboard/BatchActionBar.vue?0dfd","webpack://sanyue_imghub/./src/components/dashboard/BatchActionBar.vue","webpack://sanyue_imghub/./src/components/dashboard/BatchActionBar.vue?ed70","webpack://sanyue_imghub/./src/components/dashboard/FileListItem.vue?9d79","webpack://sanyue_imghub/./src/components/dashboard/FileListItem.vue","webpack://sanyue_imghub/./src/components/dashboard/FileListItem.vue?6ed7","webpack://sanyue_imghub/./src/components/dashboard/FileCard.vue?f89c","webpack://sanyue_imghub/./src/components/dashboard/FileCard.vue","webpack://sanyue_imghub/./src/components/dashboard/FileCard.vue?8969","webpack://sanyue_imghub/./src/components/dashboard/FolderCard.vue?1c31","webpack://sanyue_imghub/./src/components/dashboard/FolderCard.vue","webpack://sanyue_imghub/./src/components/dashboard/FolderCard.vue?a03e","webpack://sanyue_imghub/./src/components/dashboard/SkeletonLoader.vue?136f","webpack://sanyue_imghub/./src/components/dashboard/SkeletonLoader.vue","webpack://sanyue_imghub/./src/components/dashboard/SkeletonLoader.vue?4854","webpack://sanyue_imghub/./src/components/dashboard/FilterDropdown.vue?bd3a","webpack://sanyue_imghub/./src/components/dashboard/FilterDropdown.vue","webpack://sanyue_imghub/./src/components/dashboard/FilterDropdown.vue?09c8","webpack://sanyue_imghub/./src/views/AdminDashBoard.vue?0ec3","webpack://sanyue_imghub/./src/utils/fileManager.js","webpack://sanyue_imghub/./src/utils/dashboard/rectIntersects.js","webpack://sanyue_imghub/./src/utils/dashboard/useDragSelect.js","webpack://sanyue_imghub/./src/views/AdminDashBoard.vue","webpack://sanyue_imghub/./src/views/AdminDashBoard.vue?40d2","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?9e0f","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?6984","webpack://sanyue_imghub/./node_modules/jszip/dist/jszip.min.js","webpack://sanyue_imghub/./src/utils/pathValidator.js"],"sourcesContent":["import { toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, createElementVNode as _createElementVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"move-file-dialog-wrapper\"\n};\nconst _hoisted_2 = {\n class: \"move-dialog-content\"\n};\nconst _hoisted_3 = {\n class: \"move-path-input-container\"\n};\nconst _hoisted_4 = {\n class: \"move-dialog-hint\"\n};\nconst _hoisted_5 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_6 = {\n class: \"move-drawer-content\"\n};\nconst _hoisted_7 = {\n class: \"move-path-section\"\n};\nconst _hoisted_8 = {\n class: \"move-path-label\"\n};\nconst _hoisted_9 = {\n class: \"move-path-input-row\"\n};\nconst _hoisted_10 = {\n class: \"move-dialog-hint\"\n};\nconst _hoisted_11 = {\n key: 0,\n class: \"embedded-tree-section\"\n};\nconst _hoisted_12 = {\n class: \"tree-section-header\"\n};\nconst _hoisted_13 = {\n class: \"tree-section-title\"\n};\nconst _hoisted_14 = {\n class: \"tree-container\"\n};\nconst _hoisted_15 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_16 = {\n class: \"error-text\"\n};\nconst _hoisted_17 = {\n class: \"node-label\"\n};\nconst _hoisted_18 = {\n class: \"drawer-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_DirectoryTreePicker = _resolveComponent(\"DirectoryTreePicker\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_tree = _resolveComponent(\"el-tree\");\n const _component_el_drawer = _resolveComponent(\"el-drawer\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [$options.isDesktop ? (_openBlock(), _createBlock(_component_el_dialog, {\n key: 0,\n modelValue: $options.dialogVisible,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $options.dialogVisible = $event),\n title: $props.isBatchMove ? _ctx.$t('moveFile.batchTitle') : _ctx.$t('moveFile.title'),\n width: \"500px\",\n \"show-close\": true,\n class: \"move-dialog\",\n onClose: $options.handleClose\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_5, [_createVNode(_component_el_button, {\n onClick: $options.handleClose\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.cancel')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.loading,\n onClick: $options.handleConfirm\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.confirm')), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_input, {\n modelValue: $data.targetPath,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.targetPath = $event),\n placeholder: _ctx.$t('moveFile.targetPlaceholder'),\n class: \"move-path-input\"\n }, {\n prepend: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.targetDirectory')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"]), _createVNode(_component_DirectoryTreePicker, {\n \"current-directory\": $props.currentDirectory,\n source: \"admin\",\n onSelect: $options.handleDirectorySelect\n }, {\n trigger: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"directory-picker-trigger\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-tree\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"current-directory\", \"onSelect\"])]), _createElementVNode(\"p\", _hoisted_4, _toDisplayString(_ctx.$t('moveFile.hint')), 1)])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClose\"])) : (_openBlock(), _createBlock(_component_el_drawer, {\n key: 1,\n modelValue: $options.dialogVisible,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $options.dialogVisible = $event),\n title: $props.isBatchMove ? _ctx.$t('moveFile.batchTitle') : _ctx.$t('moveFile.title'),\n direction: \"btt\",\n size: \"auto\",\n \"show-close\": true,\n class: \"move-drawer\",\n onClose: $options.handleClose\n }, {\n footer: _withCtx(() => [_createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n onClick: $options.handleClose,\n class: \"footer-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.cancel')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.loading,\n onClick: $options.handleConfirm,\n class: \"footer-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.confirm')), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"div\", _hoisted_8, _toDisplayString(_ctx.$t('moveFile.targetDirectory')), 1), _createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_el_input, {\n modelValue: $data.targetPath,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.targetPath = $event),\n placeholder: _ctx.$t('moveFile.targetPlaceholder'),\n class: \"move-path-input\"\n }, null, 8, [\"modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n class: \"directory-picker-trigger\",\n onClick: _cache[3] || (_cache[3] = $event => $data.showTreePicker = true)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-tree\"\n })]),\n _: 1\n })]), _createElementVNode(\"p\", _hoisted_10, _toDisplayString(_ctx.$t('moveFile.hintMobile')), 1)]), $data.showTreePicker ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(_ctx.$t('moveFile.selectDirectory')), 1), _createVNode(_component_el_button, {\n text: \"\",\n onClick: _cache[4] || (_cache[4] = $event => $data.showTreePicker = false)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n })]),\n _: 1\n })]), _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_14, [$data.treeError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_15, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_16, _toDisplayString($data.treeError), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRef\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree\",\n onNodeClick: $options.handleTreeNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_17, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.treeLoading]])])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClose\"]))]);\n}","import DirectoryTreePicker from '@/components/DirectoryTreePicker.vue';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'MoveFileDialog',\n components: {\n DirectoryTreePicker\n },\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n currentDirectory: {\n type: String,\n default: ''\n },\n isBatchMove: {\n type: Boolean,\n default: false\n },\n initialPath: {\n type: String,\n default: '/'\n }\n },\n emits: ['update:modelValue', 'confirm', 'close'],\n data() {\n return {\n targetPath: '/',\n loading: false,\n windowWidth: window.innerWidth,\n // 移动端内嵌树相关\n showTreePicker: false,\n treeData: [],\n treeLoading: false,\n treeError: '',\n treeProps: {\n children: 'children',\n label: 'name'\n }\n };\n },\n computed: {\n dialogVisible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n isDesktop() {\n return this.windowWidth > 768;\n }\n },\n watch: {\n modelValue(newVal) {\n if (newVal) {\n this.targetPath = this.initialPath || '/';\n this.showTreePicker = false;\n }\n },\n showTreePicker(newVal) {\n if (newVal && !this.isDesktop) {\n this.fetchDirectoryTree();\n }\n }\n },\n mounted() {\n window.addEventListener('resize', this.handleResize);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.handleResize);\n },\n methods: {\n handleResize() {\n this.windowWidth = window.innerWidth;\n },\n handleDirectorySelect(path) {\n this.targetPath = path;\n },\n handleConfirm() {\n this.$emit('confirm', this.targetPath);\n },\n handleClose() {\n this.$emit('update:modelValue', false);\n this.$emit('close');\n },\n // 移动端内嵌树相关方法\n async fetchDirectoryTree() {\n this.treeLoading = true;\n this.treeError = '';\n try {\n const response = await fetchWithAuth('/api/directoryTree', {\n method: 'GET'\n });\n if (!response.ok) {\n if (response.status === 401) {\n this.treeError = this.$t('moveFile.authFailed');\n } else {\n this.treeError = this.$t('moveFile.serverError');\n }\n return;\n }\n const data = await response.json();\n if (data.tree) {\n this.treeData = [data.tree];\n } else {\n this.treeData = [];\n }\n } catch (err) {\n console.error('Failed to fetch directory tree:', err);\n this.treeError = this.$t('moveFile.loadTreeFailed');\n } finally {\n this.treeLoading = false;\n }\n },\n handleTreeNodeClick(data) {\n let path = data.path;\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n } else if (!path) {\n path = '/';\n }\n this.targetPath = path;\n this.showTreePicker = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./MoveFileDialog.vue?vue&type=template&id=7aaa437c&scoped=true\"\nimport script from \"./MoveFileDialog.vue?vue&type=script&lang=js\"\nexport * from \"./MoveFileDialog.vue?vue&type=script&lang=js\"\n\nimport \"./MoveFileDialog.vue?vue&type=style&index=0&id=7aaa437c&scoped=true&lang=css\"\nimport \"./MoveFileDialog.vue?vue&type=style&index=1&id=7aaa437c&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7aaa437c\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeStyle as _normalizeStyle, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, Transition as _Transition, withCtx as _withCtx, Teleport as _Teleport, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"mobile-drawer-header\"\n};\nconst _hoisted_2 = {\n class: \"mobile-drawer-title\"\n};\nconst _hoisted_3 = {\n class: \"mobile-drawer-content\"\n};\nconst _hoisted_4 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Teleport, {\n to: \"body\"\n }, [_createVNode(_Transition, {\n name: \"drawer-slide\"\n }, {\n default: _withCtx(() => [$props.modelValue ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"mobile-drawer-overlay\",\n onClick: _cache[3] || (_cache[3] = (...args) => $options.close && $options.close(...args))\n }, [_createElementVNode(\"div\", {\n class: \"mobile-drawer\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"span\", _hoisted_2, _toDisplayString(_ctx.$t('mobileDirectory.title')), 1), _createVNode(_component_font_awesome_icon, {\n icon: \"times\",\n class: \"mobile-drawer-close\",\n onClick: $options.close\n }, null, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"mobile-drawer-item\", {\n active: !$props.currentPath\n }]),\n onClick: _cache[0] || (_cache[0] = $event => $options.navigate(''))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"mobile-drawer-item-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileDirectory.rootDirectory')), 1)], 2), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.pathParts, (folder, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: _normalizeClass([\"mobile-drawer-item\", {\n active: index === $options.pathParts.length - 1\n }]),\n style: _normalizeStyle({\n paddingLeft: (index + 1) * 16 + 16 + 'px'\n }),\n onClick: $event => $options.navigate($options.pathParts.slice(0, index + 1).join('/'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"mobile-drawer-item-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(folder), 1)], 14, _hoisted_4);\n }), 128)), $props.currentPath ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"mobile-drawer-back\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.goBack && $options.goBack(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"mobile-drawer-item-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileDirectory.goBack')), 1)])) : _createCommentVNode(\"\", true)])])])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nexport default {\n name: 'MobileDirectoryDrawer',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n currentPath: {\n type: String,\n default: ''\n }\n },\n emits: ['update:modelValue', 'navigate', 'goBack'],\n computed: {\n pathParts() {\n return this.currentPath.split('/').filter(Boolean);\n }\n },\n methods: {\n close() {\n this.$emit('update:modelValue', false);\n },\n navigate(path) {\n this.$emit('navigate', path);\n this.close();\n },\n goBack() {\n this.$emit('goBack');\n this.close();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./MobileDirectoryDrawer.vue?vue&type=template&id=768efd1f&scoped=true\"\nimport script from \"./MobileDirectoryDrawer.vue?vue&type=script&lang=js\"\nexport * from \"./MobileDirectoryDrawer.vue?vue&type=script&lang=js\"\n\nimport \"./MobileDirectoryDrawer.vue?vue&type=style&index=0&id=768efd1f&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-768efd1f\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, Transition as _Transition, withCtx as _withCtx, Teleport as _Teleport, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"bottom-sheet-header\"\n};\nconst _hoisted_2 = {\n class: \"bottom-sheet-title\"\n};\nconst _hoisted_3 = {\n class: \"bottom-sheet-content\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Teleport, {\n to: \"body\"\n }, [_createVNode(_Transition, {\n name: \"bottom-sheet\"\n }, {\n default: _withCtx(() => [$props.modelValue ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"bottom-sheet-overlay\",\n onClick: _cache[9] || (_cache[9] = (...args) => $options.close && $options.close(...args))\n }, [_createElementVNode(\"div\", {\n class: \"bottom-sheet\",\n onClick: _cache[8] || (_cache[8] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"div\", _hoisted_1, [_cache[10] || (_cache[10] = _createElementVNode(\"div\", {\n class: \"bottom-sheet-handle\"\n }, null, -1)), _createElementVNode(\"span\", _hoisted_2, _toDisplayString($props.title), 1)]), _createElementVNode(\"div\", _hoisted_3, [!$props.isFolder ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[0] || (_cache[0] = $event => $options.handleAction('detail'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.viewDetail')), 1)]), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[1] || (_cache[1] = $event => $options.handleAction('copy'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.copyLink')), 1)]), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[2] || (_cache[2] = $event => $options.handleAction('download'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"download\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.downloadFile')), 1)]), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[3] || (_cache[3] = $event => $options.handleAction('move'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.moveFile')), 1)]), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[4] || (_cache[4] = $event => $options.handleAction('tag'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"tags\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.tagManagement')), 1)])], 64)) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[5] || (_cache[5] = $event => $options.handleAction('folderCopy'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.copyLink')), 1)]), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[6] || (_cache[6] = $event => $options.handleAction('move'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.moveFolder')), 1)])], 64)), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item bottom-sheet-danger\",\n onClick: _cache[7] || (_cache[7] = $event => $options.handleAction('delete'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString($props.isFolder ? _ctx.$t('mobileAction.deleteFolder') : _ctx.$t('mobileAction.deleteFile')), 1)])])])])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]);\n}","export default {\n name: 'MobileActionSheet',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n title: {\n type: String,\n default: ''\n },\n isFolder: {\n type: Boolean,\n default: false\n }\n },\n emits: ['update:modelValue', 'action'],\n methods: {\n close() {\n this.$emit('update:modelValue', false);\n },\n handleAction(action) {\n this.$emit('action', action);\n this.close();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./MobileActionSheet.vue?vue&type=template&id=62bb601c&scoped=true\"\nimport script from \"./MobileActionSheet.vue?vue&type=script&lang=js\"\nexport * from \"./MobileActionSheet.vue?vue&type=script&lang=js\"\n\nimport \"./MobileActionSheet.vue?vue&type=style&index=0&id=62bb601c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-62bb601c\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, withKeys as _withKeys, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"batch-tag-container\"\n};\nconst _hoisted_2 = {\n class: \"tab-content\"\n};\nconst _hoisted_3 = {\n class: \"tab-description\"\n};\nconst _hoisted_4 = {\n class: \"input-section\"\n};\nconst _hoisted_5 = {\n key: 0,\n class: \"suggestions-panel\"\n};\nconst _hoisted_6 = [\"onClick\"];\nconst _hoisted_7 = {\n class: \"tags-to-add-section\"\n};\nconst _hoisted_8 = {\n key: 0,\n class: \"tags-container\"\n};\nconst _hoisted_9 = {\n key: 1,\n class: \"empty-message\"\n};\nconst _hoisted_10 = {\n class: \"action-buttons\"\n};\nconst _hoisted_11 = {\n class: \"tab-content\"\n};\nconst _hoisted_12 = {\n class: \"tab-description\"\n};\nconst _hoisted_13 = {\n key: 0,\n class: \"common-tags-section\"\n};\nconst _hoisted_14 = {\n class: \"tags-container\"\n};\nconst _hoisted_15 = {\n key: 1,\n class: \"empty-message\"\n};\nconst _hoisted_16 = {\n class: \"tab-content\"\n};\nconst _hoisted_17 = {\n class: \"tab-description\"\n};\nconst _hoisted_18 = {\n class: \"action-buttons\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_tab_pane = _resolveComponent(\"el-tab-pane\");\n const _component_el_alert = _resolveComponent(\"el-alert\");\n const _component_el_tabs = _resolveComponent(\"el-tabs\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('batchTag.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $options.visible = $event),\n width: $options.dialogWidth,\n onClose: $options.handleClose\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [_createVNode(_component_el_tabs, {\n modelValue: $data.activeTab,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.activeTab = $event),\n type: \"border-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tab_pane, {\n label: _ctx.$t('batchTag.addTab'),\n name: \"add\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"p\", _hoisted_3, _toDisplayString(_ctx.$t('batchTag.addDescription', {\n count: $options.fileCount\n })), 1), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_input, {\n modelValue: $data.inputTag,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.inputTag = $event),\n placeholder: _ctx.$t('batchTag.inputPlaceholder'),\n onKeyup: _withKeys($options.handleAddInputTag, [\"enter\"]),\n onInput: $options.handleInputChange,\n clearable: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.handleAddInputTag,\n type: \"primary\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onKeyup\", \"onInput\"]), $data.showSuggestions && $data.suggestions.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.suggestions, tag => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: tag,\n class: \"suggestion-item\",\n onClick: $event => $options.selectSuggestion(tag)\n }, _toDisplayString(tag), 9, _hoisted_6);\n }), 128))])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"h4\", null, _toDisplayString(_ctx.$t('batchTag.pendingTags')), 1), $data.tagsToAdd.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.tagsToAdd, tag => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: tag,\n closable: \"\",\n onClose: $event => $options.removeFromToAdd(tag),\n class: \"tag-item\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(tag), 1)]),\n _: 2\n }, 1032, [\"onClose\"]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_9, _toDisplayString(_ctx.$t('batchTag.noPendingTags')), 1))]), _createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.executeAddTags,\n loading: $data.loading,\n disabled: $data.tagsToAdd.length === 0\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('batchTag.addToAllFiles')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"loading\", \"disabled\"])])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_tab_pane, {\n label: _ctx.$t('batchTag.removeTab'),\n name: \"remove\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"p\", _hoisted_12, _toDisplayString(_ctx.$t('batchTag.removeDescription')), 1), $data.commonTags.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_13, [_createElementVNode(\"h4\", null, _toDisplayString(_ctx.$t('batchTag.commonTags')), 1), _createElementVNode(\"div\", _hoisted_14, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.commonTags, tag => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: tag,\n closable: \"\",\n onClose: $event => $options.handleRemoveCommonTag(tag),\n class: \"tag-item\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(tag), 1)]),\n _: 2\n }, 1032, [\"onClose\"]);\n }), 128))])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_15, _toDisplayString(_ctx.$t('batchTag.noCommonTags')), 1))])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_tab_pane, {\n label: _ctx.$t('batchTag.clearTab'),\n name: \"clear\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_16, [_createElementVNode(\"p\", _hoisted_17, _toDisplayString(_ctx.$t('batchTag.clearDescription', {\n count: $options.fileCount\n })), 1), _createVNode(_component_el_alert, {\n title: _ctx.$t('batchTag.clearWarningTitle'),\n type: \"warning\",\n description: _ctx.$t('batchTag.clearWarningDesc'),\n closable: false,\n style: {\n \"margin-bottom\": \"20px\"\n },\n center: \"\"\n }, null, 8, [\"title\", \"description\"]), _createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $options.handleClearAllTags,\n loading: $data.loading\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('batchTag.confirmClearAll')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])])])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\", \"onClose\"]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport { ElMessage, ElMessageBox } from 'element-plus';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'BatchTagDialog',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n selectedFiles: {\n type: Array,\n required: true,\n default: () => []\n }\n },\n emits: ['update:modelValue', 'tagsUpdated'],\n data() {\n return {\n activeTab: 'add',\n inputTag: '',\n tagsToAdd: [],\n commonTags: [],\n suggestions: [],\n showSuggestions: false,\n loading: false,\n debounceTimer: null\n };\n },\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth < 768 ? '90%' : '600px';\n },\n selectedFilesOnly() {\n // 排除文件夹,只保留文件\n return this.selectedFiles.filter(file => !file.isFolder);\n },\n fileCount() {\n return this.selectedFilesOnly.length;\n },\n fileIds() {\n return this.selectedFilesOnly.map(file => file.name);\n }\n },\n watch: {\n visible(newVal) {\n if (newVal) {\n this.loadCommonTags();\n } else {\n this.resetData();\n }\n },\n activeTab(newTab) {\n if (newTab === 'remove') {\n this.loadCommonTags();\n }\n }\n },\n methods: {\n resetData() {\n this.tagsToAdd = [];\n this.inputTag = '';\n this.showSuggestions = false;\n this.activeTab = 'add';\n },\n async loadCommonTags() {\n if (this.selectedFilesOnly.length === 0) {\n this.commonTags = [];\n return;\n }\n try {\n // 获取所有文件的标签\n const tagPromises = this.selectedFilesOnly.map(file => fetchWithAuth(`/api/manage/tags/${encodeURIComponent(file.name)}`, {\n method: 'GET'\n }));\n const responses = await Promise.all(tagPromises);\n const allTags = [];\n for (const response of responses) {\n if (response.ok) {\n const data = await response.json();\n allTags.push(data.tags || []);\n }\n }\n\n // 找出共有标签\n if (allTags.length > 0) {\n this.commonTags = allTags[0].filter(tag => allTags.every(tags => tags.includes(tag)));\n } else {\n this.commonTags = [];\n }\n } catch (error) {\n console.error('Error loading common tags:', error);\n ElMessage.error(this.$t('batchTag.loadCommonTagsFailed'));\n }\n },\n handleInputChange() {\n clearTimeout(this.debounceTimer);\n if (!this.inputTag || this.inputTag.trim().length === 0) {\n this.showSuggestions = false;\n return;\n }\n this.debounceTimer = setTimeout(() => {\n this.fetchSuggestions();\n }, 300);\n },\n async fetchSuggestions() {\n try {\n const prefix = this.inputTag.trim().toLowerCase();\n const response = await fetchWithAuth(`/api/manage/tags/autocomplete?prefix=${encodeURIComponent(prefix)}&limit=10`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.suggestions = (data.tags || []).filter(tag => !this.tagsToAdd.includes(tag));\n this.showSuggestions = this.suggestions.length > 0;\n }\n } catch (error) {\n console.error('Error fetching suggestions:', error);\n }\n },\n selectSuggestion(tag) {\n this.inputTag = tag;\n this.showSuggestions = false;\n this.handleAddInputTag();\n },\n handleAddInputTag() {\n const tag = this.inputTag.trim();\n if (!tag) {\n return;\n }\n if (this.tagsToAdd.includes(tag)) {\n ElMessage.warning(this.$t('batchTag.tagAlreadyInList'));\n this.inputTag = '';\n this.showSuggestions = false;\n return;\n }\n this.tagsToAdd.push(tag);\n this.inputTag = '';\n this.showSuggestions = false;\n },\n removeFromToAdd(tag) {\n const index = this.tagsToAdd.indexOf(tag);\n if (index > -1) {\n this.tagsToAdd.splice(index, 1);\n }\n },\n async executeAddTags() {\n if (this.tagsToAdd.length === 0) {\n ElMessage.warning(this.$t('batchTag.pleaseAddTags'));\n return;\n }\n this.loading = true;\n try {\n const response = await fetchWithAuth('/api/manage/tags/batch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n fileIds: this.fileIds,\n action: 'add',\n tags: this.tagsToAdd\n })\n });\n if (response.ok) {\n const data = await response.json();\n if (data.success || data.updated > 0) {\n ElMessage.success(this.$t('batchTag.addSuccess', {\n count: data.updated\n }));\n this.$emit('tagsUpdated');\n this.tagsToAdd = [];\n } else {\n throw new Error(this.$t('batchTag.addFailed'));\n }\n } else {\n throw new Error(this.$t('batchTag.addFailed'));\n }\n } catch (error) {\n console.error('Error adding tags:', error);\n ElMessage.error(this.$t('batchTag.addFailed'));\n } finally {\n this.loading = false;\n }\n },\n async handleRemoveCommonTag(tag) {\n this.loading = true;\n try {\n const response = await fetchWithAuth('/api/manage/tags/batch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n fileIds: this.fileIds,\n action: 'remove',\n tags: [tag]\n })\n });\n if (response.ok) {\n const data = await response.json();\n if (data.success || data.updated > 0) {\n ElMessage.success(this.$t('batchTag.removeSuccess', {\n count: data.updated\n }));\n this.$emit('tagsUpdated');\n await this.loadCommonTags();\n } else {\n throw new Error(this.$t('batchTag.removeFailed'));\n }\n } else {\n throw new Error(this.$t('batchTag.removeFailed'));\n }\n } catch (error) {\n console.error('Error removing tag:', error);\n ElMessage.error(this.$t('batchTag.removeFailed'));\n } finally {\n this.loading = false;\n }\n },\n handleClearAllTags() {\n ElMessageBox.confirm(this.$t('batchTag.clearConfirmMessage', {\n count: this.fileCount\n }), this.$t('batchTag.clearConfirmTitle'), {\n confirmButtonText: this.$t('batchTag.clearConfirmOk'),\n cancelButtonText: this.$t('batchTag.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n this.executeClearTags();\n }).catch(() => {\n ElMessage.info(this.$t('batchTag.clearCancelled'));\n });\n },\n async executeClearTags() {\n this.loading = true;\n try {\n const response = await fetchWithAuth('/api/manage/tags/batch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n fileIds: this.fileIds,\n action: 'set',\n tags: []\n })\n });\n if (response.ok) {\n const data = await response.json();\n if (data.success || data.updated > 0) {\n ElMessage.success(this.$t('batchTag.clearSuccess', {\n count: data.updated\n }));\n this.$emit('tagsUpdated');\n this.commonTags = [];\n } else {\n throw new Error(this.$t('batchTag.clearFailed'));\n }\n } else {\n throw new Error(this.$t('batchTag.clearFailed'));\n }\n } catch (error) {\n console.error('Error clearing tags:', error);\n ElMessage.error(this.$t('batchTag.clearFailed'));\n } finally {\n this.loading = false;\n }\n },\n handleClose() {\n this.visible = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./BatchTagDialog.vue?vue&type=template&id=ec3adcfc&scoped=true\"\nimport script from \"./BatchTagDialog.vue?vue&type=script&lang=js\"\nexport * from \"./BatchTagDialog.vue?vue&type=script&lang=js\"\n\nimport \"./BatchTagDialog.vue?vue&type=style&index=0&id=ec3adcfc&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ec3adcfc\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, withKeys as _withKeys, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"tag-management-container\"\n};\nconst _hoisted_2 = {\n class: \"input-section\"\n};\nconst _hoisted_3 = {\n key: 0,\n class: \"suggestions-panel\"\n};\nconst _hoisted_4 = [\"onClick\"];\nconst _hoisted_5 = {\n class: \"current-tags-section\"\n};\nconst _hoisted_6 = {\n key: 0,\n class: \"tags-container\"\n};\nconst _hoisted_7 = {\n key: 1,\n class: \"empty-message\"\n};\nconst _hoisted_8 = {\n class: \"popular-tags-section\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"tags-container\"\n};\nconst _hoisted_10 = {\n key: 1,\n class: \"empty-message\"\n};\nconst _hoisted_11 = {\n key: 2,\n class: \"empty-message\"\n};\nconst _hoisted_12 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_Loading = _resolveComponent(\"Loading\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('tagManagement.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $options.visible = $event),\n width: $options.dialogWidth,\n onClose: $options.handleClose\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_12, [_createVNode(_component_el_button, {\n onClick: $options.handleClose\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('tagManagement.close')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_el_input, {\n modelValue: $data.inputTag,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.inputTag = $event),\n placeholder: _ctx.$t('tagManagement.inputPlaceholder'),\n onKeyup: _withKeys($options.handleAddTag, [\"enter\"]),\n onInput: $options.handleInputChange,\n clearable: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.handleAddTag,\n type: \"primary\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onKeyup\", \"onInput\"]), $data.showSuggestions && $data.suggestions.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.suggestions, tag => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: tag,\n class: \"suggestion-item\",\n onClick: $event => $options.selectSuggestion(tag)\n }, _toDisplayString(tag), 9, _hoisted_4);\n }), 128))])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"h4\", null, _toDisplayString(_ctx.$t('tagManagement.currentTags')), 1), $data.currentTags.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.currentTags, tag => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: tag,\n closable: \"\",\n onClose: $event => $options.handleRemoveTag(tag),\n class: \"tag-item\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(tag), 1)]),\n _: 2\n }, 1032, [\"onClose\"]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_7, _toDisplayString(_ctx.$t('tagManagement.noTags')), 1))]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"h4\", null, _toDisplayString(_ctx.$t('tagManagement.popularTags')), 1), $data.popularTags.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.popularTags, tag => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: tag,\n onClick: $event => $options.handleAddPopularTag(tag),\n class: \"tag-item clickable\",\n type: \"info\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(tag), 1)]),\n _: 2\n }, 1032, [\"onClick\"]);\n }), 128))])) : $data.loadingPopularTags ? (_openBlock(), _createElementBlock(\"div\", _hoisted_10, [_createVNode(_component_el_icon, {\n class: \"is-loading\"\n }, {\n default: _withCtx(() => [_createVNode(_component_Loading)]),\n _: 1\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('tagManagement.loading')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, _toDisplayString(_ctx.$t('tagManagement.noPopularTags')), 1))])])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\", \"onClose\"]);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport { ElMessage } from 'element-plus';\nimport { Loading } from '@element-plus/icons-vue';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'TagManagementDialog',\n components: {\n Loading\n },\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n fileId: {\n type: String,\n required: true\n }\n },\n emits: ['update:modelValue', 'tagsUpdated'],\n data() {\n return {\n currentTags: [],\n inputTag: '',\n suggestions: [],\n popularTags: [],\n showSuggestions: false,\n loading: false,\n loadingPopularTags: false,\n debounceTimer: null\n };\n },\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth < 768 ? '90%' : '500px';\n }\n },\n watch: {\n visible(newVal) {\n if (newVal) {\n this.loadFileTags();\n this.loadPopularTags();\n }\n }\n },\n methods: {\n async loadFileTags() {\n try {\n const response = await fetchWithAuth(`/api/manage/tags/${encodeURIComponent(this.fileId)}`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.currentTags = data.tags || [];\n } else {\n throw new Error('Failed to load tags');\n }\n } catch (error) {\n console.error('Error loading file tags:', error);\n ElMessage.error(this.$t('tagManagement.loadFailed'));\n }\n },\n async loadPopularTags() {\n this.loadingPopularTags = true;\n try {\n const response = await fetchWithAuth('/api/manage/tags/autocomplete?limit=20', {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.popularTags = (data.tags || []).filter(tag => !this.currentTags.includes(tag));\n }\n } catch (error) {\n console.error('Error loading popular tags:', error);\n } finally {\n this.loadingPopularTags = false;\n }\n },\n handleInputChange() {\n clearTimeout(this.debounceTimer);\n if (!this.inputTag || this.inputTag.trim().length === 0) {\n this.showSuggestions = false;\n return;\n }\n this.debounceTimer = setTimeout(() => {\n this.fetchSuggestions();\n }, 300);\n },\n async fetchSuggestions() {\n try {\n const prefix = this.inputTag.trim().toLowerCase();\n const response = await fetchWithAuth(`/api/manage/tags/autocomplete?prefix=${encodeURIComponent(prefix)}&limit=10`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.suggestions = (data.tags || []).filter(tag => !this.currentTags.includes(tag));\n this.showSuggestions = this.suggestions.length > 0;\n }\n } catch (error) {\n console.error('Error fetching suggestions:', error);\n }\n },\n selectSuggestion(tag) {\n this.inputTag = tag;\n this.showSuggestions = false;\n this.handleAddTag();\n },\n async handleAddTag() {\n const tag = this.inputTag.trim();\n if (!tag) {\n return;\n }\n if (this.currentTags.includes(tag)) {\n ElMessage.warning(this.$t('tagManagement.tagExists'));\n this.inputTag = '';\n this.showSuggestions = false;\n return;\n }\n try {\n const response = await fetchWithAuth(`/api/manage/tags/${encodeURIComponent(this.fileId)}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n action: 'add',\n tags: [tag]\n })\n });\n if (response.ok) {\n const data = await response.json();\n this.currentTags = data.tags || [];\n this.inputTag = '';\n this.showSuggestions = false;\n ElMessage.success(this.$t('tagManagement.addSuccess'));\n this.$emit('tagsUpdated', this.currentTags);\n\n // 重新加载常用标签\n this.loadPopularTags();\n } else {\n const error = await response.json();\n throw new Error(error.message || this.$t('tagManagement.addFailed'));\n }\n } catch (error) {\n console.error('Error adding tag:', error);\n ElMessage.error(error.message || this.$t('tagManagement.addFailed'));\n }\n },\n async handleRemoveTag(tag) {\n try {\n const response = await fetchWithAuth(`/api/manage/tags/${encodeURIComponent(this.fileId)}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n action: 'remove',\n tags: [tag]\n })\n });\n if (response.ok) {\n const data = await response.json();\n this.currentTags = data.tags || [];\n ElMessage.success(this.$t('tagManagement.removeSuccess'));\n this.$emit('tagsUpdated', this.currentTags);\n\n // 重新加载常用标签\n this.loadPopularTags();\n } else {\n throw new Error(this.$t('tagManagement.removeFailed'));\n }\n } catch (error) {\n console.error('Error removing tag:', error);\n ElMessage.error(this.$t('tagManagement.removeFailed'));\n }\n },\n handleAddPopularTag(tag) {\n this.inputTag = tag;\n this.handleAddTag();\n },\n handleClose() {\n this.visible = false;\n this.inputTag = '';\n this.showSuggestions = false;\n this.currentTags = [];\n this.popularTags = [];\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./TagManagementDialog.vue?vue&type=template&id=689f94e2&scoped=true\"\nimport script from \"./TagManagementDialog.vue?vue&type=script&lang=js\"\nexport * from \"./TagManagementDialog.vue?vue&type=script&lang=js\"\n\nimport \"./TagManagementDialog.vue?vue&type=style&index=0&id=689f94e2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-689f94e2\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock, renderList as _renderList, Fragment as _Fragment, withModifiers as _withModifiers } from \"vue\";\nconst _hoisted_1 = {\n class: \"detail-actions\"\n};\nconst _hoisted_2 = {\n class: \"preview-section\"\n};\nconst _hoisted_3 = {\n class: \"preview-content\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = [\"src\"];\nconst _hoisted_6 = {\n key: 1\n};\nconst _hoisted_7 = {\n key: 1\n};\nconst _hoisted_8 = {\n key: 0,\n style: {\n \"display\": \"flex\",\n \"align-items\": \"center\",\n \"gap\": \"6px\"\n }\n};\nconst _hoisted_9 = {\n key: 1,\n style: {\n \"color\": \"#909399\"\n }\n};\nconst _hoisted_10 = {\n key: 0,\n style: {\n \"display\": \"flex\",\n \"flex-wrap\": \"wrap\",\n \"gap\": \"5px\"\n }\n};\nconst _hoisted_11 = {\n key: 1,\n style: {\n \"color\": \"#909399\"\n }\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_tab_pane = _resolveComponent(\"el-tab-pane\");\n const _component_el_tabs = _resolveComponent(\"el-tabs\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('fileDetail.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $options.visible = $event),\n width: $options.dialogWidth\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [!$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('download')),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.download')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 1,\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => _ctx.$emit('tagManagement')),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"tags\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.tags')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 2,\n type: \"primary\",\n onClick: _cache[2] || (_cache[2] = $event => _ctx.$emit('block')),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ban\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.blacklist')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 3,\n type: \"primary\",\n onClick: _cache[3] || (_cache[3] = $event => _ctx.$emit('white')),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"shield-alt\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.whitelist')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 4,\n type: \"danger\",\n onClick: _cache[4] || (_cache[4] = $event => _ctx.$emit('delete')),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.deleteBtn')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 5,\n type: \"warning\",\n onClick: _cache[5] || (_cache[5] = $event => $options.startEdit()),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.edit')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 6,\n type: \"info\",\n onClick: _cache[6] || (_cache[6] = $event => $options.openRenameDialog()),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"i-cursor\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.rename')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), $data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 7,\n type: \"success\",\n onClick: _cache[7] || (_cache[7] = $event => $options.saveMetadata()),\n round: \"\",\n size: \"small\",\n class: \"detail-action\",\n loading: $data.editSaving\n }, {\n default: _withCtx(() => [!$data.editSaving ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"save\",\n style: {\n \"margin-right\": \"3px\"\n }\n })) : _createCommentVNode(\"\", true), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.save')), 1)]),\n _: 1\n }, 8, [\"loading\"])) : _createCommentVNode(\"\", true), $data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 8,\n onClick: _cache[8] || (_cache[8] = $event => $options.cancelEdit()),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('fileDetail.cancel')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_tabs, {\n modelValue: $data.activeTab,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.activeTab = $event),\n onTabClick: $options.handleTabClick,\n style: {\n \"margin-bottom\": \"10px\"\n }\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tab_pane, {\n label: _ctx.$t('fileDetail.originUrl'),\n name: \"originUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.originUrl,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $props.urls.originUrl = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_tab_pane, {\n label: \"Markdown\",\n name: \"mdUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.mdUrl,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $props.urls.mdUrl = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tab_pane, {\n label: \"HTML\",\n name: \"htmlUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.htmlUrl,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $props.urls.htmlUrl = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tab_pane, {\n label: \"BBCode\",\n name: \"bbUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.bbUrl,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $props.urls.bbUrl = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n }), $props.file?.metadata?.TgFileId ? (_openBlock(), _createBlock(_component_el_tab_pane, {\n key: 0,\n label: \"TG File ID\",\n name: \"tgId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.tgId,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $props.urls.tgId = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true), $props.file?.metadata?.S3Location ? (_openBlock(), _createBlock(_component_el_tab_pane, {\n key: 1,\n label: \"S3 Location\",\n name: \"s3Location\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.S3Location,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $props.urls.S3Location = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true), $props.file?.metadata?.S3CdnFileUrl ? (_openBlock(), _createBlock(_component_el_tab_pane, {\n key: 2,\n label: \"S3 CDN URL\",\n name: \"s3CdnFileUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.S3CdnFileUrl,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $props.urls.S3CdnFileUrl = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"modelValue\", \"onTabClick\"]), _createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [$options.isVideo ? (_openBlock(), _createElementBlock(\"video\", {\n key: 0,\n src: $props.fileLink,\n autoplay: \"\",\n muted: \"\",\n loop: \"\",\n class: \"video-preview\",\n onClick: _cache[17] || (_cache[17] = (...args) => $options.openImageLink && $options.openImageLink(...args))\n }, null, 8, _hoisted_4)) : $options.isAudio ? (_openBlock(), _createElementBlock(\"audio\", {\n key: 1,\n src: $props.fileLink,\n controls: \"\",\n autoplay: \"\",\n class: \"audio-preview\"\n }, null, 8, _hoisted_5)) : $options.isImage ? (_openBlock(), _createBlock(_component_el_image, {\n key: 2,\n src: $props.fileLink,\n \"preview-src-list\": [$props.fileLink],\n \"preview-teleported\": true,\n fit: \"contain\",\n lazy: \"\",\n class: \"image-preview\"\n }, null, 8, [\"src\", \"preview-src-list\"])) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 3,\n icon: \"file\",\n class: \"file-icon-detail\"\n }))])]), _createVNode(_component_el_descriptions, {\n border: \"\",\n column: $options.descColumn\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.fileNameLabel')\n }, {\n default: _withCtx(() => [$data.isEditing ? (_openBlock(), _createBlock(_component_el_input, {\n key: 0,\n modelValue: $data.editForm.FileName,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.editForm.FileName = $event),\n size: \"small\",\n placeholder: _ctx.$t('fileDetail.fileNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])) : (_openBlock(), _createElementBlock(\"span\", _hoisted_6, _toDisplayString($props.file?.metadata?.FileName || $props.file?.name), 1))]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.fileType')\n }, {\n default: _withCtx(() => [$data.isEditing ? (_openBlock(), _createBlock(_component_el_input, {\n key: 0,\n modelValue: $data.editForm.FileType,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.editForm.FileType = $event),\n size: \"small\",\n placeholder: _ctx.$t('fileDetail.fileTypePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])) : (_openBlock(), _createElementBlock(\"span\", _hoisted_7, _toDisplayString($props.file?.metadata?.FileType || _ctx.$t('fileDetail.unknown')), 1))]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.fileSizeLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.fileSizeDisplay), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.imageDimensions')\n }, {\n default: _withCtx(() => [$options.imageDimensions ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [_createElementVNode(\"span\", null, _toDisplayString($props.file?.metadata?.Width) + \" × \" + _toDisplayString($props.file?.metadata?.Height), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n style: {\n \"display\": \"inline-flex\",\n \"align-items\": \"center\",\n \"justify-content\": \"center\"\n }\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.orientationIcon), 1)]),\n _: 1\n })])) : (_openBlock(), _createElementBlock(\"span\", _hoisted_9, _toDisplayString(_ctx.$t('fileDetail.noDimensions')), 1))]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.uploadTimeLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.uploadTime), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.channelTypeAndName')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n style: {\n \"margin-right\": \"6px\"\n }\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($props.file?.metadata?.Channel || _ctx.$t('fileDetail.unknown')), 1)]),\n _: 1\n }), _createElementVNode(\"span\", null, _toDisplayString($props.file?.metadata?.ChannelName || '-'), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.accessStatusAndReview')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n size: \"small\",\n type: $options.accessTagType,\n style: {\n \"margin-right\": \"6px\"\n }\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.accessType), 1)]),\n _: 1\n }, 8, [\"type\"]), _createElementVNode(\"span\", null, _toDisplayString($props.file?.metadata?.Label || _ctx.$t('fileDetail.noTags')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.uploadIP')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($props.file?.metadata?.UploadIP || _ctx.$t('fileDetail.unknown')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.uploadAddressLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($props.file?.metadata?.UploadAddress || _ctx.$t('fileDetail.unknown')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.fileTags')\n }, {\n default: _withCtx(() => [$props.file?.metadata?.Tags && $props.file?.metadata?.Tags.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_10, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.file?.metadata?.Tags, tag => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: tag,\n size: \"small\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(tag), 1)]),\n _: 2\n }, 1024);\n }), 128))])) : (_openBlock(), _createElementBlock(\"span\", _hoisted_11, _toDisplayString(_ctx.$t('fileDetail.noTags')), 1))]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"column\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showRenameDialog,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.showRenameDialog = $event),\n title: _ctx.$t('fileDetail.renameTitle'),\n width: $options.dialogWidth,\n \"append-to-body\": \"\"\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[21] || (_cache[21] = $event => $options.closeRenameDialog())\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('fileDetail.renameCancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[22] || (_cache[22] = $event => $options.submitRename()),\n loading: $data.renameSaving,\n disabled: !$data.renameValidation.valid\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('fileDetail.renameConfirm')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n onSubmit: _withModifiers($options.submitRename, [\"prevent\"])\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('fileDetail.renameLabel'),\n error: $data.renameValidation.error\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.renameForm.newFileId,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.renameForm.newFileId = $event),\n placeholder: _ctx.$t('fileDetail.renamePlaceholder'),\n onInput: $options.validateRenameInput,\n clearable: \"\"\n }, null, 8, [\"modelValue\", \"placeholder\", \"onInput\"])]),\n _: 1\n }, 8, [\"label\", \"error\"])]),\n _: 1\n }, 8, [\"onSubmit\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]);\n}","/**\r\n * File_ID 验证器模块\r\n * 提供 File_ID 格式验证功能,用于重命名操作的前端校验\r\n * 非法字符规则复用 pathValidator 的字符集\r\n */\r\n\r\n/**\r\n * 非法字符正则表达式\r\n * 非法字符包括: \\ : * ? \" ' < > | 空格 ( ) [ ] { } # % ^ ` ~ ; @ & = + $ ,\r\n * 与 pathValidator.js 保持一致\r\n */\r\nconst INVALID_CHARS = /[\\\\:\\*\\?\"'<>\\| \\(\\)\\[\\]\\{\\}#%\\^`~;@&=\\+\\$,]/;\r\n\r\n/**\r\n * 验证 File_ID 格式\r\n * @param {string} newFileId - 新的 File_ID\r\n * @param {string} currentFileId - 当前 File_ID\r\n * @returns {{ valid: boolean, error?: string }}\r\n */\r\nexport function validateFileId(newFileId, currentFileId) {\r\n // 1. 空值/纯空白检测\r\n if (!newFileId || newFileId.trim() === '') {\r\n return {\r\n valid: false,\r\n error: '文件名不能为空'\r\n };\r\n }\r\n\r\n // 2. 与当前 File_ID 相同检测\r\n if (newFileId === currentFileId) {\r\n return {\r\n valid: false,\r\n error: '文件名未发生变化'\r\n };\r\n }\r\n\r\n // 3. 路径穿越检测\r\n if (newFileId.includes('..')) {\r\n return {\r\n valid: false,\r\n error: '文件名不能包含路径穿越字符 \"..\"'\r\n };\r\n }\r\n\r\n // 3.5 单独的 . 路径段检测(仅检查 /./ 或开头 ./,不检查末尾以允许继续输入如 .123)\r\n if (/\\/\\.\\//.test(newFileId) || /^\\.\\//.test(newFileId)) {\r\n return {\r\n valid: false,\r\n error: '文件名不能包含单独的 \".\" 路径段'\r\n };\r\n }\r\n\r\n // 4. 非法字符检测(复用 pathValidator 的字符规则)\r\n if (INVALID_CHARS.test(newFileId)) {\r\n return {\r\n valid: false,\r\n error: '文件名包含非法字符,请使用合法的文件名格式'\r\n };\r\n }\r\n\r\n // 5. 连续斜杠检测\r\n if (newFileId.includes('//')) {\r\n return {\r\n valid: false,\r\n error: '文件名不能包含连续的斜杠'\r\n };\r\n }\r\n\r\n return { valid: true };\r\n}\r\n","import \"core-js/modules/es.json.stringify.js\";\nimport { ElMessage } from 'element-plus';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport { validateFileId } from '@/utils/fileIdValidator';\nexport default {\n name: 'FileDetailDialog',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n file: {\n type: Object,\n default: null\n },\n fileLink: {\n type: String,\n default: ''\n },\n urls: {\n type: Object,\n default: () => ({\n originUrl: '',\n mdUrl: '',\n htmlUrl: '',\n bbUrl: '',\n tgId: '',\n S3Location: '',\n S3CdnFileUrl: ''\n })\n }\n },\n emits: ['update:modelValue', 'download', 'tagManagement', 'block', 'white', 'delete', 'metadataUpdated', 'fileRenamed'],\n watch: {\n visible(val) {\n if (!val) {\n // 关闭弹窗时退出编辑状态\n this.isEditing = false;\n this.editSaving = false;\n }\n }\n },\n data() {\n return {\n activeTab: 'originUrl',\n isEditing: false,\n editForm: {\n FileName: '',\n FileType: ''\n },\n editSaving: false,\n showRenameDialog: false,\n renameForm: {\n newFileId: ''\n },\n renameValidation: {\n valid: true,\n error: ''\n },\n renameSaving: false\n };\n },\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth < 768 ? '95%' : '900px';\n },\n descColumn() {\n return window.innerWidth < 768 ? 1 : 2;\n },\n isVideo() {\n // 先通过 content-type 判断\n const fileType = this.file?.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('video')) return true;\n // 再通过文件后缀判断\n const name = this.file?.name?.toLowerCase() || '';\n return name.endsWith('.mp4') || name.endsWith('.webm') || name.endsWith('.mov') || name.endsWith('.avi');\n },\n isAudio() {\n // 先通过 content-type 判断\n const fileType = this.file?.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('audio')) return true;\n // 再通过文件后缀判断\n const name = this.file?.name?.toLowerCase() || '';\n return name.endsWith('.mp3') || name.endsWith('.wav') || name.endsWith('.ogg') || name.endsWith('.flac');\n },\n isImage() {\n // 先通过 content-type 判断\n const fileType = this.file?.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('image')) return true;\n // 再通过文件后缀判断\n const name = this.file?.name?.toLowerCase() || '';\n return name.endsWith('.jpg') || name.endsWith('.jpeg') || name.endsWith('.png') || name.endsWith('.gif') || name.endsWith('.webp') || name.endsWith('.svg') || name.endsWith('.bmp') || name.endsWith('.avif') || name.endsWith('.heic') || name.endsWith('.heif');\n },\n uploadTime() {\n if (this.file?.metadata?.TimeStamp) {\n return new Date(this.file.metadata.TimeStamp).toLocaleString();\n }\n return this.$t('fileDetail.unknown');\n },\n accessType() {\n const listType = this.file?.metadata?.ListType;\n const label = this.file?.metadata?.Label;\n if (listType === 'White') return this.$t('fileDetail.accessNormalWhitelist');\n if (listType === 'Block') return this.$t('fileDetail.accessBlockedBlacklist');\n if (label === 'adult') return this.$t('fileDetail.accessBlockedReview');\n return this.$t('fileDetail.accessNormal');\n },\n accessTagType() {\n const listType = this.file?.metadata?.ListType;\n const label = this.file?.metadata?.Label;\n if (listType === 'White') return 'success';\n if (listType === 'Block') return 'danger';\n if (label === 'adult') return 'danger';\n return 'success';\n },\n imageDimensions() {\n const width = this.file?.metadata?.Width;\n const height = this.file?.metadata?.Height;\n if (width && height) return true;\n return null;\n },\n orientationIcon() {\n const width = this.file?.metadata?.Width;\n const height = this.file?.metadata?.Height;\n if (!width || !height) return '';\n const ratio = width / height;\n if (ratio > 1.1) return this.$t('fileDetail.orientationLandscape');\n if (ratio < 0.9) return this.$t('fileDetail.orientationPortrait');\n return this.$t('fileDetail.orientationSquare');\n },\n fileSizeDisplay() {\n const sizeBytes = this.file?.metadata?.FileSizeBytes;\n const sizeMB = this.file?.metadata?.FileSize;\n if (sizeBytes) {\n // 根据大小选择合适的单位\n if (sizeBytes < 1024) {\n return `${sizeBytes} B`;\n } else if (sizeBytes < 1024 * 1024) {\n return `${(sizeBytes / 1024).toFixed(2)} KB`;\n } else {\n return `${(sizeBytes / 1024 / 1024).toFixed(2)} MB`;\n }\n } else if (sizeMB) {\n return `${sizeMB} MB`;\n }\n return this.$t('fileDetail.unknown');\n }\n },\n methods: {\n handleVideoClick(e) {\n const video = e.target;\n if (video.paused) video.play();else video.pause();\n },\n handleTabClick() {},\n handleUrlClick(e) {\n const input = e.target;\n input.select();\n navigator.clipboard.writeText(input.value).then(() => {\n ElMessage.success(this.$t('fileDetail.linkCopied'));\n });\n },\n openImageLink() {\n if (this.fileLink) {\n window.open(this.fileLink, '_blank');\n }\n },\n startEdit() {\n this.editForm.FileName = this.file?.metadata?.FileName || '';\n this.editForm.FileType = this.file?.metadata?.FileType || '';\n this.isEditing = true;\n },\n cancelEdit() {\n this.isEditing = false;\n this.editForm.FileName = this.file?.metadata?.FileName || '';\n this.editForm.FileType = this.file?.metadata?.FileType || '';\n this.editSaving = false;\n },\n async saveMetadata() {\n this.editSaving = true;\n try {\n const fileId = this.file.name;\n const response = await fetchWithAuth(`/api/manage/metadata/${fileId}`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n FileName: this.editForm.FileName,\n FileType: this.editForm.FileType\n })\n });\n if (response.ok) {\n const data = await response.json();\n ElMessage.success(this.$t('fileDetail.metadataSaved'));\n this.isEditing = false;\n this.$emit('metadataUpdated', fileId, data.metadata);\n } else {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.message || this.$t('fileDetail.metadataSaveFailed'));\n }\n } catch (error) {\n console.error('Error saving metadata:', error);\n ElMessage.error(error.message || this.$t('fileDetail.metadataSaveFailed'));\n } finally {\n this.editSaving = false;\n }\n },\n openRenameDialog() {\n this.renameForm.newFileId = this.file?.name || '';\n this.renameValidation = {\n valid: true,\n error: ''\n };\n this.showRenameDialog = true;\n },\n closeRenameDialog() {\n this.showRenameDialog = false;\n this.renameForm.newFileId = '';\n this.renameValidation = {\n valid: true,\n error: ''\n };\n },\n validateRenameInput() {\n const result = validateFileId(this.renameForm.newFileId, this.file?.name || '');\n this.renameValidation = {\n valid: result.valid,\n error: result.error || ''\n };\n },\n async submitRename() {\n if (this.renameSaving) return;\n\n // Validate input first\n this.validateRenameInput();\n if (!this.renameValidation.valid) {\n return;\n }\n this.renameSaving = true;\n try {\n const oldFileId = this.file.name;\n const response = await fetchWithAuth(`/api/manage/rename/${oldFileId}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n newFileId: this.renameForm.newFileId\n })\n });\n if (response.ok) {\n const data = await response.json();\n ElMessage.success(this.$t('fileDetail.renameSuccess'));\n this.showRenameDialog = false;\n this.$emit('fileRenamed', oldFileId, this.renameForm.newFileId, data.metadata);\n } else if (response.status === 409) {\n // Conflict — target File_ID already exists\n this.renameValidation = {\n valid: false,\n error: this.$t('fileDetail.renameConflict')\n };\n } else {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.message || this.$t('fileDetail.renameFailed'));\n }\n } catch (error) {\n console.error('Error renaming file:', error);\n ElMessage.error(error.message || this.$t('fileDetail.renameFailed'));\n } finally {\n this.renameSaving = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FileDetailDialog.vue?vue&type=template&id=3f80812c&scoped=true\"\nimport script from \"./FileDetailDialog.vue?vue&type=script&lang=js\"\nexport * from \"./FileDetailDialog.vue?vue&type=script&lang=js\"\n\nimport \"./FileDetailDialog.vue?vue&type=style&index=0&id=3f80812c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3f80812c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"batch-floating-bar\"\n};\nconst _hoisted_2 = {\n class: \"batch-selection-summary\"\n};\nconst _hoisted_3 = {\n class: \"batch-selection-count\"\n};\nconst _hoisted_4 = {\n class: \"batch-floating-actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n return _openBlock(), _createBlock(_Transition, {\n name: \"batch-toolbar\"\n }, {\n default: _withCtx(() => [$props.selectedCount > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.clearSelection'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"batch-floating-btn ghost\",\n \"aria-label\": _ctx.$t('dashboard.clearSelection'),\n onClick: $options.handleClear\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\",\n class: \"batch-floating-icon\"\n })]),\n _: 1\n }, 8, [\"aria-label\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: `${$props.selectedCount} ${_ctx.$t('dashboard.selectedItems')}`,\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", _hoisted_3, _toDisplayString($props.selectedCount), 1)])]),\n _: 1\n }, 8, [\"content\"]), _cache[0] || (_cache[0] = _createElementVNode(\"span\", {\n class: \"batch-toolbar-divider\"\n }, null, -1)), _createElementVNode(\"div\", _hoisted_4, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.actions, action => {\n return _openBlock(), _createBlock(_component_el_tooltip, {\n key: action.command,\n content: _ctx.$t(action.label),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"batch-floating-btn\", action.className]),\n \"aria-label\": _ctx.$t(action.label),\n onClick: $event => $options.handleAction(action.command)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: action.icon,\n class: \"batch-floating-icon\"\n }, null, 8, [\"icon\"])]),\n _: 2\n }, 1032, [\"class\", \"aria-label\", \"onClick\"])]),\n _: 2\n }, 1032, [\"content\"]);\n }), 128))])])) : _createCommentVNode(\"\", true)]),\n _: 1\n });\n}","export default {\n name: 'BatchActionBar',\n props: {\n selectedCount: {\n type: Number,\n required: true\n }\n },\n emits: ['action', 'clear'],\n data() {\n return {\n actions: [{\n command: 'copy',\n label: 'dashboard.copy',\n icon: 'copy',\n className: 'copy'\n }, {\n command: 'download',\n label: 'dashboard.download',\n icon: 'download',\n className: 'download'\n }, {\n command: 'move',\n label: 'dashboard.move',\n icon: 'file-export',\n className: 'move'\n }, {\n command: 'tagManagement',\n label: 'dashboard.tagManagement',\n icon: 'tags',\n className: 'tag'\n }, {\n command: 'ban',\n label: 'dashboard.addToBlacklist',\n icon: 'ban',\n className: 'ban'\n }, {\n command: 'white',\n label: 'dashboard.addToWhitelist',\n icon: 'shield-alt',\n className: 'white'\n }, {\n command: 'delete',\n label: 'dashboard.delete',\n icon: 'trash-alt',\n className: 'danger'\n }]\n };\n },\n methods: {\n handleAction(command) {\n this.$emit('action', command);\n },\n handleClear() {\n this.$emit('clear');\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./BatchActionBar.vue?vue&type=template&id=7445695a&scoped=true\"\nimport script from \"./BatchActionBar.vue?vue&type=script&lang=js\"\nexport * from \"./BatchActionBar.vue?vue&type=script&lang=js\"\n\nimport \"./BatchActionBar.vue?vue&type=style&index=0&id=7445695a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7445695a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createVNode as _createVNode, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"list-col list-col-checkbox\"\n};\nconst _hoisted_2 = [\"src\"];\nconst _hoisted_3 = [\"src\"];\nconst _hoisted_4 = [\"title\"];\nconst _hoisted_5 = {\n class: \"filename-start\"\n};\nconst _hoisted_6 = {\n class: \"filename-end\"\n};\nconst _hoisted_7 = {\n class: \"list-col list-col-tags\"\n};\nconst _hoisted_8 = {\n key: 1,\n class: \"list-empty\"\n};\nconst _hoisted_9 = {\n class: \"list-col list-col-channel\"\n};\nconst _hoisted_10 = {\n class: \"list-col list-col-channel-name\"\n};\nconst _hoisted_11 = {\n key: 0,\n class: \"channel-name-box\"\n};\nconst _hoisted_12 = {\n key: 1,\n class: \"list-empty\"\n};\nconst _hoisted_13 = {\n class: \"list-col list-col-address\"\n};\nconst _hoisted_14 = {\n key: 0,\n class: \"address-box\"\n};\nconst _hoisted_15 = {\n key: 1,\n class: \"list-empty\"\n};\nconst _hoisted_16 = {\n class: \"list-col list-col-size\"\n};\nconst _hoisted_17 = {\n class: \"list-col list-col-date\"\n};\nconst _hoisted_18 = {\n class: \"list-col list-col-actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: \"list-item\",\n onTouchstart: _cache[9] || (_cache[9] = $event => _ctx.$emit('touchstart', $event)),\n onTouchend: _cache[10] || (_cache[10] = $event => _ctx.$emit('touchend', $event)),\n onTouchmove: _cache[11] || (_cache[11] = $event => _ctx.$emit('touchmove', $event))\n }, [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-checkbox\", {\n 'checked': $data.localSelected\n }]),\n onClick: _cache[0] || (_cache[0] = _withModifiers((...args) => $options.toggleSelect && $options.toggleSelect(...args), [\"stop\"]))\n }, [$data.localSelected ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"check\",\n class: \"check-icon\"\n })) : _createCommentVNode(\"\", true)], 2)]), _createElementVNode(\"div\", {\n class: \"list-col list-col-preview\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.handlePreviewClick && $options.handlePreviewClick(...args))\n }, [$options.isFolder ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"folder-open\",\n class: \"list-folder-icon\"\n })) : $options.isVideo ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: $props.fileLink,\n class: \"list-preview-img\",\n muted: \"\",\n preload: \"metadata\"\n }, null, 8, _hoisted_2)) : $options.isImage ? (_openBlock(), _createElementBlock(\"img\", {\n key: 2,\n src: $props.fileLink,\n class: \"list-preview-img\",\n loading: \"lazy\",\n decoding: \"async\"\n }, null, 8, _hoisted_3)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 3,\n icon: \"file\",\n class: \"list-file-icon\"\n }))]), _createElementVNode(\"div\", {\n class: \"list-col list-col-name\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.handlePreviewClick && $options.handlePreviewClick(...args))\n }, [_createElementVNode(\"span\", {\n class: \"filename-ellipsis\",\n title: $options.displayName\n }, [_createElementVNode(\"span\", _hoisted_5, _toDisplayString($options.fileNameStart), 1), _createElementVNode(\"span\", _hoisted_6, _toDisplayString($options.fileNameEnd), 1)], 8, _hoisted_4)]), _createElementVNode(\"div\", _hoisted_7, [!$options.isFolder && $props.item.metadata?.Tags && $props.item.metadata.Tags.length > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.item.metadata.Tags.slice(0, 3), (tag, tagIndex) => {\n return _openBlock(), _createElementBlock(\"span\", {\n key: tagIndex,\n class: \"color-tag\",\n style: _normalizeStyle({\n background: $options.getTagColor(tagIndex)\n })\n }, _toDisplayString(tag), 5);\n }), 128)), $props.item.metadata.Tags.length > 3 ? (_openBlock(), _createElementBlock(\"span\", {\n key: 0,\n class: \"color-tag color-tag-more\",\n style: _normalizeStyle({\n background: $options.getTagColor(3)\n })\n }, \"+\" + _toDisplayString($props.item.metadata.Tags.length - 3), 5)) : _createCommentVNode(\"\", true)], 64)) : (_openBlock(), _createElementBlock(\"span\", _hoisted_8, \"-\"))]), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.isFolder ? '-' : $props.item.metadata?.Channel || $props.item.channelTag || '-'), 1), _createElementVNode(\"div\", _hoisted_10, [!$options.isFolder && $props.item.metadata?.ChannelName ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, _toDisplayString($props.item.metadata.ChannelName), 1)) : (_openBlock(), _createElementBlock(\"span\", _hoisted_12, \"-\"))]), _createElementVNode(\"div\", _hoisted_13, [!$options.isFolder && $props.item.metadata?.UploadIP ? (_openBlock(), _createElementBlock(\"div\", _hoisted_14, _toDisplayString($props.item.metadata.UploadIP), 1)) : (_openBlock(), _createElementBlock(\"span\", _hoisted_15, \"-\"))]), _createElementVNode(\"div\", _hoisted_16, _toDisplayString($options.isFolder ? '-' : $options.fileSizeDisplay), 1), _createElementVNode(\"div\", _hoisted_17, _toDisplayString($options.uploadDate), 1), _createElementVNode(\"div\", _hoisted_18, [!$options.isFolder ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.copyLink'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn\",\n onClick: _cache[3] || (_cache[3] = _withModifiers($event => _ctx.$emit('copy'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.downloadFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn\",\n onClick: _cache[4] || (_cache[4] = _withModifiers($event => _ctx.$emit('download'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n })])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.moveFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn\",\n onClick: _cache[5] || (_cache[5] = _withModifiers($event => _ctx.$emit('move'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\"\n })])]),\n _: 1\n }, 8, [\"content\"])], 64)) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.copyLink'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn\",\n onClick: _cache[6] || (_cache[6] = _withModifiers($event => _ctx.$emit('folderCopy'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.moveFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn\",\n onClick: _cache[7] || (_cache[7] = _withModifiers($event => _ctx.$emit('move'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\"\n })])]),\n _: 1\n }, 8, [\"content\"])], 64)), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.delete'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn list-action-danger\",\n onClick: _cache[8] || (_cache[8] = _withModifiers($event => _ctx.$emit('delete'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n }, 8, [\"content\"])])], 32);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nexport default {\n name: 'FileListItem',\n props: {\n item: {\n type: Object,\n required: true\n },\n selected: {\n type: Boolean,\n default: false\n },\n fileLink: {\n type: String,\n default: ''\n }\n },\n emits: ['update:selected', 'enter', 'detail', 'copy', 'folderCopy', 'move', 'delete', 'download', 'touchstart', 'touchend', 'touchmove'],\n data() {\n return {\n localSelected: this.selected,\n tagColors: ['#f472b6', '#a78bfa', '#60a5fa', '#34d399']\n };\n },\n computed: {\n isFolder() {\n // 检查 isFolder 属性或名称以 / 结尾\n return this.item.isFolder || this.item.name?.endsWith('/');\n },\n isVideo() {\n const name = this.item.name?.toLowerCase() || '';\n return name.endsWith('.mp4') || name.endsWith('.webm') || name.endsWith('.mov') || name.endsWith('.avi');\n },\n isImage() {\n const name = this.item.name?.toLowerCase() || '';\n return name.endsWith('.jpg') || name.endsWith('.jpeg') || name.endsWith('.png') || name.endsWith('.gif') || name.endsWith('.webp') || name.endsWith('.svg') || name.endsWith('.bmp');\n },\n displayName() {\n if (this.isFolder) {\n const parts = this.item.name.split('/').filter(Boolean);\n return parts[parts.length - 1] || this.item.name;\n }\n return this.item.metadata?.FileName || this.getFileName(this.item.name);\n },\n fileNameStart() {\n const name = this.displayName;\n if (name.length <= 20) return name;\n return name.slice(0, -8);\n },\n fileNameEnd() {\n const name = this.displayName;\n if (name.length <= 20) return '';\n return name.slice(-8);\n },\n uploadDate() {\n if (this.item.uploaded) {\n return new Date(this.item.uploaded).toLocaleDateString();\n }\n if (this.item.metadata?.TimeStamp) {\n return new Date(this.item.metadata.TimeStamp).toLocaleDateString();\n }\n return '-';\n },\n fileSizeDisplay() {\n const sizeBytes = this.item.metadata?.FileSizeBytes;\n const sizeMB = this.item.metadata?.FileSize;\n if (sizeBytes) {\n if (sizeBytes < 1024) {\n return `${sizeBytes} B`;\n } else if (sizeBytes < 1024 * 1024) {\n return `${(sizeBytes / 1024).toFixed(1)} KB`;\n } else {\n return `${(sizeBytes / 1024 / 1024).toFixed(2)} MB`;\n }\n } else if (sizeMB) {\n return `${sizeMB} MB`;\n }\n return '-';\n }\n },\n watch: {\n selected(val) {\n this.localSelected = val;\n }\n },\n methods: {\n toggleSelect() {\n this.localSelected = !this.localSelected;\n this.$emit('update:selected', this.localSelected);\n },\n handlePreviewClick() {\n if (this.isFolder) {\n this.$emit('enter');\n } else {\n this.$emit('detail');\n }\n },\n getFileName(name) {\n const parts = (name || '').split('/');\n return parts[parts.length - 1];\n },\n getTagColor(index) {\n return this.tagColors[index % this.tagColors.length];\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FileListItem.vue?vue&type=template&id=78d34f50&scoped=true\"\nimport script from \"./FileListItem.vue?vue&type=script&lang=js\"\nexport * from \"./FileListItem.vue?vue&type=script&lang=js\"\n\nimport \"./FileListItem.vue?vue&type=style&index=0&id=78d34f50&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-78d34f50\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, vShow as _vShow, withDirectives as _withDirectives, Fragment as _Fragment, withModifiers as _withModifiers, withCtx as _withCtx, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"file-short-info\"\n};\nconst _hoisted_2 = {\n key: 0,\n class: \"success-tag\"\n};\nconst _hoisted_3 = {\n key: 1,\n class: \"fail-tag\"\n};\nconst _hoisted_4 = {\n key: 2,\n class: \"success-tag\"\n};\nconst _hoisted_5 = {\n key: 3,\n class: \"primary-tag\"\n};\nconst _hoisted_6 = {\n key: 0,\n style: {\n \"margin-left\": \"2px\"\n }\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"skeleton-wrapper\"\n};\nconst _hoisted_8 = {\n class: \"error-text\"\n};\nconst _hoisted_9 = [\"src\"];\nconst _hoisted_10 = {\n class: \"error-text\"\n};\nconst _hoisted_11 = {\n key: 3,\n class: \"file-preview\"\n};\nconst _hoisted_12 = {\n class: \"card-bottom-overlay\"\n};\nconst _hoisted_13 = {\n class: \"file-name-row\"\n};\nconst _hoisted_14 = {\n class: \"file-name\"\n};\nconst _hoisted_15 = {\n class: \"action-bar\"\n};\nconst _hoisted_16 = {\n class: \"action-bar-left\"\n};\nconst _hoisted_17 = {\n class: \"action-bar-right\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_card = _resolveComponent(\"el-card\");\n return _openBlock(), _createBlock(_component_el_card, {\n class: \"img-card\",\n onTouchstart: _cache[17] || (_cache[17] = $event => _ctx.$emit('touchstart', $event)),\n onTouchend: _cache[18] || (_cache[18] = $event => _ctx.$emit('touchend', $event)),\n onTouchmove: _cache[19] || (_cache[19] = $event => _ctx.$emit('touchmove', $event))\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n modelValue: $data.localSelected,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.localSelected = $event),\n onChange: _cache[1] || (_cache[1] = $event => _ctx.$emit('update:selected', $data.localSelected))\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"div\", _hoisted_1, [$props.item.metadata?.ListType === 'White' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, _toDisplayString($options.channelTag), 1)) : $props.item.metadata?.ListType === 'Block' || $props.item.metadata?.Label === 'adult' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, _toDisplayString($options.channelTag), 1)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_4, _toDisplayString($options.channelTag), 1)), $props.item.metadata?.Tags && $props.item.metadata?.Tags.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [_createVNode(_component_font_awesome_icon, {\n icon: \"tag\",\n style: {\n \"margin-right\": \"3px\",\n \"font-size\": \"12px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString($props.item.metadata.Tags[0]) + \" \", 1), $props.item.metadata.Tags.length > 1 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_6, \" (+\" + _toDisplayString($props.item.metadata.Tags.length - 1) + \") \", 1)) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)]), $options.isVideo ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [$data.videoLoading ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7)) : $data.videoError ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"error-wrapper\",\n onClick: _cache[2] || (_cache[2] = $event => _ctx.$emit('detail'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_8, _toDisplayString(_ctx.$t('dashboard.loadFailed')), 1)])) : _createCommentVNode(\"\", true), _withDirectives(_createElementVNode(\"video\", {\n src: $props.fileLink,\n muted: \"\",\n loop: \"\",\n preload: \"metadata\",\n class: \"video-preview\",\n onClick: _cache[3] || (_cache[3] = (...args) => $options.handleVideoClick && $options.handleVideoClick(...args)),\n onMouseenter: _cache[4] || (_cache[4] = $event => $options.handleVideoHover($event, true)),\n onMouseleave: _cache[5] || (_cache[5] = $event => $options.handleVideoHover($event, false)),\n onFullscreenchange: _cache[6] || (_cache[6] = (...args) => $options.handleFullscreenChange && $options.handleFullscreenChange(...args)),\n onWebkitfullscreenchange: _cache[7] || (_cache[7] = (...args) => $options.handleFullscreenChange && $options.handleFullscreenChange(...args)),\n onLoadeddata: _cache[8] || (_cache[8] = $event => $data.videoLoading = false),\n onError: _cache[9] || (_cache[9] = (...args) => $options.handleVideoError && $options.handleVideoError(...args))\n }, null, 40, _hoisted_9), [[_vShow, !$data.videoLoading && !$data.videoError]])], 64)) : $options.isAudio ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-preview audio-card-preview\",\n onClick: _cache[10] || (_cache[10] = $event => _ctx.$emit('detail'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"music\",\n class: \"file-icon audio-icon\"\n })])) : $options.isImage ? (_openBlock(), _createBlock(_component_el_image, {\n key: 2,\n \"preview-teleported\": true,\n src: $props.fileLink,\n \"preview-src-list\": $props.previewSrcList,\n fit: \"cover\",\n lazy: \"\",\n decoding: \"async\",\n class: \"image-preview\"\n }, {\n placeholder: _withCtx(() => [...(_cache[20] || (_cache[20] = [_createElementVNode(\"div\", {\n class: \"skeleton-wrapper\"\n }, null, -1)]))]),\n error: _withCtx(() => [_createElementVNode(\"div\", {\n class: \"error-wrapper\",\n onClick: _cache[11] || (_cache[11] = _withModifiers($event => _ctx.$emit('detail'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"image\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('dashboard.loadFailed')), 1)])]),\n _: 1\n }, 8, [\"src\", \"preview-src-list\"])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })])), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"span\", _hoisted_14, _toDisplayString($options.displayName), 1)]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.detail'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[12] || (_cache[12] = _withModifiers($event => _ctx.$emit('detail'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])]), _createElementVNode(\"div\", _hoisted_17, [_createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.moveFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[13] || (_cache[13] = _withModifiers($event => _ctx.$emit('move'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.delete'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn action-btn-danger\",\n onClick: _cache[14] || (_cache[14] = _withModifiers($event => _ctx.$emit('delete'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.downloadFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[15] || (_cache[15] = _withModifiers($event => _ctx.$emit('download'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.copyLink'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[16] || (_cache[16] = _withModifiers($event => _ctx.$emit('copy'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])])]),\n _: 1\n });\n}","export default {\n name: 'FileCard',\n props: {\n item: {\n type: Object,\n required: true\n },\n selected: {\n type: Boolean,\n default: false\n },\n fileLink: {\n type: String,\n required: true\n },\n previewSrcList: {\n type: Array,\n default: () => []\n },\n disableTooltip: {\n type: Boolean,\n default: false\n }\n },\n emits: ['update:selected', 'detail', 'copy', 'move', 'delete', 'download', 'touchstart', 'touchend', 'touchmove'],\n data() {\n return {\n localSelected: this.selected,\n videoLoading: true,\n videoError: false\n };\n },\n computed: {\n channelTag() {\n return this.item.channelTag || '';\n },\n isVideo() {\n // 先通过 content-type 判断\n const fileType = this.item.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('video')) return true;\n // 再通过文件后缀判断\n const name = this.item.name?.toLowerCase() || '';\n return name.endsWith('.mp4') || name.endsWith('.webm') || name.endsWith('.mov') || name.endsWith('.avi');\n },\n isAudio() {\n // 先通过 content-type 判断\n const fileType = this.item.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('audio')) return true;\n // 再通过文件后缀判断\n const name = this.item.name?.toLowerCase() || '';\n return name.endsWith('.mp3') || name.endsWith('.wav') || name.endsWith('.ogg') || name.endsWith('.flac');\n },\n isImage() {\n // 先通过 content-type 判断\n const fileType = this.item.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('image')) return true;\n // 再通过文件后缀判断\n const name = this.item.name?.toLowerCase() || '';\n return name.endsWith('.jpg') || name.endsWith('.jpeg') || name.endsWith('.png') || name.endsWith('.gif') || name.endsWith('.webp') || name.endsWith('.svg') || name.endsWith('.bmp') || name.endsWith('.avif') || name.endsWith('.heic') || name.endsWith('.heif');\n },\n displayName() {\n const fileName = this.item.metadata?.FileName || this.item.name || '';\n const parts = fileName.split('/');\n return parts[parts.length - 1];\n }\n },\n watch: {\n selected(val) {\n this.localSelected = val;\n },\n fileLink() {\n // 链接变化时重置加载状态\n this.videoLoading = true;\n this.videoError = false;\n }\n },\n methods: {\n handleVideoError() {\n this.videoLoading = false;\n this.videoError = true;\n },\n handleVideoClick(e) {\n const video = e.target;\n if (video.requestFullscreen) {\n video.requestFullscreen();\n } else if (video.webkitRequestFullscreen) {\n video.webkitRequestFullscreen();\n } else if (video.mozRequestFullScreen) {\n video.mozRequestFullScreen();\n } else if (video.msRequestFullscreen) {\n video.msRequestFullscreen();\n }\n },\n handleFullscreenChange(e) {\n const video = e.target;\n const isFullscreen = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;\n if (isFullscreen) {\n // 进入全屏:取消静音和循环\n video.muted = false;\n video.loop = false;\n } else {\n // 退出全屏:恢复静音和循环,暂停并重置\n video.muted = true;\n video.loop = true;\n video.pause();\n video.currentTime = 0;\n }\n },\n handleVideoHover(e, isEnter) {\n const video = e.target;\n if (isEnter) {\n video.play().catch(() => {});\n } else {\n video.pause();\n video.currentTime = 0;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FileCard.vue?vue&type=template&id=e367e94e&scoped=true\"\nimport script from \"./FileCard.vue?vue&type=script&lang=js\"\nexport * from \"./FileCard.vue?vue&type=script&lang=js\"\n\nimport \"./FileCard.vue?vue&type=style&index=0&id=e367e94e&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e367e94e\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withModifiers as _withModifiers, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"card-bottom-overlay\"\n};\nconst _hoisted_2 = {\n class: \"file-name-row\"\n};\nconst _hoisted_3 = {\n class: \"file-name\"\n};\nconst _hoisted_4 = {\n key: 0,\n class: \"action-bar\"\n};\nconst _hoisted_5 = {\n class: \"action-bar-right\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_card = _resolveComponent(\"el-card\");\n return _openBlock(), _createBlock(_component_el_card, {\n class: \"img-card folder-card\",\n onTouchstart: _cache[6] || (_cache[6] = $event => _ctx.$emit('touchstart', $event)),\n onTouchend: _cache[7] || (_cache[7] = $event => _ctx.$emit('touchend', $event)),\n onTouchmove: _cache[8] || (_cache[8] = $event => _ctx.$emit('touchmove', $event))\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n modelValue: $data.localSelected,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.localSelected = $event),\n onChange: _cache[1] || (_cache[1] = $event => _ctx.$emit('update:selected', $data.localSelected))\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"div\", {\n class: \"folder-icon\",\n onClick: _cache[2] || (_cache[2] = $event => _ctx.$emit('enter'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-open\",\n class: \"folder-icon-svg\"\n })]), _createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", _hoisted_3, _toDisplayString($options.folderName), 1)]), $props.showActions ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [_cache[9] || (_cache[9] = _createElementVNode(\"div\", {\n class: \"action-bar-left\"\n }, null, -1)), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.copyLink'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[3] || (_cache[3] = _withModifiers($event => _ctx.$emit('copy'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.moveFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[4] || (_cache[4] = _withModifiers($event => _ctx.$emit('move'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.delete'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn action-btn-danger\",\n onClick: _cache[5] || (_cache[5] = _withModifiers($event => _ctx.$emit('delete'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])) : _createCommentVNode(\"\", true)])]),\n _: 1\n });\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nexport default {\n name: 'FolderCard',\n props: {\n name: {\n type: String,\n required: true\n },\n selected: {\n type: Boolean,\n default: false\n },\n showActions: {\n type: Boolean,\n default: true\n },\n disableTooltip: {\n type: Boolean,\n default: false\n }\n },\n emits: ['update:selected', 'enter', 'copy', 'move', 'delete', 'touchstart', 'touchend', 'touchmove'],\n data() {\n return {\n localSelected: this.selected\n };\n },\n computed: {\n folderName() {\n const parts = this.name.split('/').filter(Boolean);\n return parts[parts.length - 1] || this.name;\n }\n },\n watch: {\n selected(val) {\n this.localSelected = val;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FolderCard.vue?vue&type=template&id=5f22ef48&scoped=true\"\nimport script from \"./FolderCard.vue?vue&type=script&lang=js\"\nexport * from \"./FolderCard.vue?vue&type=script&lang=js\"\n\nimport \"./FolderCard.vue?vue&type=style&index=0&id=5f22ef48&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5f22ef48\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, createCommentVNode as _createCommentVNode, createStaticVNode as _createStaticVNode } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return $props.type === 'card' ? (_openBlock(true), _createElementBlock(_Fragment, {\n key: 0\n }, _renderList($props.count, i => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: 'skeleton-' + i,\n class: \"skeleton-card\"\n }, [...(_cache[0] || (_cache[0] = [_createElementVNode(\"div\", {\n class: \"skeleton-image\"\n }, null, -1), _createElementVNode(\"div\", {\n class: \"skeleton-info\"\n }, [_createElementVNode(\"div\", {\n class: \"skeleton-text\"\n })], -1)]))]);\n }), 128)) : $props.type === 'list' ? (_openBlock(true), _createElementBlock(_Fragment, {\n key: 1\n }, _renderList($props.count, i => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: 'list-skeleton-' + i,\n class: \"list-item skeleton-list-item\"\n }, [...(_cache[1] || (_cache[1] = [_createStaticVNode(\"
    \", 10)]))]);\n }), 128)) : _createCommentVNode(\"\", true);\n}","export default {\n name: 'SkeletonLoader',\n props: {\n type: {\n type: String,\n default: 'card',\n validator: value => ['card', 'list'].includes(value)\n },\n count: {\n type: Number,\n default: 15\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SkeletonLoader.vue?vue&type=template&id=5060702c&scoped=true\"\nimport script from \"./SkeletonLoader.vue?vue&type=script&lang=js\"\nexport * from \"./SkeletonLoader.vue?vue&type=script&lang=js\"\n\nimport \"./SkeletonLoader.vue?vue&type=style&index=0&id=5060702c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5060702c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createTextVNode as _createTextVNode, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n class: \"el-dropdown-link filter-trigger\"\n};\nconst _hoisted_2 = {\n class: \"filter-section\"\n};\nconst _hoisted_3 = {\n class: \"filter-title\"\n};\nconst _hoisted_4 = {\n class: \"filter-options\"\n};\nconst _hoisted_5 = {\n class: \"filter-section\"\n};\nconst _hoisted_6 = {\n class: \"filter-title\"\n};\nconst _hoisted_7 = {\n class: \"filter-options\"\n};\nconst _hoisted_8 = {\n class: \"filter-section\"\n};\nconst _hoisted_9 = {\n class: \"filter-title\"\n};\nconst _hoisted_10 = {\n class: \"filter-options\"\n};\nconst _hoisted_11 = {\n class: \"filter-section\"\n};\nconst _hoisted_12 = {\n class: \"filter-title\"\n};\nconst _hoisted_13 = {\n class: \"filter-options\"\n};\nconst _hoisted_14 = {\n class: \"filter-section\"\n};\nconst _hoisted_15 = {\n class: \"filter-title\"\n};\nconst _hoisted_16 = {\n class: \"filter-options\"\n};\nconst _hoisted_17 = {\n key: 0,\n class: \"filter-section\"\n};\nconst _hoisted_18 = {\n class: \"filter-title\"\n};\nconst _hoisted_19 = {\n class: \"filter-options\"\n};\nconst _hoisted_20 = {\n key: 0,\n class: \"channel-divider\"\n};\nconst _hoisted_21 = {\n class: \"channel-group-title\"\n};\nconst _hoisted_22 = {\n class: \"filter-actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_badge = _resolveComponent(\"el-badge\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n return _openBlock(), _createBlock(_component_el_dropdown, {\n \"hide-on-click\": false,\n trigger: \"click\",\n class: \"filter-dropdown\",\n ref: \"dropdownRef\"\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"filter-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, _toDisplayString(_ctx.$t('filter.accessStatus')), 1), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.accessStatus,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.localFilters.accessStatus = $event),\n onChange: _cache[1] || (_cache[1] = $event => $options.handleFilterChange('accessStatus'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.accessStatusOptions, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'accessStatus-' + option.value,\n label: option.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, _toDisplayString(_ctx.$t('filter.blackWhiteList')), 1), _createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.listType,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.localFilters.listType = $event),\n onChange: _cache[3] || (_cache[3] = $event => $options.handleFilterChange('listType'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.listTypeOptions, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'listType-' + option.value,\n label: option.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, _toDisplayString(_ctx.$t('filter.reviewResult')), 1), _createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.label,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.localFilters.label = $event),\n onChange: _cache[5] || (_cache[5] = $event => $options.handleFilterChange('label'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.labelOptions, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'label-' + option.value,\n label: option.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, _toDisplayString(_ctx.$t('filter.fileType')), 1), _createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.fileType,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.localFilters.fileType = $event),\n onChange: _cache[7] || (_cache[7] = $event => $options.handleFilterChange('fileType'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.fileTypeOptions, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'fileType-' + option.value,\n label: option.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, _toDisplayString(_ctx.$t('filter.channelType')), 1), _createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.channel,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.localFilters.channel = $event),\n onChange: _cache[9] || (_cache[9] = $event => $options.handleFilterChange('channel'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.channelOptions, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'channel-' + option.value,\n label: option.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]), $props.channelNameOptions.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [_createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('filter.channelName')), 1), _createElementVNode(\"div\", _hoisted_19, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.channelName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.localFilters.channelName = $event),\n onChange: _cache[11] || (_cache[11] = $event => $options.handleFilterChange('channelName'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedChannelNames, (group, index) => {\n return _openBlock(), _createElementBlock(_Fragment, {\n key: 'group-' + group.type\n }, [index > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_20)) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_21, _toDisplayString(group.typeLabel), 1), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.channels, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'channelName-' + option.type + '-' + option.name,\n label: option.type + ':' + option.name\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.name), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))], 64);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_el_button, {\n size: \"small\",\n onClick: $options.clearFilters,\n disabled: $options.activeFilterCount === 0\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('filter.clearFilters')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_1, [_createVNode(_component_el_badge, {\n value: $options.activeFilterCount,\n hidden: $options.activeFilterCount === 0,\n class: \"filter-badge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"filter\",\n class: \"header-icon\"\n })]),\n _: 1\n }, 8, [\"value\", \"hidden\"])])]),\n _: 1\n }, 512);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nexport default {\n name: 'FilterDropdown',\n props: {\n filters: {\n type: Object,\n default: () => ({\n accessStatus: [],\n // 访问状态: 'normal'(正常), 'blocked'(已屏蔽)\n listType: [],\n // 黑白名单: 'White', 'Block', 'none'\n label: [],\n fileType: [],\n channel: [],\n channelName: []\n })\n },\n channelNameOptions: {\n type: Array,\n default: () => []\n }\n },\n emits: ['update:filters', 'change'],\n data() {\n return {\n localFilters: {\n accessStatus: [],\n listType: [],\n label: [],\n fileType: [],\n channel: [],\n channelName: []\n }\n };\n },\n computed: {\n // 访问状态选项(综合判断 ListType 和 Label)\n // 正常: ListType !== 'Block' && Label !== 'adult'\n // 已屏蔽: ListType === 'Block' || Label === 'adult'\n accessStatusOptions() {\n return [{\n label: this.$t('filter.normal'),\n value: 'normal'\n }, {\n label: this.$t('filter.blocked'),\n value: 'blocked'\n }];\n },\n // 黑白名单选项(直接使用 ListType 字段值)\n listTypeOptions() {\n return [{\n label: this.$t('filter.whiteList'),\n value: 'White'\n }, {\n label: this.$t('filter.blackList'),\n value: 'Block'\n }, {\n label: this.$t('filter.notSet'),\n value: 'None'\n }];\n },\n // 审查结果选项\n labelOptions() {\n return [{\n label: this.$t('filter.normal'),\n value: 'normal'\n }, {\n label: this.$t('filter.teenContent'),\n value: 'teen'\n }, {\n label: this.$t('filter.adultContent'),\n value: 'adult'\n }];\n },\n fileTypeOptions() {\n return [{\n label: this.$t('filter.image'),\n value: 'image'\n }, {\n label: this.$t('filter.video'),\n value: 'video'\n }, {\n label: this.$t('filter.audio'),\n value: 'audio'\n }, {\n label: this.$t('filter.other'),\n value: 'other'\n }];\n },\n channelOptions() {\n return [{\n label: 'Telegram',\n value: 'TelegramNew'\n }, {\n label: 'Cloudflare R2',\n value: 'CloudflareR2'\n }, {\n label: 'S3',\n value: 'S3'\n }, {\n label: 'Discord',\n value: 'Discord'\n }, {\n label: 'HuggingFace',\n value: 'HuggingFace'\n }, {\n label: 'WebDAV',\n value: 'WebDAV'\n }, {\n label: this.$t('filter.externalLink'),\n value: 'External'\n }];\n },\n activeFilterCount() {\n return Object.values(this.localFilters).reduce((count, arr) => count + arr.length, 0);\n },\n // 按类型分组渠道名称\n groupedChannelNames() {\n const groups = {};\n this.channelNameOptions.forEach(option => {\n if (!groups[option.type]) {\n groups[option.type] = {\n type: option.type,\n typeLabel: option.typeLabel,\n channels: []\n };\n }\n groups[option.type].channels.push(option);\n });\n return Object.values(groups);\n }\n },\n watch: {\n filters: {\n handler(newFilters) {\n this.localFilters = {\n accessStatus: Array.isArray(newFilters.accessStatus) ? [...newFilters.accessStatus] : [],\n listType: Array.isArray(newFilters.listType) ? [...newFilters.listType] : [],\n label: Array.isArray(newFilters.label) ? [...newFilters.label] : [],\n fileType: Array.isArray(newFilters.fileType) ? [...newFilters.fileType] : [],\n channel: Array.isArray(newFilters.channel) ? [...newFilters.channel] : [],\n channelName: Array.isArray(newFilters.channelName) ? [...newFilters.channelName] : []\n };\n },\n immediate: true,\n deep: true\n }\n },\n methods: {\n handleFilterChange(type) {\n this.$emit('update:filters', {\n ...this.localFilters\n });\n this.$emit('change', {\n type,\n filters: {\n ...this.localFilters\n }\n });\n },\n clearFilters() {\n this.localFilters = {\n accessStatus: [],\n listType: [],\n label: [],\n fileType: [],\n channel: [],\n channelName: []\n };\n this.$emit('update:filters', {\n ...this.localFilters\n });\n this.$emit('change', {\n type: 'clear',\n filters: {\n ...this.localFilters\n }\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FilterDropdown.vue?vue&type=template&id=c3aeeea0&scoped=true\"\nimport script from \"./FilterDropdown.vue?vue&type=script&lang=js\"\nexport * from \"./FilterDropdown.vue?vue&type=script&lang=js\"\n\nimport \"./FilterDropdown.vue?vue&type=style&index=0&id=c3aeeea0&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c3aeeea0\"]])\n\nexport default __exports__","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport { resolveComponent as _resolveComponent, createVNode as _createVNode, withKeys as _withKeys, withCtx as _withCtx, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"search-area\"\n};\nconst _hoisted_4 = {\n class: \"search-card\"\n};\nconst _hoisted_5 = {\n class: \"actions\"\n};\nconst _hoisted_6 = {\n class: \"el-dropdown-link\"\n};\nconst _hoisted_7 = {\n class: \"el-dropdown-link\"\n};\nconst _hoisted_8 = {\n class: \"breadcrumb-container\"\n};\nconst _hoisted_9 = {\n class: \"mobile-directory-path\"\n};\nconst _hoisted_10 = {\n class: \"breadcrumb desktop-only\"\n};\nconst _hoisted_11 = [\"title\"];\nconst _hoisted_12 = {\n key: 1,\n class: \"empty-state\"\n};\nconst _hoisted_13 = {\n class: \"empty-text\"\n};\nconst _hoisted_14 = {\n class: \"empty-hint\"\n};\nconst _hoisted_15 = {\n class: \"list-header\"\n};\nconst _hoisted_16 = {\n class: \"list-col list-col-checkbox\"\n};\nconst _hoisted_17 = {\n class: \"list-col list-col-preview\"\n};\nconst _hoisted_18 = {\n class: \"list-col list-col-name\"\n};\nconst _hoisted_19 = {\n class: \"list-col list-col-tags\"\n};\nconst _hoisted_20 = {\n class: \"list-col list-col-channel\"\n};\nconst _hoisted_21 = {\n class: \"list-col list-col-channel-name\"\n};\nconst _hoisted_22 = {\n class: \"list-col list-col-address\"\n};\nconst _hoisted_23 = {\n class: \"list-col list-col-size\"\n};\nconst _hoisted_24 = {\n class: \"list-col list-col-date\"\n};\nconst _hoisted_25 = {\n class: \"list-col list-col-actions\"\n};\nconst _hoisted_26 = {\n key: 1,\n class: \"empty-state list-empty\"\n};\nconst _hoisted_27 = {\n class: \"empty-text\"\n};\nconst _hoisted_28 = {\n class: \"empty-hint\"\n};\nconst _hoisted_29 = {\n class: \"pagination-container\"\n};\nconst _hoisted_30 = {\n class: \"pagination-center\"\n};\nconst _hoisted_31 = {\n class: \"pagination-right\"\n};\nconst _hoisted_32 = {\n class: \"page-total\"\n};\nconst _hoisted_33 = {\n class: \"page-jump\"\n};\nconst _hoisted_34 = {\n class: \"dialog-section\"\n};\nconst _hoisted_35 = {\n class: \"section-header\"\n};\nconst _hoisted_36 = {\n class: \"section-title\"\n};\nconst _hoisted_37 = {\n class: \"section-content\"\n};\nconst _hoisted_38 = {\n class: \"dialog-section\"\n};\nconst _hoisted_39 = {\n class: \"section-header\"\n};\nconst _hoisted_40 = {\n class: \"section-title\"\n};\nconst _hoisted_41 = {\n class: \"section-content\"\n};\nconst _hoisted_42 = {\n class: \"setting-item\"\n};\nconst _hoisted_43 = {\n class: \"setting-label\"\n};\nconst _hoisted_44 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_45 = {\n class: \"setting-label\"\n};\nconst _hoisted_46 = {\n class: \"dialog-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_FilterDropdown = _resolveComponent(\"FilterDropdown\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_el_breadcrumb_item = _resolveComponent(\"el-breadcrumb-item\");\n const _component_el_breadcrumb = _resolveComponent(\"el-breadcrumb\");\n const _component_SkeletonLoader = _resolveComponent(\"SkeletonLoader\");\n const _component_FolderCard = _resolveComponent(\"FolderCard\");\n const _component_FileCard = _resolveComponent(\"FileCard\");\n const _component_FileListItem = _resolveComponent(\"FileListItem\");\n const _component_el_pagination = _resolveComponent(\"el-pagination\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_main = _resolveComponent(\"el-main\");\n const _component_el_container = _resolveComponent(\"el-container\");\n const _component_BatchActionBar = _resolveComponent(\"BatchActionBar\");\n const _component_FileDetailDialog = _resolveComponent(\"FileDetailDialog\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_TagManagementDialog = _resolveComponent(\"TagManagementDialog\");\n const _component_BatchTagDialog = _resolveComponent(\"BatchTagDialog\");\n const _component_MobileActionSheet = _resolveComponent(\"MobileActionSheet\");\n const _component_MobileDirectoryDrawer = _resolveComponent(\"MobileDirectoryDrawer\");\n const _component_MoveFileDialog = _resolveComponent(\"MoveFileDialog\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_container, null, {\n default: _withCtx(() => [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"dashboard\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_input, {\n modelValue: $data.tempSearch,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.tempSearch = $event),\n size: \"small\",\n placeholder: _ctx.$t('dashboard.searchPlaceholder'),\n onKeyup: _withKeys($options.handleSearch, [\"enter\"])\n }, {\n suffix: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"search\",\n class: \"search-icon\",\n onClick: $options.handleSearch\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onKeyup\"])]), _createVNode(_component_FilterDropdown, {\n filters: $data.filters,\n \"onUpdate:filters\": _cache[1] || (_cache[1] = $event => $data.filters = $event),\n channelNameOptions: $data.channelNameOptions,\n onChange: $options.handleFilterChange\n }, null, 8, [\"filters\", \"channelNameOptions\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_dropdown, {\n onCommand: $options.sort,\n \"hide-on-click\": false\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"dateDesc\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('dashboard.sortByDateDesc')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"nameAsc\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('dashboard.sortByNameAsc')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: $options.sortIcon,\n class: \"header-icon\"\n }, null, 8, [\"icon\"])])]),\n _: 1\n }, 8, [\"onCommand\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('dashboard.linkFormat'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"header-icon\",\n onClick: _cache[2] || (_cache[2] = $event => $data.showUrlDialog = true)\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: $data.viewMode === 'card' ? _ctx.$t('dashboard.listView') : _ctx.$t('dashboard.cardView'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.viewMode === 'card' ? 'list' : 'th-large',\n class: \"header-icon\",\n onClick: $options.toggleViewMode\n }, null, 8, [\"icon\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('dashboard.logout'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])]),\n _: 1\n }), _createVNode(_component_el_main, {\n class: _normalizeClass([\"main-container\", {\n 'has-batch-toolbar': $data.selectedFiles.length > 0\n }])\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"button\", {\n class: \"breadcrumb-select-button\",\n type: \"button\",\n onClick: _cache[3] || (_cache[3] = (...args) => $options.handleSelectPage && $options.handleSelectPage(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $options.selectPageIcon,\n class: \"breadcrumb-select-icon\"\n }, null, 8, [\"icon\"])]), _createElementVNode(\"div\", {\n class: \"mobile-directory-trigger\",\n onClick: _cache[4] || (_cache[4] = $event => $data.showMobileDirectoryDrawer = true)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-open\",\n class: \"mobile-directory-icon\"\n }), _createElementVNode(\"span\", _hoisted_9, _toDisplayString($data.currentPath && $data.currentPath.split('/').filter(Boolean).length > 0 ? $data.currentPath.split('/').filter(Boolean).pop() : _ctx.$t('dashboard.rootDirectory')), 1), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"mobile-directory-arrow\"\n })]), _createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_breadcrumb, {\n separator: \"/\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_breadcrumb_item, {\n onClick: _cache[5] || (_cache[5] = $event => $options.navigateToFolder(''))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"breadcrumb-home-icon\"\n })]),\n _: 1\n }), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.currentPath.split('/').filter(Boolean), (folder, index) => {\n return _openBlock(), _createBlock(_component_el_breadcrumb_item, {\n key: index,\n onClick: $event => $options.navigateToFolder($data.currentPath.split('/').filter(Boolean).slice(0, index + 1).join('/'))\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(folder), 1)]),\n _: 2\n }, 1032, [\"onClick\"]);\n }), 128))]),\n _: 1\n })]), _createElementVNode(\"span\", {\n class: \"stats-badge\",\n title: _ctx.$t('dashboard.totalFiles', {\n count: _ctx.$data.Number\n })\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"stats-badge-icon\"\n }), _createTextVNode(\" \" + _toDisplayString($data.Number), 1)], 8, _hoisted_11)]), $data.viewMode === 'card' ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: _normalizeClass([\"content\", {\n 'is-drag-selecting': $setup.isDragging\n }]),\n ref: \"cardContainerRef\"\n }, [$data.loading ? (_openBlock(), _createBlock(_component_SkeletonLoader, {\n key: 0,\n type: \"card\",\n count: 15\n })) : $options.paginatedTableData.length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_12, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-open\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", _hoisted_13, _toDisplayString($options.hasSearchOrFilter ? _ctx.$t('dashboard.noMatchingFiles') : _ctx.$t('dashboard.currentDirEmpty')), 1), _createElementVNode(\"p\", _hoisted_14, _toDisplayString($options.hasSearchOrFilter ? _ctx.$t('dashboard.adjustSearchHint') : _ctx.$t('dashboard.uploadHint')), 1)])) : (_openBlock(true), _createElementBlock(_Fragment, {\n key: 2\n }, _renderList($options.paginatedTableData, (item, index) => {\n return _openBlock(), _createElementBlock(_Fragment, {\n key: index\n }, [$options.isFolder(item) ? (_openBlock(), _createBlock(_component_FolderCard, {\n key: 0,\n name: item.name,\n selected: item.selected,\n \"onUpdate:selected\": $event => item.selected = $event,\n showActions: !$data.isSearchMode,\n disableTooltip: $options.disableTooltip,\n onEnter: $event => $options.enterFolder(item.name),\n onCopy: $event => $options.handleFolderCopy(item.name),\n onMove: $event => $options.handleMove(index, item.name),\n onDelete: $event => $options.handleDelete(index, item.name),\n onTouchstart: $event => $options.handleFolderTouchStart(item, index),\n onTouchend: $options.handleTouchEnd,\n onTouchmove: $options.handleTouchEnd\n }, null, 8, [\"name\", \"selected\", \"onUpdate:selected\", \"showActions\", \"disableTooltip\", \"onEnter\", \"onCopy\", \"onMove\", \"onDelete\", \"onTouchstart\", \"onTouchend\", \"onTouchmove\"])) : (_openBlock(), _createBlock(_component_FileCard, {\n key: 1,\n item: item,\n selected: item.selected,\n \"onUpdate:selected\": $event => item.selected = $event,\n fileLink: $options.getFileLink(item.name),\n previewSrcList: item.previewSrcList,\n disableTooltip: $options.disableTooltip,\n onDetail: $event => $options.openDetailDialog(index, item.name),\n onCopy: $event => $options.handleCopy(index, item.name),\n onMove: $event => $options.handleMove(index, item.name),\n onDelete: $event => $options.handleDelete(index, item.name),\n onDownload: $event => $options.handleDownload(item.name),\n onTouchstart: $event => $options.handleTouchStart(item, index),\n onTouchend: $options.handleTouchEnd,\n onTouchmove: $options.handleTouchEnd\n }, null, 8, [\"item\", \"selected\", \"onUpdate:selected\", \"fileLink\", \"previewSrcList\", \"disableTooltip\", \"onDetail\", \"onCopy\", \"onMove\", \"onDelete\", \"onDownload\", \"onTouchstart\", \"onTouchend\", \"onTouchmove\"]))], 64);\n }), 128))], 2)) : (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: _normalizeClass([\"list-view\", {\n 'is-drag-selecting': $setup.isDragging\n }]),\n ref: \"listContainerRef\"\n }, [_createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-checkbox\", {\n 'checked': $options.isSelectAll,\n 'indeterminate': $options.isIndeterminate\n }]),\n onClick: _cache[6] || (_cache[6] = $event => $options.handleSelectAllPage(!$options.isSelectAll))\n }, [$options.isSelectAll ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"check\",\n class: \"check-icon\"\n })) : $options.isIndeterminate ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"minus\",\n class: \"check-icon\"\n })) : _createCommentVNode(\"\", true)], 2)]), _createElementVNode(\"div\", _hoisted_17, _toDisplayString(_ctx.$t('dashboard.preview')), 1), _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('dashboard.fileName')), 1), _createElementVNode(\"div\", _hoisted_19, _toDisplayString(_ctx.$t('dashboard.tags')), 1), _createElementVNode(\"div\", _hoisted_20, _toDisplayString(_ctx.$t('dashboard.channelType')), 1), _createElementVNode(\"div\", _hoisted_21, _toDisplayString(_ctx.$t('dashboard.channelNameCol')), 1), _createElementVNode(\"div\", _hoisted_22, _toDisplayString(_ctx.$t('dashboard.uploadAddress')), 1), _createElementVNode(\"div\", _hoisted_23, _toDisplayString(_ctx.$t('dashboard.fileSize')), 1), _createElementVNode(\"div\", _hoisted_24, _toDisplayString(_ctx.$t('dashboard.uploadTime')), 1), _createElementVNode(\"div\", _hoisted_25, _toDisplayString(_ctx.$t('dashboard.actions')), 1)]), $data.loading ? (_openBlock(), _createBlock(_component_SkeletonLoader, {\n key: 0,\n type: \"list\",\n count: 15\n })) : $options.paginatedTableData.length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-open\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", _hoisted_27, _toDisplayString($options.hasSearchOrFilter ? _ctx.$t('dashboard.noMatchingFiles') : _ctx.$t('dashboard.currentDirEmpty')), 1), _createElementVNode(\"p\", _hoisted_28, _toDisplayString($options.hasSearchOrFilter ? _ctx.$t('dashboard.adjustSearchHint') : _ctx.$t('dashboard.uploadHint')), 1)])) : (_openBlock(true), _createElementBlock(_Fragment, {\n key: 2\n }, _renderList($options.paginatedTableData, (item, index) => {\n return _openBlock(), _createBlock(_component_FileListItem, {\n key: index,\n item: item,\n selected: item.selected,\n \"onUpdate:selected\": $event => item.selected = $event,\n fileLink: $options.getFileLink(item.name),\n onEnter: $event => $options.enterFolder(item.name),\n onDetail: $event => $options.openDetailDialog(index, item.name),\n onCopy: $event => $options.handleCopy(index, item.name),\n onFolderCopy: $event => $options.handleFolderCopy(item.name),\n onMove: $event => $options.handleMove(index, item.name),\n onDelete: $event => $options.handleDelete(index, item.name),\n onDownload: $event => $options.handleDownload(item.name),\n onTouchstart: $event => $options.isFolder(item) ? $options.handleFolderTouchStart(item, index) : $options.handleTouchStart(item, index),\n onTouchend: $options.handleTouchEnd,\n onTouchmove: $options.handleTouchEnd\n }, null, 8, [\"item\", \"selected\", \"onUpdate:selected\", \"fileLink\", \"onEnter\", \"onDetail\", \"onCopy\", \"onFolderCopy\", \"onMove\", \"onDelete\", \"onDownload\", \"onTouchstart\", \"onTouchend\", \"onTouchmove\"]);\n }), 128))], 2)), $setup.isDragging ? (_openBlock(), _createElementBlock(\"div\", {\n key: 2,\n class: \"drag-select-overlay\",\n style: _normalizeStyle({\n position: 'fixed',\n left: $setup.selectionRect.left + 'px',\n top: $setup.selectionRect.top + 'px',\n width: $setup.selectionRect.width + 'px',\n height: $setup.selectionRect.height + 'px'\n })\n }, null, 4)) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_29, [_createElementVNode(\"div\", _hoisted_30, [_createVNode(_component_el_pagination, {\n background: \"\",\n layout: \"prev, pager, next\",\n total: $options.filteredTableData.length,\n \"page-size\": $data.pageSize,\n \"current-page\": $data.currentPage,\n \"pager-count\": $options.pagerCount,\n onCurrentChange: $options.handlePageChange\n }, null, 8, [\"total\", \"page-size\", \"current-page\", \"pager-count\", \"onCurrentChange\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.refreshFileList,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync\",\n class: _normalizeClass({\n 'fa-spin': $data.refreshLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"]), $data.currentPage === Math.ceil($options.filteredTableData.length / $data.pageSize) ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.loadMoreData,\n loading: $data.loading,\n class: \"load-more\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('dashboard.loadMore')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_31, [_createElementVNode(\"span\", _hoisted_32, _toDisplayString(_ctx.$t('dashboard.totalPages', {\n count: $options.realTotalPages\n })), 1), _createElementVNode(\"div\", _hoisted_33, [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('dashboard.jumpTo')), 1), _createVNode(_component_el_input, {\n modelValue: $data.jumpPage,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.jumpPage = $event),\n size: \"small\",\n class: \"jump-input\",\n onKeyup: _withKeys($options.handleJumpPage, [\"enter\"])\n }, null, 8, [\"modelValue\", \"onKeyup\"]), _createVNode(_component_el_button, {\n size: \"small\",\n type: \"primary\",\n onClick: $options.handleJumpPage,\n class: \"jump-btn\"\n }, {\n default: _withCtx(() => [...(_cache[24] || (_cache[24] = [_createTextVNode(\"GO\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])])]),\n _: 1\n }, 8, [\"class\"])]),\n _: 1\n }), _createVNode(_component_BatchActionBar, {\n \"selected-count\": $data.selectedFiles.length,\n onAction: $options.handleBatchAction,\n onClear: $options.clearSelection\n }, null, 8, [\"selected-count\", \"onAction\", \"onClear\"]), _createVNode(_component_FileDetailDialog, {\n modelValue: $data.showdetailDialog,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.showdetailDialog = $event),\n file: $data.detailFile,\n fileLink: $options.getFileLink($data.detailFile?.name),\n urls: $options.allUrl,\n onDownload: _cache[9] || (_cache[9] = $event => $options.handleDownload($data.detailFile?.name)),\n onTagManagement: _cache[10] || (_cache[10] = $event => $options.handleTagManagement($data.detailFile?.name)),\n onBlock: _cache[11] || (_cache[11] = $event => $options.handleBlock($data.detailFile?.name)),\n onWhite: _cache[12] || (_cache[12] = $event => $options.handleWhite($data.detailFile?.name)),\n onDelete: _cache[13] || (_cache[13] = $event => $options.handleDetailDelete($data.detailFile?.name)),\n onMetadataUpdated: $options.handleMetadataUpdated,\n onFileRenamed: $options.handleFileRenamed\n }, null, 8, [\"modelValue\", \"file\", \"fileLink\", \"urls\", \"onMetadataUpdated\", \"onFileRenamed\"]), _createVNode(_component_el_dialog, {\n title: _ctx.$t('dashboard.linkFormat'),\n modelValue: $data.showUrlDialog,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.showUrlDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"div\", _hoisted_35, [_createElementVNode(\"span\", _hoisted_36, _toDisplayString(_ctx.$t('settings.defaultCopyLink')), 1)]), _createElementVNode(\"div\", _hoisted_37, [_createVNode(_component_el_radio_group, {\n modelValue: $data.defaultUrlFormat,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.defaultUrlFormat = $event),\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"originUrl\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('settings.rawLink')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"mdUrl\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code\",\n class: \"radio-icon\"\n }), _cache[25] || (_cache[25] = _createElementVNode(\"span\", null, \"Markdown\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"htmlUrl\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\",\n class: \"radio-icon\"\n }), _cache[26] || (_cache[26] = _createElementVNode(\"span\", null, \"HTML\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"bbUrl\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"quote-right\",\n class: \"radio-icon\"\n }), _cache[27] || (_cache[27] = _createElementVNode(\"span\", null, \"BBCode\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"tgId\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"radio-icon\"\n }), _cache[28] || (_cache[28] = _createElementVNode(\"span\", null, \"TG File ID\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"s3Location\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('settings.s3Link')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])])]), _createElementVNode(\"div\", _hoisted_38, [_createElementVNode(\"div\", _hoisted_39, [_createElementVNode(\"span\", _hoisted_40, _toDisplayString(_ctx.$t('settings.customLink')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('settings.customLinkTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_41, [_createElementVNode(\"div\", _hoisted_42, [_createElementVNode(\"span\", _hoisted_43, _toDisplayString(_ctx.$t('settings.enableCustom')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.useCustomUrl,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.useCustomUrl = $event),\n \"active-value\": \"true\",\n \"inactive-value\": \"false\"\n }, null, 8, [\"modelValue\"])]), $data.useCustomUrl === 'true' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_44, [_createElementVNode(\"span\", _hoisted_45, _toDisplayString(_ctx.$t('settings.customPrefix')), 1), _createVNode(_component_el_input, {\n modelValue: $data.customUrlPrefix,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.customUrlPrefix = $event),\n placeholder: _ctx.$t('settings.customPrefixPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"modelValue\", \"placeholder\"])])) : _createCommentVNode(\"\", true)])]), _createElementVNode(\"div\", _hoisted_46, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[17] || (_cache[17] = $event => $data.showUrlDialog = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('settings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_TagManagementDialog, {\n modelValue: $data.showTagDialog,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.showTagDialog = $event),\n fileId: $data.currentTagFile,\n onTagsUpdated: $options.handleTagsUpdated\n }, null, 8, [\"modelValue\", \"fileId\", \"onTagsUpdated\"]), _createVNode(_component_BatchTagDialog, {\n modelValue: $data.showBatchTagDialog,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.showBatchTagDialog = $event),\n selectedFiles: $data.selectedFiles,\n onTagsUpdated: $options.handleBatchTagsUpdated\n }, null, 8, [\"modelValue\", \"selectedFiles\", \"onTagsUpdated\"]), _createVNode(_component_MobileActionSheet, {\n modelValue: $data.showMobileActionModal,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.showMobileActionModal = $event),\n title: $data.mobileActionIsFolder ? $options.getFolderName($data.mobileActionFile?.name || '') : $data.mobileActionFile?.metadata?.FileName || $options.getFileName($data.mobileActionFile?.name || ''),\n isFolder: $data.mobileActionIsFolder,\n onAction: $options.handleMobileAction\n }, null, 8, [\"modelValue\", \"title\", \"isFolder\", \"onAction\"]), _createVNode(_component_MobileDirectoryDrawer, {\n modelValue: $data.showMobileDirectoryDrawer,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.showMobileDirectoryDrawer = $event),\n currentPath: $data.currentPath,\n onNavigate: $options.navigateToFolder,\n onGoBack: $options.handleGoBack\n }, null, 8, [\"modelValue\", \"currentPath\", \"onNavigate\", \"onGoBack\"]), _createVNode(_component_MoveFileDialog, {\n modelValue: $data.showMoveDialog,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.showMoveDialog = $event),\n \"current-directory\": $data.currentPath,\n \"is-batch-move\": $data.isBatchMove,\n \"initial-path\": $data.moveTargetPath,\n onConfirm: $options.confirmMove\n }, null, 8, [\"modelValue\", \"current-directory\", \"is-batch-move\", \"initial-path\", \"onConfirm\"])]);\n}","// 文件管理器工具类\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { ElMessage } from 'element-plus';\r\nimport i18n from '@/locales';\r\n\r\nclass FileManager {\r\n constructor() {\r\n this.FILE_LIST_PATH = 'data/fileList.json';\r\n this.fileListCache = null;\r\n this.storageWarningShown = false;\r\n }\r\n\r\n // 从本地存储读取文件列表\r\n getLocalFileList() {\r\n const fileList = this.getMutableFileList();\r\n return {\r\n ...fileList,\r\n files: [...(fileList.files || [])],\r\n directories: [...(fileList.directories || [])],\r\n };\r\n }\r\n\r\n getMutableFileList() {\r\n if (this.fileListCache) {\r\n return this.fileListCache;\r\n }\r\n\r\n try {\r\n const fileList = localStorage.getItem(this.FILE_LIST_PATH);\r\n this.fileListCache = fileList ? JSON.parse(fileList) : this.createEmptyFileList();\r\n return this.fileListCache;\r\n } catch (error) {\r\n console.error('Error reading local file list:', error);\r\n this.fileListCache = this.createEmptyFileList();\r\n return this.fileListCache;\r\n }\r\n }\r\n\r\n // 更新内存缓存,并尽量持久化到 localStorage\r\n updateFileListCache(fileList) {\r\n this.fileListCache = fileList || this.createEmptyFileList();\r\n const persisted = this.persistFileListCache();\r\n\r\n return {\r\n cacheUpdated: true,\r\n persisted,\r\n };\r\n }\r\n\r\n persistFileListCache() {\r\n try {\r\n localStorage.setItem(this.FILE_LIST_PATH, JSON.stringify(this.fileListCache));\r\n return true;\r\n } catch (error) {\r\n this.handleStoragePersistError(error);\r\n return false;\r\n }\r\n }\r\n\r\n createEmptyFileList() {\r\n return { files: [], directories: [] };\r\n }\r\n\r\n handleStoragePersistError(error) {\r\n console.warn('File list is kept in memory because localStorage persistence failed:', error);\r\n\r\n try {\r\n localStorage.removeItem(this.FILE_LIST_PATH);\r\n } catch (removeError) {\r\n console.warn('Failed to remove stale file list cache:', removeError);\r\n }\r\n\r\n if (!this.storageWarningShown) {\r\n this.storageWarningShown = true;\r\n ElMessage.warning(i18n.global.t('dashboard.fileListMemoryCacheWarning'));\r\n }\r\n }\r\n\r\n // 添加新文件到列表\r\n addFile(newFile) {\r\n try {\r\n const fileList = this.getMutableFileList();\r\n fileList.files.push(newFile);\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error adding file:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 添加新文件夹\r\n addFolder(folderName) {\r\n try {\r\n const fileList = this.getMutableFileList();\r\n if (!fileList.directories.includes(folderName)) {\r\n fileList.directories.push(folderName);\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n }\r\n return false; // 文件夹已存在\r\n } catch (error) {\r\n console.error('Error adding folder:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 移动文件或文件夹\r\n moveFile(oldPath, newPath, isFolder = false, currentPath = '') {\r\n try {\r\n let fileList = this.getMutableFileList();\r\n \r\n if (isFolder) {\r\n // 更新目录列表\r\n const oldFolderIndex = fileList.directories.indexOf(oldPath);\r\n if (oldFolderIndex !== -1) {\r\n fileList.directories.splice(oldFolderIndex, 1);\r\n }\r\n\r\n } else {\r\n // 移动单个文件\r\n const fileIndex = fileList.files.findIndex(file => file.name === oldPath);\r\n if (fileIndex !== -1) {\r\n // 从旧位置移除\r\n fileList.files.splice(fileIndex, 1);\r\n }\r\n\r\n }\r\n\r\n // 如果新路径包含当前目录的直接子目录,则添加直接子目录\r\n if (newPath.startsWith(currentPath)) {\r\n const pathArray = newPath.substring(currentPath.length).split('/');\r\n if (pathArray.length > 1) {\r\n const newFolder = currentPath + pathArray[0];\r\n if (!fileList.directories.includes(newFolder)) {\r\n fileList.directories.push(newFolder);\r\n }\r\n }\r\n }\r\n\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error moving file:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 从列表中删除文件\r\n removeFile(fileName) {\r\n try {\r\n let fileList = this.getMutableFileList();\r\n fileList.files = fileList.files.filter(file => file.name !== fileName);\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error removing file:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 从列表中删除文件夹(同时删除该文件夹下的所有文件)\r\n removeFolder(folderName) {\r\n try {\r\n let fileList = this.getMutableFileList();\r\n fileList.files = fileList.files.filter(file => !file.name.startsWith(folderName + '/'));\r\n fileList.directories = fileList.directories.filter(dir => dir !== folderName);\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error removing folder:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 获取指定目录下的文件和子目录\r\n getFilesInFolder(folderName) {\r\n try {\r\n const fileList = this.getMutableFileList();\r\n const files = fileList.files.filter(file => file.name.startsWith(folderName + '/'));\r\n const subdirectories = fileList.directories.filter(dir => dir.startsWith(folderName + '/'));\r\n return { files, directories: subdirectories };\r\n } catch (error) {\r\n console.error('Error getting files in folder:', error);\r\n return { files: [], directories: [] };\r\n }\r\n }\r\n\r\n // 构建筛选参数URL\r\n buildFilterParams(filters) {\r\n let params = '';\r\n // 访问状态筛选(综合判断)\r\n if (filters.accessStatus && filters.accessStatus.length > 0) {\r\n params += `&accessStatus=${encodeURIComponent(filters.accessStatus.join(','))}`;\r\n }\r\n // 黑白名单筛选(直接使用 ListType 字段)\r\n if (filters.listType && filters.listType.length > 0) {\r\n params += `&listType=${encodeURIComponent(filters.listType.join(','))}`;\r\n }\r\n if (filters.label && filters.label.length > 0) {\r\n params += `&label=${encodeURIComponent(filters.label.join(','))}`;\r\n }\r\n if (filters.fileType && filters.fileType.length > 0) {\r\n params += `&fileType=${encodeURIComponent(filters.fileType.join(','))}`;\r\n }\r\n if (filters.channel && filters.channel.length > 0) {\r\n params += `&channel=${encodeURIComponent(filters.channel.join(','))}`;\r\n }\r\n if (filters.channelName && filters.channelName.length > 0) {\r\n params += `&channelName=${encodeURIComponent(filters.channelName.join(','))}`;\r\n }\r\n return params;\r\n }\r\n\r\n // 更新文件列表\r\n async refreshFileList(dir, search = '', includeTags = '', excludeTags = '', filters = {}) {\r\n search = search.trim();\r\n try {\r\n let url = `/api/manage/list?count=60&dir=${dir}&search=${encodeURIComponent(search)}`;\r\n if (includeTags) {\r\n url += `&includeTags=${encodeURIComponent(includeTags)}`;\r\n }\r\n if (excludeTags) {\r\n url += `&excludeTags=${encodeURIComponent(excludeTags)}`;\r\n }\r\n // 添加筛选参数(支持多选)\r\n url += this.buildFilterParams(filters);\r\n \r\n const response = await fetchWithAuth(url, {\r\n method: 'GET',\r\n });\r\n const newFileList = await response.json();\r\n if (!newFileList.isIndexedResponse) {\r\n ElMessage.warning(i18n.global.t('dashboard.indexingWarning'));\r\n }\r\n // 保存包含新字段的完整数据\r\n return this.updateFileListCache(newFileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error refreshing file list:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 读取更多数据\r\n async loadMoreFiles(dir, search = '', includeTags = '', excludeTags = '', count = 60, filters = {}) {\r\n search = search.trim();\r\n try {\r\n const fileList = this.getMutableFileList();\r\n const start = fileList.files.length;\r\n\r\n let url = `/api/manage/list?dir=${dir}&start=${start}&count=${count}&search=${encodeURIComponent(search)}`;\r\n if (includeTags) {\r\n url += `&includeTags=${encodeURIComponent(includeTags)}`;\r\n }\r\n if (excludeTags) {\r\n url += `&excludeTags=${encodeURIComponent(excludeTags)}`;\r\n }\r\n // 添加筛选参数(支持多选)\r\n url += this.buildFilterParams(filters);\r\n\r\n const response = await fetchWithAuth(url, {\r\n method: 'GET',\r\n });\r\n \r\n const moreFiles = await response.json();\r\n fileList.files.push(...moreFiles.files);\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error loading more files:', error);\r\n return { files: [], directories: [] };\r\n }\r\n }\r\n}\r\n\r\nexport const fileManager = new FileManager();\r\n","/**\r\n * 矩形工具函数\r\n * 用于框选(rubber-band selection)功能中的矩形计算和相交检测\r\n */\r\n\r\n/**\r\n * 判断两个矩形是否相交\r\n * @param {Object} rectA - { left, top, right, bottom }\r\n * @param {Object} rectB - { left, top, right, bottom }\r\n * @returns {boolean} 是否存在重叠区域\r\n */\r\nexport function rectIntersects(rectA, rectB) {\r\n return !(\r\n rectA.right <= rectB.left ||\r\n rectA.left >= rectB.right ||\r\n rectA.bottom <= rectB.top ||\r\n rectA.top >= rectB.bottom\r\n );\r\n}\r\n\r\n/**\r\n * 根据起始点和当前点计算选区矩形\r\n * @param {Object} start - { x, y } 起始鼠标坐标\r\n * @param {Object} current - { x, y } 当前鼠标坐标\r\n * @returns {Object} { left, top, width, height, right, bottom }\r\n */\r\nexport function calcSelectionRect(start, current) {\r\n const left = Math.min(start.x, current.x);\r\n const top = Math.min(start.y, current.y);\r\n const width = Math.abs(current.x - start.x);\r\n const height = Math.abs(current.y - start.y);\r\n return { left, top, width, height, right: left + width, bottom: top + height };\r\n}\r\n","import { ref, watch, onMounted, onBeforeUnmount, toValue } from 'vue';\r\nimport { rectIntersects, calcSelectionRect } from './rectIntersects.js';\r\n\r\n/**\r\n * Vue 3 Composable:框选(rubber-band selection)核心逻辑,支持多视图模式\r\n *\r\n * @param {Object} options\r\n * @param {Object} options.modes - Per-view-mode configuration\r\n * @param {Object} options.modes.card - Card view config\r\n * @param {import('vue').Ref} options.modes.card.containerRef\r\n * @param {string} options.modes.card.itemSelector - e.g. '.img-card'\r\n * @param {Object} options.modes.list - List view config\r\n * @param {import('vue').Ref} options.modes.list.containerRef\r\n * @param {string} options.modes.list.itemSelector - e.g. '.list-item'\r\n * @param {string} [options.mainSelector='.main-container'] - 主内容区域的 CSS 选择器,框选只能从该区域内开始\r\n * @param {import('vue').Ref} options.viewMode - 当前视图模式\r\n * @param {import('vue').Ref} options.items - 当前页的数据项(paginatedTableData)\r\n * @returns {{ isDragging: import('vue').Ref, selectionRect: import('vue').Ref }}\r\n */\r\nexport function useDragSelect(options) {\r\n const {\r\n modes,\r\n mainSelector = '.main-container',\r\n viewMode,\r\n items,\r\n } = options;\r\n\r\n // --- Reactive state ---\r\n const isDragging = ref(false);\r\n const selectionRect = ref({ left: 0, top: 0, width: 0, height: 0, right: 0, bottom: 0 });\r\n\r\n // --- Internal (non-reactive) state ---\r\n let startPoint = null; // { x, y } viewport coordinates at mousedown\r\n let preSelectSnapshot = []; // boolean[] snapshot of items[i].selected before drag\r\n let isAppendMode = false; // whether Shift/Ctrl/Cmd was held at mousedown\r\n\r\n // --- Enable/disable state ---\r\n const MOBILE_BREAKPOINT = 768; // px – at or below this width, drag-select is disabled\r\n let listenerAttached = false; // tracks whether the container mousedown listener is active\r\n\r\n // --- Auto-scroll state ---\r\n const EDGE_THRESHOLD = 50; // px from viewport edge to trigger auto-scroll\r\n const SCROLL_SPEED = 10; // px per frame to scroll\r\n let autoScrollTimer = null; // requestAnimationFrame ID for auto-scroll\r\n\r\n // --- Text selection prevention state ---\r\n let savedUserSelect = ''; // saved document.body.style.userSelect before drag\r\n\r\n // ------------------------------------------------------------------\r\n // Mode resolution helper\r\n // ------------------------------------------------------------------\r\n\r\n /**\r\n * Returns the configuration for the current viewMode.\r\n * @returns {{ containerRef: import('vue').Ref, itemSelector: string } | undefined}\r\n */\r\n function getActiveConfig() {\r\n const mode = toValue(viewMode);\r\n return modes[mode] || undefined;\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Enable / disable helpers\r\n // ------------------------------------------------------------------\r\n\r\n /**\r\n * Determine whether drag-select should be enabled.\r\n * Returns true when viewMode is 'card' or 'list' AND window width > 768px.\r\n */\r\n function shouldEnable() {\r\n const mode = toValue(viewMode);\r\n return (mode === 'card' || mode === 'list') && window.innerWidth > MOBILE_BREAKPOINT;\r\n }\r\n\r\n /**\r\n * Conditionally attach or detach the container listener based on shouldEnable().\r\n * Also cancels any active drag when detaching.\r\n */\r\n function syncListenerState() {\r\n if (shouldEnable()) {\r\n if (!listenerAttached) {\r\n attachContainerListener();\r\n }\r\n } else {\r\n if (listenerAttached) {\r\n cancelDrag();\r\n detachContainerListener();\r\n }\r\n }\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Helpers\r\n // ------------------------------------------------------------------\r\n\r\n /**\r\n * 判断 mousedown 目标是否为可启动框选的空白区域。\r\n * 必须在主内容区域内,且不在卡片、交互元素上。\r\n */\r\n function isBlankArea(event) {\r\n const target = event.target;\r\n // 必须在主内容区域(el-main)内\r\n const mainArea = target.closest(mainSelector);\r\n if (!mainArea) return false;\r\n // 排除当前模式的可选元素\r\n const config = getActiveConfig();\r\n if (config) {\r\n const itemEl = target.closest(config.itemSelector);\r\n if (itemEl) {\r\n const container = toValue(config.containerRef);\r\n if (container && container.contains(itemEl)) {\r\n return false;\r\n }\r\n }\r\n }\r\n // 排除交互元素(按钮、输入框、链接、下拉菜单、分页等)\r\n const interactive = target.closest('button, a, input, .el-input, .el-dropdown, .el-checkbox, .el-breadcrumb, .el-pagination, .el-pager, .header-content, .breadcrumb-container');\r\n if (interactive) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Determine whether a modifier key for append-select is pressed.\r\n */\r\n function hasAppendModifier(event) {\r\n return event.shiftKey || event.ctrlKey || event.metaKey;\r\n }\r\n\r\n /**\r\n * Save a snapshot of the current selected state for all items.\r\n */\r\n function saveSnapshot() {\r\n const currentItems = toValue(items);\r\n preSelectSnapshot = currentItems.map((item) => !!item.selected);\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Auto-scroll helpers\r\n // ------------------------------------------------------------------\r\n\r\n /** The last known clientY during a drag – updated by onMouseMove. */\r\n let lastClientY = 0;\r\n\r\n /**\r\n * Start the auto-scroll loop. On each animation frame we check whether the\r\n * mouse is within EDGE_THRESHOLD of the top or bottom of the viewport and\r\n * scroll accordingly. The selection rectangle and card hit-testing are also\r\n * updated after each scroll step so the visual feedback stays in sync.\r\n */\r\n function startAutoScroll() {\r\n if (autoScrollTimer !== null) return; // already running\r\n\r\n function scrollStep() {\r\n const viewportHeight = window.innerHeight;\r\n let scrollDelta = 0;\r\n\r\n if (lastClientY >= viewportHeight - EDGE_THRESHOLD) {\r\n // Near bottom edge → scroll down\r\n scrollDelta = SCROLL_SPEED;\r\n } else if (lastClientY <= EDGE_THRESHOLD) {\r\n // Near top edge → scroll up\r\n scrollDelta = -SCROLL_SPEED;\r\n }\r\n\r\n if (scrollDelta !== 0) {\r\n window.scrollBy(0, scrollDelta);\r\n\r\n // After scrolling, the viewport-relative positions of cards change,\r\n // but the mouse hasn't moved. We need to adjust the start point so\r\n // the selection rectangle accounts for the scroll offset, then\r\n // re-run hit-testing.\r\n if (startPoint) {\r\n startPoint.y -= scrollDelta;\r\n selectionRect.value = calcSelectionRect(startPoint, { x: selectionRect.value.right >= startPoint.x ? selectionRect.value.right : selectionRect.value.left, y: lastClientY });\r\n updateSelection();\r\n }\r\n }\r\n\r\n // Continue the loop\r\n autoScrollTimer = requestAnimationFrame(scrollStep);\r\n }\r\n\r\n autoScrollTimer = requestAnimationFrame(scrollStep);\r\n }\r\n\r\n /**\r\n * Stop the auto-scroll loop and clean up the timer.\r\n */\r\n function stopAutoScroll() {\r\n if (autoScrollTimer !== null) {\r\n cancelAnimationFrame(autoScrollTimer);\r\n autoScrollTimer = null;\r\n }\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Text selection prevention helpers\r\n // ------------------------------------------------------------------\r\n\r\n /**\r\n * Disable text selection on the document body during drag.\r\n */\r\n function disableTextSelection() {\r\n savedUserSelect = document.body.style.userSelect;\r\n document.body.style.userSelect = 'none';\r\n }\r\n\r\n /**\r\n * Restore the original text selection behavior on the document body.\r\n */\r\n function restoreTextSelection() {\r\n document.body.style.userSelect = savedUserSelect;\r\n }\r\n\r\n /**\r\n * Update the selected state of every item based on the current selection rectangle.\r\n */\r\n function updateSelection() {\r\n const config = getActiveConfig();\r\n if (!config) return;\r\n\r\n const container = toValue(config.containerRef);\r\n if (!container) return;\r\n\r\n const currentItems = toValue(items);\r\n const rect = selectionRect.value;\r\n\r\n // Build the selection rect in {left, top, right, bottom} format for intersection test\r\n const selRect = {\r\n left: rect.left,\r\n top: rect.top,\r\n right: rect.right,\r\n bottom: rect.bottom,\r\n };\r\n\r\n // Query all item DOM elements inside the container using the active mode's selector\r\n const itemElements = container.querySelectorAll(config.itemSelector);\r\n\r\n // Iterate over items and corresponding DOM elements\r\n currentItems.forEach((item, index) => {\r\n const itemEl = itemElements[index];\r\n if (!itemEl) return;\r\n\r\n const itemRect = itemEl.getBoundingClientRect();\r\n const itemBounds = {\r\n left: itemRect.left,\r\n top: itemRect.top,\r\n right: itemRect.right,\r\n bottom: itemRect.bottom,\r\n };\r\n\r\n const intersects = rectIntersects(selRect, itemBounds);\r\n\r\n if (isAppendMode) {\r\n // Append mode: keep original state, toggle on if intersects\r\n // If originally selected, stay selected regardless\r\n // If not originally selected, select if intersects\r\n if (preSelectSnapshot[index]) {\r\n item.selected = true;\r\n } else {\r\n item.selected = intersects;\r\n }\r\n } else {\r\n // Non-append mode: selected = intersects only\r\n item.selected = intersects;\r\n }\r\n });\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Mouse event handlers\r\n // ------------------------------------------------------------------\r\n\r\n function onMouseDown(event) {\r\n // 仅响应鼠标左键\r\n if (event.button !== 0) return;\r\n\r\n // 点击在卡片上时不启动框选\r\n if (!isBlankArea(event)) return;\r\n\r\n // Record start point (viewport coordinates)\r\n startPoint = { x: event.clientX, y: event.clientY };\r\n\r\n // Determine append mode from modifier keys at the moment of mousedown\r\n isAppendMode = hasAppendModifier(event);\r\n\r\n // 保存选中状态快照\r\n saveSnapshot();\r\n\r\n // 非追加模式下先清除所有选中\r\n if (!isAppendMode) {\r\n const currentItems = toValue(items);\r\n currentItems.forEach((item) => {\r\n item.selected = false;\r\n });\r\n }\r\n\r\n // Start dragging\r\n isDragging.value = true;\r\n selectionRect.value = calcSelectionRect(startPoint, startPoint);\r\n\r\n // 防止文本选中\r\n disableTextSelection();\r\n\r\n // Attach document-level listeners for move and up\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n }\r\n\r\n function onMouseMove(event) {\r\n if (!isDragging.value || !startPoint) return;\r\n\r\n const currentPoint = { x: event.clientX, y: event.clientY };\r\n\r\n // Track last clientY for auto-scroll\r\n lastClientY = event.clientY;\r\n\r\n // Update selection rectangle\r\n selectionRect.value = calcSelectionRect(startPoint, currentPoint);\r\n\r\n // Update card selection based on intersection\r\n updateSelection();\r\n\r\n // Start or continue auto-scroll if near viewport edges\r\n const viewportHeight = window.innerHeight;\r\n if (lastClientY <= EDGE_THRESHOLD || lastClientY >= viewportHeight - EDGE_THRESHOLD) {\r\n startAutoScroll();\r\n } else {\r\n stopAutoScroll();\r\n }\r\n }\r\n\r\n function onMouseUp(_event) {\r\n if (!isDragging.value) return;\r\n\r\n // 停止自动滚动\r\n stopAutoScroll();\r\n\r\n // 恢复文本选中\r\n restoreTextSelection();\r\n\r\n // End dragging\r\n isDragging.value = false;\r\n selectionRect.value = { left: 0, top: 0, width: 0, height: 0, right: 0, bottom: 0 };\r\n startPoint = null;\r\n\r\n // Clean up document-level listeners\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Lifecycle: attach / detach container listener\r\n // ------------------------------------------------------------------\r\n\r\n function attachContainerListener() {\r\n if (!listenerAttached) {\r\n document.addEventListener('mousedown', onMouseDown);\r\n listenerAttached = true;\r\n }\r\n }\r\n\r\n function detachContainerListener() {\r\n if (listenerAttached) {\r\n document.removeEventListener('mousedown', onMouseDown);\r\n listenerAttached = false;\r\n }\r\n }\r\n\r\n /**\r\n * Force-stop any in-progress drag (e.g. when viewMode changes).\r\n */\r\n function cancelDrag() {\r\n if (isDragging.value) {\r\n stopAutoScroll();\r\n restoreTextSelection();\r\n isDragging.value = false;\r\n selectionRect.value = { left: 0, top: 0, width: 0, height: 0, right: 0, bottom: 0 };\r\n startPoint = null;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n }\r\n }\r\n\r\n // 监听 viewMode 变化,启用/禁用框选\r\n // Always cancel any in-progress drag when viewMode changes (Requirement 2.3),\r\n // then re-evaluate whether listeners should be attached for the new mode.\r\n watch(\r\n () => toValue(viewMode),\r\n () => {\r\n cancelDrag();\r\n syncListenerState();\r\n }\r\n );\r\n\r\n // --- Window resize handler ---\r\n function onWindowResize() {\r\n syncListenerState();\r\n }\r\n\r\n onMounted(() => {\r\n // 仅在满足条件时启用\r\n if (shouldEnable()) {\r\n attachContainerListener();\r\n }\r\n // Always listen for resize to dynamically enable/disable\r\n window.addEventListener('resize', onWindowResize);\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n cancelDrag();\r\n restoreTextSelection();\r\n stopAutoScroll();\r\n detachContainerListener();\r\n window.removeEventListener('resize', onWindowResize);\r\n });\r\n\r\n return {\r\n isDragging,\r\n selectionRect,\r\n };\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/es.set.difference.v2.js\";\nimport \"core-js/modules/es.set.intersection.v2.js\";\nimport \"core-js/modules/es.set.is-disjoint-from.v2.js\";\nimport \"core-js/modules/es.set.is-subset-of.v2.js\";\nimport \"core-js/modules/es.set.is-superset-of.v2.js\";\nimport \"core-js/modules/es.set.symmetric-difference.v2.js\";\nimport \"core-js/modules/es.set.union.v2.js\";\nimport \"core-js/modules/web.url-search-params.delete.js\";\nimport \"core-js/modules/web.url-search-params.has.js\";\nimport \"core-js/modules/web.url-search-params.size.js\";\nimport { mapGetters } from 'vuex';\nimport JSZip from 'jszip';\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport TagManagementDialog from '@/components/dashboard/TagManagementDialog.vue';\nimport BatchTagDialog from '@/components/dashboard/BatchTagDialog.vue';\nimport SkeletonLoader from '@/components/dashboard/SkeletonLoader.vue';\nimport FileCard from '@/components/dashboard/FileCard.vue';\nimport FolderCard from '@/components/dashboard/FolderCard.vue';\nimport MoveFileDialog from '@/components/dashboard/MoveFileDialog.vue';\nimport FileListItem from '@/components/dashboard/FileListItem.vue';\nimport FileDetailDialog from '@/components/dashboard/FileDetailDialog.vue';\nimport BatchActionBar from '@/components/dashboard/BatchActionBar.vue';\nimport MobileActionSheet from '@/components/dashboard/MobileActionSheet.vue';\nimport MobileDirectoryDrawer from '@/components/dashboard/MobileDirectoryDrawer.vue';\nimport FilterDropdown from '@/components/dashboard/FilterDropdown.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nimport { fileManager } from '@/utils/fileManager';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport { validateFolderPath } from '@/utils/pathValidator';\nimport backgroundManager from '@/mixins/backgroundManager';\nimport { ref } from 'vue';\nimport { useDragSelect } from '@/utils/dashboard/useDragSelect.js';\nexport default {\n name: 'AdminDashBoard',\n mixins: [backgroundManager],\n data() {\n return {\n Number: 0,\n directFileCount: 0,\n // 当前目录直接子文件数量\n directFolderCount: 0,\n // 当前目录直接子文件夹数量\n showLogoutButton: false,\n tableData: [],\n tempSearch: '',\n search: '',\n searchKeywords: '',\n // Keywords only (without tag filters) for backend search\n searchIncludeTags: '',\n // 包含的标签,逗号分隔\n searchExcludeTags: '',\n // 排除的标签,逗号分隔\n isSearchMode: false,\n currentPage: 1,\n pageSize: 15,\n selectedFiles: [],\n sortOption: 'dateDesc',\n isUploading: false,\n showdetailDialog: false,\n detailFile: null,\n activeUrlTab: 'originUrl',\n defaultUrlFormat: 'originUrl',\n showUrlDialog: false,\n useCustomUrl: 'false',\n // 是否启用自定义链接\n customUrlPrefix: '',\n // 自定义链接前缀\n loading: false,\n // 加载状态\n currentPath: '',\n // 当前文件夹路径\n refreshLoading: false,\n showTagDialog: false,\n // 标签管理对话框\n showBatchTagDialog: false,\n // 批量标签管理对话框\n currentTagFile: '',\n // 当前标签管理的文件\n viewMode: 'card',\n // 视图模式:card 或 list\n showMobileActionModal: false,\n // 移动端操作模态框\n mobileActionFile: null,\n // 当前移动端操作的文件\n mobileActionIndex: -1,\n // 当前移动端操作的文件索引\n mobileActionIsFolder: false,\n // 是否为文件夹操作\n longPressTimer: null,\n // 长按计时器\n showMobileDirectoryDrawer: false,\n // 移动端目录抽屉\n jumpPage: '',\n // 跳转页码输入\n // 筛选相关状态(数组形式支持多选)\n filters: {\n accessStatus: [],\n // 访问状态: 'normal'(正常), 'blocked'(已屏蔽)\n listType: [],\n // 黑白名单: 'White', 'Block', 'None'\n label: [],\n // 审查结果: 'normal', 'teen', 'adult'\n fileType: [],\n // 文件类型: 'image', 'video', 'audio', 'other'\n channel: [],\n // 渠道类型: 'TelegramNew', 'CloudflareR2', 'S3', 'Discord', 'HuggingFace', 'WebDAV', 'External'\n channelName: [] // 渠道名称: 动态获取\n },\n channelNameOptions: [],\n // 动态从文件列表中提取\n // 移动文件对话框相关状态\n showMoveDialog: false,\n // 移动文件对话框\n moveTargetPath: '/',\n // 移动目标路径\n moveFileKey: '',\n // 当前移动的文件key\n moveFileIndex: -1,\n // 当前移动的文件索引\n isBatchMove: false // 是否为批量移动\n };\n },\n components: {\n DashboardTabs,\n TagManagementDialog,\n BatchTagDialog,\n SkeletonLoader,\n FileCard,\n FolderCard,\n FileListItem,\n FileDetailDialog,\n BatchActionBar,\n MobileActionSheet,\n MobileDirectoryDrawer,\n FilterDropdown,\n MoveFileDialog,\n LanguageSwitcher\n },\n setup() {\n const cardContainerRef = ref(null);\n const listContainerRef = ref(null);\n const viewModeRef = ref('card');\n const itemsRef = ref([]);\n const {\n isDragging,\n selectionRect\n } = useDragSelect({\n modes: {\n card: {\n containerRef: cardContainerRef,\n itemSelector: '.img-card'\n },\n list: {\n containerRef: listContainerRef,\n itemSelector: '.list-item'\n }\n },\n viewMode: viewModeRef,\n items: itemsRef\n });\n return {\n cardContainerRef,\n listContainerRef,\n viewModeRef,\n itemsRef,\n isDragging,\n selectionRect\n };\n },\n computed: {\n ...mapGetters(['adminUrlSettings', 'userConfig']),\n filteredTableData() {\n return this.tableData;\n },\n totalPages() {\n return Math.ceil(this.filteredTableData.length / this.pageSize) || 1;\n },\n // 基于当前文件夹直接子文件和子文件夹数量计算的真实总页数\n realTotalPages() {\n const total = this.directFolderCount + this.directFileCount;\n return Math.ceil(total / this.pageSize) || 1;\n },\n // 计算当前激活的筛选条件数量(数组形式)\n activeFilterCount() {\n return Object.values(this.filters).reduce((count, arr) => count + (Array.isArray(arr) ? arr.length : 0), 0);\n },\n // 判断是否处于搜索或筛选模式\n hasSearchOrFilter() {\n return this.isSearchMode || this.activeFilterCount > 0;\n },\n paginatedTableData() {\n const sortedData = this.sortData(this.filteredTableData);\n const start = (this.currentPage - 1) * this.pageSize;\n const end = start + this.pageSize;\n let data = sortedData.slice(start, end);\n // 增加previewSrcList属性,用于预览图片\n const fullList = data.filter(file => this.isImage(file)).map(file => this.getFileLink(file.name));\n data.forEach(file => {\n if (this.isImage(file)) {\n // 重新排序,索引大于等于当前索引的元素在前,否则在后\n file.previewSrcList = fullList.slice(fullList.indexOf(this.getFileLink(file.name))).concat(fullList.slice(0, fullList.indexOf(this.getFileLink(file.name))));\n }\n });\n // 增加channelTag属性,用于显示渠道信息\n data.forEach(file => {\n if (file.metadata?.Channel === 'TelegramNew' || file.metadata?.Channel === 'Telegram') {\n file.channelTag = 'TG';\n } else if (file.metadata?.Channel === 'CloudflareR2') {\n file.channelTag = 'R2';\n } else if (file.metadata?.Channel === 'S3') {\n file.channelTag = 'S3';\n } else if (file.metadata?.Channel === 'Discord') {\n file.channelTag = 'DC';\n } else if (file.metadata?.Channel === 'HuggingFace') {\n file.channelTag = 'HF';\n } else if (file.metadata?.Channel === 'WebDAV') {\n file.channelTag = 'WD';\n } else if (file.metadata?.Channel === 'External') {\n file.channelTag = this.$t('dashboard.externalTag');\n } else {\n file.channelTag = this.$t('dashboard.unknownTag');\n }\n });\n return data;\n },\n sortIcon() {\n return this.sortOption === 'dateDesc' ? 'sort-amount-down' : 'sort-alpha-up';\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n detailDialogWidth() {\n return window.innerWidth > 768 ? '70%' : '90%';\n },\n accessType() {\n if (this.detailFile?.metadata?.ListType === 'White') {\n return this.$t('filter.normal');\n } else if (this.detailFile?.metadata?.ListType === 'Block' || this.detailFile?.metadata?.Label === 'adult') {\n return this.$t('filter.blocked');\n } else {\n return this.$t('filter.normal');\n }\n },\n allUrl() {\n // 外链图片均采用外链\n if (this.detailFile?.metadata?.Channel === 'External') {\n return {\n 'originUrl': `${this.detailFile?.metadata?.ExternalLink}`,\n 'mdUrl': `![${this.detailFile?.metadata?.FileName || this.detailFile?.name}](${this.detailFile?.metadata?.ExternalLink})`,\n 'htmlUrl': `\"${this.detailFile?.metadata?.FileName`,\n 'bbUrl': `[img]${this.detailFile?.metadata?.ExternalLink}[/img]`,\n 'tgId': this.detailFile?.metadata?.TgFileId || this.$t('fileDetail.unknown'),\n 'S3Location': this.detailFile?.metadata?.S3Location || this.$t('fileDetail.unknown'),\n 'S3CdnFileUrl': this.detailFile?.metadata?.S3CdnFileUrl || this.$t('fileDetail.unknown')\n };\n } else {\n return {\n 'originUrl': `${this.rootUrl}${this.detailFile?.name}`,\n 'mdUrl': `![${this.detailFile?.metadata?.FileName || this.detailFile?.name}](${this.rootUrl}${this.detailFile?.name})`,\n 'htmlUrl': `\"${this.detailFile?.metadata?.FileName`,\n 'bbUrl': `[img]${this.rootUrl}${this.detailFile?.name}[/img]`,\n 'tgId': this.detailFile?.metadata?.TgFileId || this.$t('fileDetail.unknown'),\n 'S3Location': this.detailFile?.metadata?.S3Location || this.$t('fileDetail.unknown'),\n 'S3CdnFileUrl': this.detailFile?.metadata?.S3CdnFileUrl || this.$t('fileDetail.unknown')\n };\n }\n },\n tableColumnNum() {\n return window.innerWidth > 768 ? 3 : 1;\n },\n tablePreviewSpan() {\n return window.innerWidth > 768 ? 2 : 1;\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n selectPage() {\n // 如果当前页所有文件都被选中,则返回 true,否则返回 false\n return this.paginatedTableData.every(file => file.selected);\n },\n selectedPageFiles() {\n // 如果当前页有文件被选中,则返回 true,否则返回 false\n return this.paginatedTableData.some(file => file.selected);\n },\n selectPageIcon() {\n // 全选为 true 时,返回 check-square;部分选中为 minus-square;全不选为 square\n return this.selectPage ? 'check-square' : this.selectedPageFiles ? 'minus-square' : 'square';\n },\n rootUrl() {\n // 链接前缀,优先级:用户自定义 > urlPrefix > 默认\n return this.useCustomUrl === 'true' ? this.customUrlPrefix : this.userConfig?.urlPrefix || `${document.location.origin}/file/`;\n },\n isSelectAll: {\n get() {\n return this.paginatedTableData.length > 0 && this.paginatedTableData.every(file => file.selected);\n },\n set(val) {\n this.paginatedTableData.forEach(file => file.selected = val);\n }\n },\n isIndeterminate() {\n const selectedCount = this.paginatedTableData.filter(file => file.selected).length;\n return selectedCount > 0 && selectedCount < this.paginatedTableData.length;\n },\n pagerCount() {\n return window.innerWidth < 768 ? 5 : 7;\n }\n },\n watch: {\n // Sync viewMode data property to the ref used by useDragSelect\n viewMode: {\n handler(newVal) {\n this.viewModeRef = newVal;\n },\n immediate: true\n },\n // Sync paginatedTableData computed property to the ref used by useDragSelect\n paginatedTableData: {\n handler(newVal) {\n this.itemsRef = newVal;\n },\n immediate: true\n },\n tableData: {\n handler(newData) {\n // selectedFiles 增加 newData中新选中,不包含在 selectedFiles 中的文件\n this.selectedFiles = this.selectedFiles.concat(newData.filter(file => file.selected && !this.selectedFiles.includes(file)));\n // selectedFiles 删掉 newData 中已取消选中的文件\n this.selectedFiles = this.selectedFiles.filter(file => file.selected);\n // selectedFiles 删掉 tableData 中已删除的文件\n this.selectedFiles = this.selectedFiles.filter(file => newData.includes(file));\n },\n deep: true\n },\n sortOption(newOption) {\n localStorage.setItem('sortOption', newOption);\n },\n defaultUrlFormat(newFormat) {\n localStorage.setItem('defaultUrlFormat', newFormat);\n },\n showdetailDialog(newVal) {\n if (newVal) {\n this.activeUrlTab = this.defaultUrlFormat || 'originUrl';\n }\n },\n customUrlPrefix(val) {\n this.$store.commit('setAdminUrlSettings', {\n key: 'customUrlPrefix',\n value: val\n });\n },\n useCustomUrl(val) {\n this.$store.commit('setAdminUrlSettings', {\n key: 'useCustomUrl',\n value: val\n });\n },\n currentPath(val) {\n // 页面切换时,取消选择的内容\n this.tableData.forEach(file => file.selected = false);\n }\n },\n methods: {\n // 切换视图模式\n toggleViewMode() {\n this.viewMode = this.viewMode === 'card' ? 'list' : 'card';\n localStorage.setItem('viewMode', this.viewMode);\n },\n // 列表视图全选当前页\n handleSelectAllPage(val) {\n this.paginatedTableData.forEach(file => file.selected = val);\n },\n // 移动端长按开始\n handleTouchStart(item, index) {\n this.longPressTimer = setTimeout(() => {\n this.mobileActionFile = item;\n this.mobileActionIndex = index;\n this.mobileActionIsFolder = false;\n this.showMobileActionModal = true;\n }, 500); // 500ms 长按触发\n },\n // 移动端长按结束/取消\n handleTouchEnd() {\n if (this.longPressTimer) {\n clearTimeout(this.longPressTimer);\n this.longPressTimer = null;\n }\n },\n // 文件夹长按开始\n handleFolderTouchStart(item, index) {\n this.longPressTimer = setTimeout(() => {\n this.mobileActionFile = item;\n this.mobileActionIndex = index;\n this.mobileActionIsFolder = true;\n this.showMobileActionModal = true;\n }, 500);\n },\n // 处理移动端操作\n handleMobileAction(action) {\n const file = this.mobileActionFile;\n const index = this.mobileActionIndex;\n this.showMobileActionModal = false;\n if (!file) return;\n switch (action) {\n case 'detail':\n this.openDetailDialog(index, file.name);\n break;\n case 'copy':\n this.handleCopy(index, file.name);\n break;\n case 'folderCopy':\n this.handleFolderCopy(file.name);\n break;\n case 'download':\n this.handleDownload(file.name);\n break;\n case 'move':\n this.handleMove(index, file.name);\n break;\n case 'delete':\n this.handleDelete(index, file.name);\n break;\n case 'tag':\n this.handleTagManagement(file.name);\n break;\n }\n },\n // 返回上一级目录\n handleGoBack() {\n const pathParts = this.currentPath.split('/').filter(Boolean);\n if (pathParts.length > 0) {\n pathParts.pop();\n const parentPath = pathParts.join('/');\n this.navigateToFolder(parentPath);\n }\n this.showMobileDirectoryDrawer = false;\n },\n // 获取标签颜色\n getTagColor(index) {\n const colors = ['linear-gradient(135deg, #667eea 0%, #764ba2 100%)', 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)', 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)', 'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)', 'linear-gradient(135deg, #fa709a 0%, #fee140 100%)', 'linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)'];\n return colors[index % colors.length];\n },\n // 视频hover播放控制\n handleVideoHover(event, isEnter) {\n const video = event.target;\n if (isEnter) {\n video.play().catch(() => {});\n } else {\n video.pause();\n video.currentTime = 0;\n }\n },\n // 格式化文件大小\n formatFileSize(bytes) {\n if (!bytes || bytes === 0) return '-';\n bytes = Number(bytes);\n if (isNaN(bytes)) return '-';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (bytes >= 1024 && i < units.length - 1) {\n bytes /= 1024;\n i++;\n }\n return bytes.toFixed(i > 0 ? 1 : 0) + ' ' + units[i];\n },\n handleSearch() {\n this.search = this.tempSearch;\n this.isSearchMode = this.search.trim() !== '';\n this.currentPage = 1; // 重置到第一页\n\n // 解析搜索字符串,提取标签和关键字\n // 支持 #tag 表示包含标签,-#tag 表示排除标签\n if (this.search && this.search.trim()) {\n const includeTags = [];\n const excludeTags = [];\n\n // 匹配 -#tag 和 #tag\n let searchText = this.search;\n\n // 先匹配排除标签 -#tag\n const excludeTagRegex = /-#([\\w\\u4e00-\\u9fa5\\u3040-\\u309f\\u30a0-\\u30ff\\uac00-\\ud7af\\.\\+\\-]+)/g;\n searchText = searchText.replace(excludeTagRegex, (match, tag) => {\n excludeTags.push(tag.toLowerCase());\n return ' ';\n });\n\n // 再匹配包含标签 #tag\n const includeTagRegex = /#([\\w\\u4e00-\\u9fa5\\u3040-\\u309f\\u30a0-\\u30ff\\uac00-\\ud7af\\.\\+\\-]+)/g;\n searchText = searchText.replace(includeTagRegex, (match, tag) => {\n includeTags.push(tag.toLowerCase());\n return ' ';\n });\n\n // 清理剩余的关键字(去除多余空格)\n this.searchKeywords = searchText.replace(/\\s+/g, ' ').trim();\n\n // 构建标签查询字符串\n this.searchIncludeTags = includeTags.join(',');\n this.searchExcludeTags = excludeTags.join(',');\n console.log('Search keywords:', this.searchKeywords);\n console.log('Include tags:', this.searchIncludeTags);\n console.log('Exclude tags:', this.searchExcludeTags);\n } else {\n this.searchKeywords = '';\n this.searchIncludeTags = '';\n this.searchExcludeTags = '';\n }\n this.refreshFileList();\n },\n // 处理筛选变化(来自 FilterDropdown 组件)\n handleFilterChange({\n type,\n filters\n }) {\n this.filters = filters;\n this.currentPage = 1; // 重置到第一页\n this.refreshFileList();\n },\n // 清除所有筛选条件\n clearFilters() {\n this.filters = {\n listType: [],\n label: [],\n fileType: [],\n channel: [],\n channelName: []\n };\n this.currentPage = 1;\n this.refreshFileList();\n },\n // 从 API 获取所有渠道名称\n async extractChannelNames() {\n try {\n const response = await fetchWithAuth('/api/channels?includeDisabled=true', {\n method: 'GET'\n });\n if (response.ok) {\n const channels = await response.json();\n const channelOptions = [];\n\n // 类型映射(显示名称)\n const typeLabels = {\n telegram: 'Telegram',\n cfr2: 'Cloudflare R2',\n s3: 'S3',\n discord: 'Discord',\n huggingface: 'HuggingFace',\n webdav: 'WebDAV'\n };\n\n // 按类型提取渠道名称,channel.type是类型内部存储名称(可能根据版本有变化),type是类型对外名称\n Object.entries(channels).forEach(([type, channelList]) => {\n if (Array.isArray(channelList) && channelList.length > 0) {\n channelList.forEach(channel => {\n if (channel.name) {\n channelOptions.push({\n name: channel.name,\n type: channel.type,\n typeLabel: typeLabels[type] || type,\n // 使用 channel.type:channel.name 作为唯一标识\n value: `${channel.type}:${channel.name}`\n });\n }\n });\n }\n });\n\n // 按类型和名称排序\n channelOptions.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type.localeCompare(b.type);\n }\n return a.name.localeCompare(b.name);\n });\n this.channelNameOptions = channelOptions;\n }\n } catch (error) {\n console.error('Failed to fetch channel names:', error);\n }\n },\n handleDownload(key) {\n const link = document.createElement('a');\n link.href = this.getFileLink(key);\n link.download = key;\n link.click();\n },\n openDetailDialog(index, key) {\n this.detailFile = this.paginatedTableData[index];\n this.showdetailDialog = true;\n },\n handleTabClick(tab) {\n this.activeUrlTab = tab.props.name;\n },\n handleUrlClick(event) {\n // 复制到剪贴板\n navigator.clipboard.writeText(event.target.value).then(() => {\n this.$message({\n type: 'success',\n message: this.$t('dashboard.copySuccess')\n });\n }).catch(() => {\n this.$message({\n type: 'error',\n message: this.$t('dashboard.copyFailed')\n });\n });\n },\n handleDetailDelete(key) {\n this.$confirm(this.$t('dashboard.deleteConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n fetchWithAuth(`/api/manage/delete/${key}`, {\n method: 'GET'\n }).then(response => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === key);\n if (fileIndex !== -1) {\n this.tableData.splice(fileIndex, 1);\n }\n } else {\n return Promise.reject('Request failed');\n }\n }).then(() => {\n this.updateStats(-1, false);\n this.$message.success(this.$t('dashboard.deleteSuccess'));\n this.showdetailDialog = false;\n }).catch(() => this.$message.error(this.$t('dashboard.deleteFailed')));\n }).catch(() => console.log('Delete cancelled'));\n },\n handleBlock(key) {\n this.$confirm(this.$t('dashboard.blockConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n fetchWithAuth(`/api/manage/block/${key}`, {\n method: 'GET'\n }).then(response => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === key);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].metadata.ListType = 'Block';\n }\n } else {\n return Promise.reject('Request failed');\n }\n }).then(() => {\n this.$message.success(this.$t('dashboard.blockSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.blockFailed')));\n }).catch(() => console.log('Block cancelled'));\n },\n handleWhite(key) {\n this.$confirm(this.$t('dashboard.whiteConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n fetchWithAuth(`/api/manage/white/${key}`, {\n method: 'GET'\n }).then(response => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === key);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].metadata.ListType = 'White';\n }\n } else {\n return Promise.reject('Request failed');\n }\n }).then(() => {\n this.$message.success(this.$t('dashboard.whiteSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.whiteFailed')));\n }).catch(() => console.log('White cancelled'));\n },\n handleDelete(index, key) {\n // 判断是否为文件夹\n const isFolder = this.tableData.find(file => file.name === key).isFolder;\n this.$confirm(isFolder ? this.$t('dashboard.deleteFolderConfirm') : this.$t('dashboard.deleteFileConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n fetchWithAuth(`/api/manage/delete/${key}?folder=${isFolder}`, {\n method: 'GET'\n }).then(response => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === key);\n if (fileIndex !== -1) {\n this.tableData.splice(fileIndex, 1);\n }\n } else {\n return Promise.reject('Request failed');\n }\n }).then(() => {\n this.updateStats(-1, false);\n fileManager.removeFile(key);\n this.$message.success(this.$t('dashboard.deleteSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.deleteFailed')));\n }).catch(() => console.log('Delete cancelled'));\n },\n handleBatchDelete() {\n this.$confirm(this.$t('dashboard.batchDeleteConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n const promises = this.selectedFiles.map(file => {\n const isFolder = file.isFolder;\n return fetchWithAuth(`/api/manage/delete/${file.name}?folder=${isFolder}`, {\n method: 'GET'\n });\n });\n Promise.all(promises).then(results => {\n let successNum = 0;\n results.forEach((response, index) => {\n if (response.ok) {\n successNum++;\n const fileIndex = this.tableData.findIndex(file => file.name === this.selectedFiles[index].name);\n if (fileIndex !== -1) {\n this.tableData.splice(fileIndex, 1);\n }\n fileManager.removeFile(this.selectedFiles[index].name);\n }\n });\n this.selectedFiles = [];\n this.updateStats(-successNum, false);\n this.$message.success(this.$t('dashboard.batchDeleteSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.batchDeleteFailed')));\n }).catch(() => console.log('Batch delete cancelled'));\n },\n async handleBatchCopy() {\n // 分离文件和文件夹\n const files = this.selectedFiles.filter(item => !item.isFolder);\n const folders = this.selectedFiles.filter(item => item.isFolder);\n\n // 如果有文件夹,显示加载状态\n let loading = null;\n if (folders.length > 0) {\n loading = this.$loading({\n lock: true,\n text: this.$t('dashboard.fetchingFileList')\n });\n }\n try {\n // 收集所有文件(包括文件夹内的文件)\n let allFiles = [...files];\n\n // 递归获取所有文件夹内的文件\n for (const folder of folders) {\n try {\n const response = await fetchWithAuth(`/api/manage/list?dir=${encodeURIComponent(folder.name)}&recursive=true&count=-1`, {\n method: 'GET'\n });\n const data = await response.json();\n if (data.files && data.files.length > 0) {\n allFiles = allFiles.concat(data.files);\n }\n } catch (error) {\n console.error(`获取文件夹 ${folder.name} 内容失败:`, error);\n }\n }\n if (loading) loading.close();\n if (allFiles.length === 0) {\n this.$message.warning(this.$t('dashboard.noLinksAvailable'));\n return;\n }\n\n // 生成所有链接\n const links = allFiles.map(file => {\n return this.generateFileLink(file.name, file.metadata);\n }).filter(link => link);\n if (links.length === 0) {\n this.$message.warning(this.$t('dashboard.noLinksAvailable'));\n return;\n }\n\n // 复制到剪贴板\n const text = links.join('\\n');\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(text);\n this.$message.success(this.$t('dashboard.batchCopySuccess', {\n count: links.length\n }));\n } else {\n this.copyToClipboardFallback(text);\n }\n } catch (error) {\n if (loading) loading.close();\n console.error('Batch copy failed:', error);\n this.$message.error(this.$t('dashboard.batchCopyFailed'));\n }\n },\n copyToClipboardFallback(text) {\n const textarea = document.createElement('textarea');\n document.body.appendChild(textarea);\n textarea.style.position = 'fixed';\n textarea.style.clip = 'rect(0 0 0 0)';\n textarea.style.top = '10px';\n textarea.value = text;\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n this.$message.success(this.$t('dashboard.batchCopyLinksSuccess'));\n },\n handleCopy(index, key) {\n let text = '';\n if (this.paginatedTableData[index].metadata?.Channel === 'External') {\n switch (this.defaultUrlFormat) {\n case 'originUrl':\n text = this.paginatedTableData[index].metadata?.ExternalLink;\n break;\n case 'mdUrl':\n text = `![${this.paginatedTableData[index].metadata?.FileName || key}](${this.paginatedTableData[index].metadata?.ExternalLink})`;\n break;\n case 'htmlUrl':\n text = `\"${this.paginatedTableData[index].metadata?.FileName`;\n break;\n case 'bbUrl':\n text = `[img]${this.paginatedTableData[index].metadata?.ExternalLink}[/img]`;\n break;\n case 'tgId':\n text = this.paginatedTableData[index].metadata?.TgFileId || 'none';\n break;\n case 's3Location':\n text = this.paginatedTableData[index].metadata?.S3Location || 'none';\n break;\n }\n } else {\n switch (this.defaultUrlFormat) {\n case 'originUrl':\n text = `${this.rootUrl}${key}`;\n break;\n case 'mdUrl':\n text = `![${this.paginatedTableData[index].metadata?.FileName || key}](${this.rootUrl}${key})`;\n break;\n case 'htmlUrl':\n text = `\"${this.paginatedTableData[index].metadata?.FileName`;\n break;\n case 'bbUrl':\n text = `[img]${this.rootUrl}${key}[/img]`;\n break;\n case 'tgId':\n text = this.paginatedTableData[index].metadata?.TgFileId || 'none';\n break;\n case 's3Location':\n text = this.paginatedTableData[index].metadata?.S3Location || 'none';\n break;\n }\n }\n navigator.clipboard ? navigator.clipboard.writeText(text).then(() => this.$message.success(this.$t('dashboard.copyFileLinkSuccess'))) : this.copyToClipboardFallback(text);\n },\n async loadMoreData() {\n this.loading = true;\n try {\n // 传递标签参数和筛选参数到后端\n await fileManager.loadMoreFiles(this.currentPath, this.searchKeywords, this.searchIncludeTags, this.searchExcludeTags, 60, this.filters);\n // 获取新的文件列表后\n await this.fetchFileList();\n } catch (error) {\n this.$message.error(this.$t('dashboard.loadMoreFailed'));\n } finally {\n this.loading = false;\n }\n },\n updateStats(num, init = false) {\n if (init) {\n this.Number = num;\n } else {\n this.Number += num;\n }\n },\n sort(command) {\n this.sortOption = command;\n },\n sortData(data) {\n // 文件夹始终在前\n const folders = data.filter(file => file.isFolder);\n const files = data.filter(file => !file.isFolder);\n if (this.sortOption === 'dateDesc') {\n // 按时间降序\n folders.sort((a, b) => new Date(b.metadata?.TimeStamp) - new Date(a.metadata?.TimeStamp));\n files.sort((a, b) => new Date(b.metadata?.TimeStamp) - new Date(a.metadata?.TimeStamp));\n } else {\n // 按文件名升序\n folders.sort((a, b) => a.name.localeCompare(b.name));\n files.sort((a, b) => a.name.localeCompare(b.name));\n }\n return folders.concat(files);\n },\n handleVideoClick(event) {\n const videoElement = event.target;\n if (videoElement.requestFullscreen) {\n videoElement.requestFullscreen();\n } else if (videoElement.webkitRequestFullscreen) {\n // Safari/Old Chrome\n videoElement.webkitRequestFullscreen();\n } else if (videoElement.mozRequestFullScreen) {\n // Firefox\n videoElement.mozRequestFullScreen();\n } else if (videoElement.msRequestFullscreen) {\n // IE/Edge\n videoElement.msRequestFullscreen();\n }\n },\n handleLogout() {\n const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n handleSelectPage() {\n if (this.selectPage) {\n this.paginatedTableData.forEach(file => file.selected = false);\n } else {\n this.paginatedTableData.forEach(file => file.selected = true);\n }\n },\n clearSelection() {\n this.tableData.forEach(file => file.selected = false);\n this.selectedFiles = [];\n },\n handleBatchAction(command) {\n if (command === 'copy') {\n this.handleBatchCopy();\n } else if (command === 'delete') {\n this.handleBatchDelete();\n } else if (command === 'download') {\n this.handleBatchDownload();\n } else if (command === 'move') {\n this.handleBatchMove();\n } else if (command === 'tagManagement') {\n this.handleBatchTagManagement();\n } else if (command === 'ban') {\n this.handleBatchBlock();\n } else if (command === 'white') {\n this.handleBatchWhite();\n }\n },\n handleMove(index, key) {\n // 打开自定义移动对话框\n this.moveFileKey = key;\n this.moveFileIndex = index;\n this.isBatchMove = false;\n this.moveTargetPath = '/';\n this.showMoveDialog = true;\n },\n handleBatchMove() {\n // 打开自定义移动对话框(批量模式)\n this.isBatchMove = true;\n this.moveTargetPath = '/';\n this.showMoveDialog = true;\n },\n // 确认移动操作\n confirmMove(targetPath) {\n const value = targetPath;\n // 使用共享验证器验证路径\n const validation = validateFolderPath(value);\n if (!validation.valid) {\n this.$message.error(validation.error);\n return;\n }\n // 去掉开头的 /,结尾若没有 /,则加上\n const newPath = value.replace(/^\\/+/, '') + (value.endsWith('/') ? '' : value === '' ? '' : '/');\n // 判断目标文件夹是否是当前文件夹\n if (newPath === this.currentPath) {\n this.$message.warning(this.$t('dashboard.moveTargetSameAsCurrent'));\n return;\n }\n\n // 关闭对话框\n this.showMoveDialog = false;\n if (this.isBatchMove) {\n // 批量移动\n this.executeBatchMove(newPath);\n } else {\n // 单个文件移动\n this.executeSingleMove(newPath);\n }\n },\n // 执行单个文件移动\n executeSingleMove(newPath) {\n const key = this.moveFileKey;\n const isFolder = this.tableData.find(file => file.name === key)?.isFolder;\n fetchWithAuth(`/api/manage/move/${key}?folder=${isFolder}&dist=${encodeURIComponent(newPath)}`, {\n method: 'GET'\n }).then(response => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === key);\n if (fileIndex !== -1) {\n // 更新本地文件管理器\n const newKey = newPath + key.split('/').pop();\n fileManager.moveFile(key, newKey, isFolder, this.currentPath);\n // 移除文件\n this.tableData.splice(fileIndex, 1);\n // 强制重新渲染内容\n this.$nextTick(() => {\n const tempData = [...this.tableData];\n this.tableData = [];\n this.$nextTick(() => {\n this.tableData = tempData;\n });\n });\n }\n this.updateStats(-1, false);\n this.$message.success(this.$t('dashboard.moveSuccess'));\n } else {\n return Promise.reject('Request failed');\n }\n }).then(() => {\n this.refreshLocalFileList();\n }).catch(() => this.$message.error(this.$t('dashboard.moveFailed')));\n },\n // 执行批量移动\n executeBatchMove(newPath) {\n const promises = this.selectedFiles.map(file => {\n const isFolder = file.isFolder;\n return fetchWithAuth(`/api/manage/move/${file.name}?folder=${isFolder}&dist=${encodeURIComponent(newPath)}`, {\n method: 'GET'\n });\n });\n Promise.all(promises).then(results => {\n let successNum = 0;\n results.forEach((response, index) => {\n if (response.ok) {\n successNum++;\n const file = this.selectedFiles[index];\n file.selected = false;\n const fileIndex = this.tableData.findIndex(f => f.name === file.name);\n if (fileIndex !== -1) {\n // 更新本地文件管理器\n const newKey = newPath + file.name.split('/').pop();\n fileManager.moveFile(file.name, newKey, file.isFolder, this.currentPath);\n // 移除文件\n this.tableData.splice(fileIndex, 1);\n }\n }\n });\n // 强制重新渲染内容\n this.$nextTick(() => {\n const tempData = [...this.tableData];\n this.tableData = [];\n this.$nextTick(() => {\n this.tableData = tempData;\n });\n });\n this.updateStats(-successNum, false);\n this.$message.success(this.$t('dashboard.moveSuccess'));\n }).then(() => {\n this.refreshLocalFileList();\n }).catch(() => this.$message.error(this.$t('dashboard.moveFailed')));\n },\n handleBatchBlock() {\n this.$confirm(this.$t('dashboard.batchBlockConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n // 跳过文件夹\n const promises = this.selectedFiles.map(file => {\n if (file.isFolder) {\n return Promise.resolve({\n ok: false\n });\n }\n return fetchWithAuth(`/api/manage/block/${file.name}`, {\n method: 'GET'\n });\n });\n Promise.all(promises).then(results => {\n results.forEach((response, index) => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === this.selectedFiles[index].name);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].metadata.ListType = 'Block';\n }\n }\n });\n this.$message.success(this.$t('dashboard.batchBlockSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.batchBlockFailed')));\n }).catch(() => console.log('Batch block cancelled'));\n },\n handleBatchWhite() {\n this.$confirm(this.$t('dashboard.batchWhiteConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n // 跳过文件夹\n const promises = this.selectedFiles.map(file => {\n if (file.isFolder) {\n return Promise.resolve({\n ok: false\n });\n }\n return fetchWithAuth(`/api/manage/white/${file.name}`, {\n method: 'GET'\n });\n });\n Promise.all(promises).then(results => {\n results.forEach((response, index) => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === this.selectedFiles[index].name);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].metadata.ListType = 'White';\n }\n }\n });\n this.$message.success(this.$t('dashboard.batchWhiteSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.batchWhiteFailed')));\n }).catch(() => console.log('Batch white cancelled'));\n },\n handleBatchDownload() {\n // 将选中文件打包成 zip 文件下载\n const zip = new JSZip();\n const folder = zip.folder('files');\n // 构造Promise数组,等待所有文件下载完成后再打包\n const fileNameCount = {}; // 用于跟踪文件名出现的次数\n\n const downloadPromises = this.selectedFiles.map(async file => {\n // 跳过文件夹\n if (file.isFolder) {\n return;\n }\n const response = await fetch(this.getFileLink(file.name));\n const blob = await response.blob();\n // 检查文件名是否已经存在\n let fileName = file.metadata?.FileName || file.name;\n if (fileNameCount[fileName]) {\n // 如果已经存在,则在文件名后加上编号\n const extension = fileName.substring(fileName.lastIndexOf('.'));\n const baseName = fileName.substring(0, fileName.lastIndexOf('.'));\n fileName = `${baseName}(${fileNameCount[fileName]})${extension}`;\n fileNameCount[file.name]++;\n } else {\n // 如果不存在,则初始化为1\n fileNameCount[fileName] = 1;\n }\n // 将文件添加到 zip 文件夹中\n folder.file(fileName, blob);\n });\n Promise.all(downloadPromises).then(() => zip.generateAsync({\n type: 'blob'\n })).then(blob => {\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = 'files.zip';\n link.click();\n });\n },\n isVideo(file) {\n // 排除音频文件\n if (this.isAudio(file)) return false;\n let flag = file.metadata?.FileType?.includes('video');\n // 用文件名后缀判断是否为视频文件\n if (!flag) {\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'rmvb', '3gp', 'mpg', 'mpeg', 'm4v', 'f4v', 'rm', 'asf', 'dat', 'ts', 'vob', 'swf', 'divx', 'xvid', 'm2ts', 'mts', 'm2v', '3g2', '3gp2', '3gpp', '3gpp2', 'mpe', 'm1v', 'mpv', 'mpv2', 'mp2v', 'm2t', 'm2ts', 'm2v', 'm4v'];\n const extension = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();\n flag = videoExtensions.includes(extension);\n }\n return flag;\n },\n isAudio(file) {\n let flag = file.metadata?.FileType?.includes('audio');\n // 用文件名后缀判断是否为音频文件\n if (!flag) {\n const audioExtensions = ['mp3', 'wav', 'flac', 'aac', 'ogg', 'wma', 'm4a', 'ape', 'aiff', 'alac', 'opus', 'mid', 'midi', 'm4b', 'm4p', 'm4r', 'amr', 'au', 'ra', 'ram'];\n const extension = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();\n flag = audioExtensions.includes(extension);\n }\n return flag;\n },\n isImage(file) {\n let flag = file.metadata?.FileType?.includes('image');\n // 用文件名后缀判断是否为图片文件\n if (!flag) {\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'psd', 'ai', 'eps', 'raw', 'cr2', 'nef', 'orf', 'sr2', 'dng', 'arw', 'rw2', 'raf', 'pef', 'x3f', 'srf', 'erf', 'mrw', 'nrw', 'kdc', 'dcr', 'mef', 'mos', 'crw', 'raf', 'rwl', 'srw', '3fr', 'fff', 'iiq', 'qtk', 'bay', 'k25', 'kdc', 'dcs', 'drf', 'dng', 'erf', 'kdc', 'mdc', 'mef', 'mos', 'mrw', 'nef', 'nrw', 'orf', 'pef', 'ptx', 'pxn', 'r3d', 'raf', 'raw', 'rwl', 'rw2', 'rwz', 'sr2', 'srf', 'x3f'];\n const extension = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();\n flag = imageExtensions.includes(extension);\n }\n return flag;\n },\n getFileLink(filename) {\n const fileLink = process.env.NODE_ENV === 'production' ? `/file/${filename}?from=admin` : `/api/file/${filename}?from=admin`;\n return fileLink;\n },\n handlePageChange(page) {\n this.currentPage = page;\n // 到最后一页时,加载更多数据\n if (this.currentPage === Math.ceil(this.tableData.length / this.pageSize)) {\n this.loadMoreData();\n }\n },\n // 跳转到指定页码\n handleJumpPage() {\n const page = parseInt(this.jumpPage);\n if (isNaN(page) || page < 1) {\n this.$message.warning(this.$t('dashboard.invalidPageNumber'));\n return;\n }\n if (page > this.realTotalPages) {\n this.$message.warning(this.$t('dashboard.pageExceedsMax', {\n max: this.realTotalPages\n }));\n return;\n }\n // 如果目标页超过当前已加载的页数,需要先加载更多数据\n if (page > this.totalPages) {\n this.$message.info(this.$t('dashboard.loadingData'));\n this.loadMoreDataUntilPage(page);\n } else {\n this.currentPage = page;\n }\n this.jumpPage = '';\n },\n // 加载数据直到指定页\n async loadMoreDataUntilPage(targetPage) {\n this.loading = true;\n try {\n // 计算目标页需要的文件数量(不包含文件夹)\n // 目标页最后一个项目的索引 = targetPage * pageSize\n // 需要的文件数 = 目标索引 - 已有文件夹数量\n const targetIndex = targetPage * this.pageSize;\n const currentFolderCount = this.filteredTableData.filter(item => item.isFolder).length;\n const currentFileCount = this.filteredTableData.filter(item => !item.isFolder).length;\n\n // 需要加载的文件数量 = 目标位置需要的文件数 - 当前已加载的文件数\n const neededFileCount = Math.max(0, targetIndex - currentFolderCount - currentFileCount);\n if (neededFileCount > 0) {\n await fileManager.loadMoreFiles(this.currentPath, this.searchKeywords, this.searchIncludeTags, this.searchExcludeTags, neededFileCount, this.filters);\n await this.fetchFileList();\n }\n this.currentPage = Math.min(targetPage, this.totalPages);\n } catch (error) {\n this.$message.error(this.$t('dashboard.loadDataFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 判断是否为文件夹\n isFolder(item) {\n // 如果是已经标记为文件夹的项目,直接返回true\n if (item.isFolder) {\n return true;\n }\n\n // 获取真实的文件路径(去除URL前缀)\n let path = item.name;\n if (path.startsWith('http')) {\n path = path.split('/file/')[1];\n }\n\n // 如果文件名包含'/',需要判断是否是当前路径下的文件\n if (path && path.includes('/')) {\n // 获取相对于当前路径的部分\n const relativePath = this.currentPath ? path.substring(this.currentPath.length) : path;\n\n // 如果在根目录,第一个斜杠前的部分就是文件夹\n if (this.currentPath === '') {\n return !path.split('/')[0].includes('.');\n }\n\n // 如果在子文件夹中,检查相对路径是否还包含其他文件夹\n return relativePath.includes('/');\n }\n return false;\n },\n // 获取文件夹名称\n getFolderName(path) {\n let folderName = '';\n // 如果是文件夹路径,只返回最后一级文件夹名\n if (path && path.includes('/')) {\n const parts = path.split('/');\n // 如果是根目录下的文件夹\n if (this.currentPath === '') {\n folderName = parts[0];\n } else {\n // 如果是子文件夹\n const relativePath = path.substring(this.currentPath.length);\n folderName = relativePath.split('/')[0];\n }\n } else {\n folderName = path;\n }\n const maxLength = 20; // Adjust max length as needed\n if (folderName.length > maxLength) {\n const startLength = Math.floor((maxLength - 3) / 2);\n const endLength = Math.ceil((maxLength - 3) / 2);\n return `${folderName.substring(0, startLength)}...${folderName.substring(folderName.length - endLength)}`;\n }\n return folderName;\n },\n // 获取文件名称(去除路径和URL前缀)\n getFileName(path) {\n let fileName = path.split('/').pop();\n const maxLength = 20; // Adjust max length as needed, ensure it fits in one line\n if (fileName.length > maxLength) {\n const startLength = Math.floor((maxLength - 3) / 2);\n const endLength = Math.ceil((maxLength - 3) / 2);\n return `${fileName.substring(0, startLength)}...${fileName.substring(fileName.length - endLength)}`;\n }\n return fileName;\n },\n // 获取文件名前半部分(用于中间省略效果)\n getFileNameStart(name) {\n if (!name) return '';\n // 如果文件名较短,返回全部\n if (name.length <= 30) return name;\n // 保留开头部分(约60%的长度用于显示前半部分)\n const dotIndex = name.lastIndexOf('.');\n if (dotIndex > 0) {\n // 有扩展名的情况:返回文件名主体部分\n const baseName = name.substring(0, dotIndex);\n const keepLength = Math.min(baseName.length, Math.floor(name.length * 0.6));\n return baseName.substring(0, keepLength);\n }\n // 无扩展名的情况\n return name.substring(0, Math.floor(name.length * 0.6));\n },\n // 获取文件名后半部分(用于中间省略效果)\n getFileNameEnd(name) {\n if (!name) return '';\n // 如果文件名较短,返回空\n if (name.length <= 30) return '';\n // 保留末尾部分(包含扩展名)\n const dotIndex = name.lastIndexOf('.');\n if (dotIndex > 0) {\n // 有扩展名的情况:返回最后几个字符 + 扩展名\n const ext = name.substring(dotIndex);\n const baseName = name.substring(0, dotIndex);\n const keepLength = Math.min(8, Math.floor(baseName.length * 0.2));\n return '…' + baseName.substring(baseName.length - keepLength) + ext;\n }\n // 无扩展名的情况\n const keepLength = Math.min(10, Math.floor(name.length * 0.3));\n return '…' + name.substring(name.length - keepLength);\n },\n // 进入文件夹\n enterFolder(folderPath) {\n // 确保路径末尾有 '/'\n this.currentPath = folderPath + (folderPath.endsWith('/') ? '' : '/');\n // 刷新文件列表,到指定currentPath下\n this.refreshFileList();\n },\n // 导航到指定文件夹\n navigateToFolder(path) {\n // 确保空路径时不添加 '/'\n this.currentPath = path ? path + (path.endsWith('/') ? '' : '/') : '';\n // 刷新文件列表,到指定currentPath下\n this.refreshFileList();\n },\n // 获取文件列表\n async fetchFileList() {\n this.loading = true;\n try {\n // 从本地存储获取数据\n const data = fileManager.getLocalFileList();\n\n // 解析返回的数据\n const folders = new Set(data.directories || []);\n const files = data.files || [];\n\n // 处理文件夹数据\n const folderItems = Array.from(folders).map(folder => ({\n name: folder,\n isFolder: true,\n selected: false,\n metadata: {\n FileName: folder.split('/').pop()\n }\n }));\n\n // 处理文件数据\n const fileItems = files.map(file => ({\n name: file.name,\n isFolder: false,\n selected: false,\n metadata: file.metadata\n }));\n\n // 更新表格数据\n this.tableData = [...folderItems, ...fileItems];\n\n // 更新统计信息\n this.updateStats(data.totalCount, true);\n\n // 更新直接文件和文件夹数量\n this.directFileCount = data.directFileCount || 0;\n this.directFolderCount = data.directFolderCount || 0;\n } catch (error) {\n console.error('Error fetching file list:', error);\n this.$message.error(this.$t('dashboard.fetchFileListFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 刷新文件列表\n async refreshFileList() {\n this.refreshLoading = true;\n this.loading = true;\n try {\n // 传递标签参数和筛选参数到后端\n const success = await fileManager.refreshFileList(this.currentPath, this.searchKeywords, this.searchIncludeTags, this.searchExcludeTags, this.filters);\n if (success) {\n await this.fetchFileList();\n } else {\n throw new Error('Refresh failed');\n }\n } catch (error) {\n // 认证失败由 fetchWithAuth 统一处理跳转,不重复提示\n if (!error.message?.includes('Unauthorized') && this.$store.state.adminLoggedIn) {\n console.error('Error refreshing file list:', error);\n this.$message.error(this.$t('dashboard.refreshFailed'));\n }\n } finally {\n this.refreshLoading = false;\n this.loading = false;\n }\n },\n // 刷新本地文件列表\n async refreshLocalFileList() {\n this.refreshLoading = true;\n this.loading = true;\n try {\n await this.fetchFileList();\n } catch (error) {\n console.error('Error refreshing local file list:', error);\n this.$message.error(this.$t('dashboard.refreshFailed'));\n } finally {\n this.refreshLoading = false;\n this.loading = false;\n }\n },\n // Tag management methods\n handleTagManagement(fileId) {\n this.currentTagFile = fileId;\n this.showTagDialog = true;\n },\n handleBatchTagManagement() {\n if (this.selectedFiles.length === 0) {\n this.$message.warning(this.$t('dashboard.selectFilesFirst'));\n return;\n }\n this.showBatchTagDialog = true;\n },\n async handleTagsUpdated(tags) {\n // 更新本地文件数据中的标签\n const fileIndex = this.tableData.findIndex(file => file.name === this.currentTagFile);\n if (fileIndex !== -1) {\n // 更新 tableData 中的标签\n if (!this.tableData[fileIndex].metadata) {\n this.tableData[fileIndex].metadata = {};\n }\n this.tableData[fileIndex].metadata.Tags = tags;\n\n // 如果详情对话框正在显示这个文件,也更新详情数据\n if (this.showdetailDialog && this.detailFile?.name === this.currentTagFile) {\n if (!this.detailFile.metadata) {\n this.detailFile.metadata = {};\n }\n this.detailFile.metadata.Tags = tags;\n }\n }\n },\n async handleBatchTagsUpdated() {\n // 刷新文件列表以显示更新后的标签\n await this.refreshLocalFileList();\n },\n handleMetadataUpdated(fileId, updatedMetadata) {\n // 更新 tableData 中对应文件的 metadata\n const fileIndex = this.tableData.findIndex(f => f.name === fileId);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].metadata = {\n ...this.tableData[fileIndex].metadata,\n ...updatedMetadata\n };\n }\n // 如果 detailFile 正在显示该文件,同步更新 detailFile\n if (this.detailFile && this.detailFile.name === fileId) {\n this.detailFile.metadata = {\n ...this.detailFile.metadata,\n ...updatedMetadata\n };\n }\n },\n handleFileRenamed(oldFileId, newFileId, updatedMetadata) {\n // 更新 tableData 中对应文件的 name(File_ID)和 metadata\n const fileIndex = this.tableData.findIndex(f => f.name === oldFileId);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].name = newFileId;\n this.tableData[fileIndex].metadata = {\n ...this.tableData[fileIndex].metadata,\n ...updatedMetadata\n };\n }\n // 更新 detailFile 引用并关闭/重新打开详情弹窗以刷新链接\n if (this.detailFile && this.detailFile.name === oldFileId) {\n this.detailFile.name = newFileId;\n this.detailFile.metadata = {\n ...this.detailFile.metadata,\n ...updatedMetadata\n };\n // 关闭详情弹窗,然后在下一个 tick 重新打开以刷新所有链接\n this.showdetailDialog = false;\n this.$nextTick(() => {\n this.showdetailDialog = true;\n });\n }\n },\n // 生成单个文件链接\n generateFileLink(key, metadata) {\n const isExternal = metadata?.Channel === 'External';\n const baseUrl = isExternal ? metadata?.ExternalLink : `${this.rootUrl}${key}`;\n const fileName = metadata?.FileName || key;\n switch (this.defaultUrlFormat) {\n case 'originUrl':\n return baseUrl;\n case 'mdUrl':\n return `![${fileName}](${baseUrl})`;\n case 'htmlUrl':\n return `\"${fileName}\"`;\n case 'bbUrl':\n return `[img]${baseUrl}[/img]`;\n case 'tgId':\n return metadata?.TgFileId || '';\n case 's3Location':\n return metadata?.S3Location || '';\n default:\n return baseUrl;\n }\n },\n // 复制文件夹中所有文件的链接\n async handleFolderCopy(folderName) {\n // 显示加载状态\n const loading = this.$loading({\n lock: true,\n text: this.$t('dashboard.fetchingFileList')\n });\n try {\n // 调用 list API 递归获取文件夹内所有文件\n const response = await fetchWithAuth(`/api/manage/list?dir=${encodeURIComponent(folderName)}&recursive=true&count=-1`, {\n method: 'GET'\n });\n const data = await response.json();\n loading.close();\n if (!data.files || data.files.length === 0) {\n this.$message.warning(this.$t('dashboard.folderEmptyNoLinks'));\n return;\n }\n\n // 根据当前链接格式生成所有文件链接\n const links = data.files.map(file => {\n return this.generateFileLink(file.name, file.metadata);\n }).filter(link => link);\n if (links.length === 0) {\n this.$message.warning(this.$t('dashboard.noLinksAvailable'));\n return;\n }\n\n // 复制到剪贴板\n const text = links.join('\\n');\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(text);\n this.$message.success(this.$t('dashboard.copiedFileLinks', {\n count: links.length\n }));\n } else {\n this.copyToClipboardFallback(text);\n this.$message.success(this.$t('dashboard.copiedFileLinks', {\n count: links.length\n }));\n }\n } catch (error) {\n loading.close();\n console.error('Copy folder links failed:', error);\n this.$message.error(this.$t('dashboard.copyFolderLinksFailed'));\n }\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n this.loading = true;\n // 路由守卫已通过 /api/auth/sessionCheck 验证认证状态\n this.showLogoutButton = this.$store.state.adminLoggedIn;\n // 首次加载时刷新文件列表\n this.refreshFileList().then(() => {\n // 获取所有渠道名称\n return this.extractChannelNames();\n }).catch(err => {\n if (err.message !== 'Unauthorized') {\n this.$message.error(this.$t('dashboard.syncDataError'));\n }\n }).finally(() => {\n this.loading = false;\n });\n\n // 读取自定义链接设置项\n this.customUrlPrefix = this.adminUrlSettings.customUrlPrefix;\n this.useCustomUrl = this.adminUrlSettings.useCustomUrl;\n\n // 恢复视图模式偏好\n const savedViewMode = localStorage.getItem('viewMode');\n if (savedViewMode === 'card' || savedViewMode === 'list') {\n this.viewMode = savedViewMode;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./AdminDashBoard.vue?vue&type=template&id=437b7a30&scoped=true\"\nimport script from \"./AdminDashBoard.vue?vue&type=script&lang=js\"\nexport * from \"./AdminDashBoard.vue?vue&type=script&lang=js\"\n\nimport \"./AdminDashBoard.vue?vue&type=style&index=0&id=437b7a30&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-437b7a30\"]])\n\nexport default __exports__","import { renderSlot as _renderSlot, withModifiers as _withModifiers, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-tree-picker\"\n};\nconst _hoisted_2 = {\n class: \"tree-container\"\n};\nconst _hoisted_3 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_4 = {\n class: \"error-text\"\n};\nconst _hoisted_5 = {\n class: \"node-label\"\n};\nconst _hoisted_6 = {\n class: \"tree-container\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_8 = {\n class: \"error-text\"\n};\nconst _hoisted_9 = {\n class: \"node-label\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tree = _resolveComponent(\"el-tree\");\n const _component_el_popover = _resolveComponent(\"el-popover\");\n const _component_el_drawer = _resolveComponent(\"el-drawer\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [$options.isDesktop ? (_openBlock(), _createBlock(_component_el_popover, {\n key: 0,\n visible: $data.popoverVisible,\n \"onUpdate:visible\": _cache[1] || (_cache[1] = $event => $data.popoverVisible = $event),\n placement: \"bottom-start\",\n width: 320,\n trigger: \"click\",\n \"popper-class\": \"directory-tree-popover\",\n \"show-arrow\": true,\n \"hide-after\": 0,\n \"show-after\": 50,\n transition: \"el-zoom-in-top\"\n }, {\n reference: _withCtx(() => [_createElementVNode(\"span\", {\n class: \"popover-trigger-wrapper\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"]))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)])]),\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_2, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_4, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRef\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 3\n }, 8, [\"visible\"])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createElementVNode(\"span\", {\n class: \"drawer-trigger-wrapper\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.openDrawer && $options.openDrawer(...args))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)]), _createVNode(_component_el_drawer, {\n modelValue: $data.drawerVisible,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.drawerVisible = $event),\n direction: \"btt\",\n size: \"60%\",\n \"show-close\": true,\n \"with-header\": true,\n \"z-index\": 3000,\n title: _ctx.$t('directoryTree.selectDirectory'),\n class: \"directory-tree-drawer\"\n }, {\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_6, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_8, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRefMobile\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree mobile-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_9, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 1\n }, 8, [\"modelValue\", \"title\"])], 64))]);\n}","import axios from '@/utils/axios';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'DirectoryTreePicker',\n props: {\n currentDirectory: {\n type: String,\n default: ''\n },\n source: {\n type: String,\n default: 'upload',\n validator: value => ['upload', 'admin'].includes(value)\n }\n },\n data() {\n return {\n popoverVisible: false,\n drawerVisible: false,\n treeData: [],\n loading: false,\n error: '',\n treeProps: {\n children: 'children',\n label: 'name'\n },\n windowWidth: window.innerWidth\n };\n },\n computed: {\n isDesktop() {\n return this.windowWidth >= 769;\n }\n },\n watch: {\n popoverVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 弹窗关闭后延迟折叠所有节点,避免下次打开时出现折叠动画\n setTimeout(() => {\n if (!this.popoverVisible && this.$refs.treeRef) {\n const store = this.$refs.treeRef.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 200);\n }\n },\n drawerVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 抽屉关闭后延迟折叠所有节点\n setTimeout(() => {\n if (!this.drawerVisible && this.$refs.treeRefMobile) {\n const store = this.$refs.treeRefMobile.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 300);\n }\n },\n currentDirectory(newVal) {\n this.$nextTick(() => {\n if (this.$refs.treeRef && newVal) {\n this.$refs.treeRef.setCurrentKey(newVal);\n }\n if (this.$refs.treeRefMobile && newVal) {\n this.$refs.treeRefMobile.setCurrentKey(newVal);\n }\n });\n }\n },\n mounted() {\n window.addEventListener('resize', this.handleResize);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.handleResize);\n },\n methods: {\n handleResize() {\n this.windowWidth = window.innerWidth;\n },\n openDrawer() {\n this.drawerVisible = true;\n },\n async fetchDirectoryTree() {\n this.loading = true;\n this.error = '';\n try {\n let data;\n if (this.source === 'admin') {\n const response = await fetchWithAuth('/api/directoryTree', {\n method: 'GET'\n });\n if (!response.ok) {\n if (response.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.serverError');\n }\n return;\n }\n data = await response.json();\n } else {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n data = response.data;\n }\n if (data.tree) {\n this.treeData = [data.tree];\n } else {\n this.treeData = [];\n }\n } catch (err) {\n console.error('Failed to fetch directory tree:', err);\n if (err.response?.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.loadFailed');\n }\n } finally {\n this.loading = false;\n }\n },\n handleNodeClick(data) {\n let path = data.path;\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n } else if (!path) {\n path = '/';\n }\n this.$emit('select', path);\n this.popoverVisible = false;\n this.drawerVisible = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectoryTreePicker.vue?vue&type=template&id=62eab69a&scoped=true\"\nimport script from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\nexport * from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\n\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=0&id=62eab69a&scoped=true&lang=css\"\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=1&id=62eab69a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-62eab69a\"]])\n\nexport default __exports__","/*!\n\nJSZip v3.10.1 - A JavaScript class for generating and reading zip files\n\n\n(c) 2009-2016 Stuart Knightley \nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/main/LICENSE\n*/\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,h){function u(r,e){if(!o[r]){if(!a[r]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(r,!0);if(l)return l(r,!0);var n=new Error(\"Cannot find module '\"+r+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return u(t||e)},i,i.exports,s,a,o,h)}return o[r].exports}for(var l=\"function\"==typeof require&&require,e=0;e>2,s=(3&t)<<4|r>>4,a=1>6:64,o=2>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),l[h++]=t,64!==s&&(l[h++]=r),64!==a&&(l[h++]=n);return l}},{\"./support\":30,\"./utils\":32}],2:[function(e,t,r){\"use strict\";var n=e(\"./external\"),i=e(\"./stream/DataWorker\"),s=e(\"./stream/Crc32Probe\"),a=e(\"./stream/DataLengthProbe\");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a(\"data_length\")),t=this;return e.on(\"end\",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a(\"uncompressedSize\")).pipe(t.compressWorker(r)).pipe(new a(\"compressedSize\")).withStreamInfo(\"compression\",t)},t.exports=o},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(e,t,r){\"use strict\";var n=e(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(){return new n(\"STORE compression\")},uncompressWorker:function(){return new n(\"STORE decompression\")}},r.DEFLATE=e(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(e,t,r){\"use strict\";var n=e(\"./utils\");var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?\"string\"!==n.getTypeOf(e)?function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length,0):0}},{\"./utils\":32}],5:[function(e,t,r){\"use strict\";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){\"use strict\";var n=null;n=\"undefined\"!=typeof Promise?Promise:e(\"lie\"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,i=e(\"pako\"),s=e(\"./utils\"),a=e(\"./stream/GenericWorker\"),o=n?\"uint8array\":\"array\";function h(e,t){a.call(this,\"FlateWorker/\"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic=\"\\b\\0\",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new h(\"Deflate\",e)},r.uncompressWorker=function(){return new h(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(e,t,r){\"use strict\";function A(e,t){var r,n=\"\";for(r=0;r>>=8;return n}function n(e,t,r,n,i,s){var a,o,h=e.file,u=e.compression,l=s!==O.utf8encode,f=I.transformTo(\"string\",s(h.name)),c=I.transformTo(\"string\",O.utf8encode(h.name)),d=h.comment,p=I.transformTo(\"string\",s(d)),m=I.transformTo(\"string\",O.utf8encode(d)),_=c.length!==h.name.length,g=m.length!==d.length,b=\"\",v=\"\",y=\"\",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),\"UNIX\"===i?(C=798,z|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(e){return 63&(e||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+c,b+=\"up\"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+=\"uc\"+A(y.length,2)+y);var E=\"\";return E+=\"\\n\\0\",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+\"\\0\\0\\0\\0\"+A(z,4)+A(n,4)+f+b+p}}var I=e(\"../utils\"),i=e(\"../stream/GenericWorker\"),O=e(\"../utf8\"),B=e(\"../crc32\"),R=e(\"../signature\");function s(e,t,r,n){i.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,i),s.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,i.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},s.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return R.DATA_DESCRIPTOR+A(e.crc32,4)+A(e.compressedSize,4)+A(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo(\"string\",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{\"../utils\":32}],19:[function(e,t,r){\"use strict\";var n=e(\"./Uint8ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],21:[function(e,t,r){\"use strict\";var n=e(\"./ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../support\"),s=e(\"./ArrayReader\"),a=e(\"./StringReader\"),o=e(\"./NodeBufferReader\"),h=e(\"./Uint8ArrayReader\");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),\"string\"!==t||i.uint8array?\"nodebuffer\"===t?new o(e):i.uint8array?new h(n.transformTo(\"uint8array\",e)):new s(n.transformTo(\"array\",e)):new a(e)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(e,t,r){\"use strict\";r.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",r.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",r.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",r.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../utils\");function s(e){n.call(this,\"ConvertWorker to \"+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../crc32\");function s(){n.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}e(\"../utils\").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataLengthProbe for \"+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataWorker\");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":e=this.data.substring(this.index,t);break;case\"uint8array\":e=this.data.subarray(this.index,t);break;case\"array\":case\"nodebuffer\":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(e,t,r){\"use strict\";function n(e){this.name=e||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit(\"data\",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit(\"error\",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit(\"error\",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r \"+e:e}},t.exports=n},{}],29:[function(e,t,r){\"use strict\";var h=e(\"../utils\"),i=e(\"./ConvertWorker\"),s=e(\"./GenericWorker\"),u=e(\"../base64\"),n=e(\"../support\"),a=e(\"../external\"),o=null;if(n.nodestream)try{o=e(\"../nodejs/NodejsStreamOutputAdapter\")}catch(e){}function l(e,o){return new a.Promise(function(t,r){var n=[],i=e._internalType,s=e._outputType,a=e._mimeType;e.on(\"data\",function(e,t){n.push(e),o&&o(t)}).on(\"error\",function(e){n=[],r(e)}).on(\"end\",function(){try{var e=function(e,t,r){switch(e){case\"blob\":return h.newBlob(h.transformTo(\"arraybuffer\",t),r);case\"base64\":return u.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return h.nodebuffer?o.transformTo(\"nodebuffer\",e).toString(\"utf-8\"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(h.uint8array?\"uint8array\":\"array\",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(h.uint8array?\"uint8array\":\"array\",e.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}(t),i=t;n!==t.length&&(h.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,n),l.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=l},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(e,t,a){\"use strict\";var o=e(\"./support\"),h=e(\"./base64\"),r=e(\"./nodejsUtils\"),u=e(\"./external\");function n(e){return e}function l(e,t){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new h.Buf8(e.length),r=0,n=t.length;r>10&1023,o[n++]=56320|1023&i)}return l(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}},{\"./common\":41}],43:[function(e,t,r){\"use strict\";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){\"use strict\";var h,c=e(\"../utils/common\"),u=e(\"./trees\"),d=e(\"./adler32\"),p=e(\"./crc32\"),n=e(\"./messages\"),l=0,f=4,m=0,_=-2,g=-1,b=4,i=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=n[t],t}function T(e){return(e<<1)-(4e.avail_out&&(r=e.avail_out),0!==r&&(c.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){u._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&sh&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,i,s,a,o,h,u,l,f=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=f+(f-z)){for(c.arraySet(e.window,e.window,f,f,0),e.match_start-=f,e.strstart-=f,e.block_start-=f,t=r=e.hash_size;n=e.head[--t],e.head[t]=f<=n?n-f:0,--r;);for(t=r=f;n=e.prev[--t],e.prev[t]=f<=n?n-f:0,--r;);i+=f}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,h=e.strstart+e.lookahead,u=i,l=void 0,l=a.avail_in,u=x)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x)if(n=u._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=u._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===l)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,m):_},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5>8&255),U(n,n.gzhead.time>>16&255),U(n,n.gzhead.time>>24&255),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(U(n,255&n.gzhead.extra.length),U(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(U(n,0),U(n,0),U(n,0),U(n,0),U(n,0),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,3),n.status=E);else{var a=v+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=E,P(n,a),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending!==n.pending_buf_size));)U(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&F(e),n.pending+2<=n.pending_buf_size&&(U(n,255&e.adler),U(n,e.adler>>8&255),e.adler=0,n.status=E)):n.status=E),0!==n.pending){if(F(e),0===e.avail_out)return n.last_flush=-1,m}else if(0===e.avail_in&&T(t)<=T(r)&&t!==f)return R(e,-5);if(666===n.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==l&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===l)return A;break}if(e.match_length=0,r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===l)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=u._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):h[n.level].func(n,t);if(o!==O&&o!==B||(n.status=666),o===A||o===O)return 0===e.avail_out&&(n.last_flush=-1),m;if(o===I&&(1===t?u._tr_align(n):5!==t&&(u._tr_stored_block(n,0,0,!1),3===t&&(D(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),F(e),0===e.avail_out))return n.last_flush=-1,m}return t!==f?m:n.wrap<=0?1:(2===n.wrap?(U(n,255&e.adler),U(n,e.adler>>8&255),U(n,e.adler>>16&255),U(n,e.adler>>24&255),U(n,255&e.total_in),U(n,e.total_in>>8&255),U(n,e.total_in>>16&255),U(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),F(e),0=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new c.Buf8(r.w_size),c.arraySet(u,t,l-r.w_size,r.w_size,0),t=u,l=r.w_size),a=e.avail_in,o=e.next_in,h=e.input,e.avail_in=l,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,i=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<>>=y,p-=y),p<15&&(d+=z[n++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<>>=y,p-=y,(y=s-a)>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function h(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){e.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&u)){e.msg=\"unknown compression method\",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(d=r.length)&&(d=o),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,d,k)),512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,r.length-=d),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&d>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break e;o--,u+=n[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;u>>>=2,l-=2;break e;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,u+=n[s++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(d=r.length){if(o>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l>>=_,l-=_,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=30;break}k=r.lens[r.have-1],d=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l>>=_)),u>>>=3,l-=3}else{for(z=_+7;l>>=_)),u>>>=7,l-=7}if(r.have+d>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=30;break}for(;d--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=h){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,R(e,c),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){e.msg=\"invalid distance code\",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===h)break e;if(d=c-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break}p=d>r.wnext?(d-=r.wnext,r.wsize-d):r.wnext-d,d>r.length&&(d=r.length),m=r.window}else m=i,p=a-r.offset,d=r.length;for(hd?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=t[r+a[v]]}if(k>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>d-r?(e.bi_buf|=t<>d-e.bi_valid,e.bi_valid+=r-d):(e.bi_buf|=t<>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(g+1),a=0;for(n=1;n<=g;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=g;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)p<(s=h[2*h[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),h[2*n+1]=s,u>=7;n>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return o;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return h;for(t=32;t>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?J(e,t,r,n):4===e.strategy||s===i?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,m,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{\"../utils/common\":41}],53:[function(e,t,r){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(r,n){\"use strict\";if(!r.setImmediate){var i,s,t,a,o=1,h={},u=!1,l=r.document,e=Object.getPrototypeOf&&Object.getPrototypeOf(r);e=e&&e.setTimeout?e:r,i=\"[object process]\"==={}.toString.call(r.process)?function(e){process.nextTick(function(){c(e)})}:function(){if(r.postMessage&&!r.importScripts){var e=!0,t=r.onmessage;return r.onmessage=function(){e=!1},r.postMessage(\"\",\"*\"),r.onmessage=t,e}}()?(a=\"setImmediate$\"+Math.random()+\"$\",r.addEventListener?r.addEventListener(\"message\",d,!1):r.attachEvent(\"onmessage\",d),function(e){r.postMessage(a+e,\"*\")}):r.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){t.port2.postMessage(e)}):l&&\"onreadystatechange\"in l.createElement(\"script\")?(s=l.documentElement,function(e){var t=l.createElement(\"script\");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,s.removeChild(t),t=null},s.appendChild(t)}):function(e){setTimeout(c,0,e)},e.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),r=0;r | 空格 ( ) [ ] { } # % ^ ` ~ ; @ & = + $ ,\r\n const invalidChars = /[\\\\:\\*\\?\"'<>\\| \\(\\)\\[\\]\\{\\}#%\\^`~;@&=\\+\\$,]/;\r\n if (invalidChars.test(path)) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.invalidCharacters') \r\n };\r\n }\r\n \r\n return { valid: true };\r\n}\r\n"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","key","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","render","_ctx","_cache","$props","$setup","$data","$options","_component_el_input","_component_font_awesome_icon","_component_el_button","_component_DirectoryTreePicker","_component_el_dialog","_component_el_tree","_component_el_drawer","_directive_loading","isDesktop","modelValue","dialogVisible","$event","title","isBatchMove","$t","width","onClose","handleClose","footer","onClick","default","_","type","loading","handleConfirm","targetPath","placeholder","prepend","currentDirectory","source","onSelect","handleDirectorySelect","trigger","icon","direction","size","showTreePicker","text","treeError","fetchDirectoryTree","ref","data","treeData","props","treeProps","onNodeClick","handleTreeNodeClick","node","path","expanded","name","treeLoading","components","DirectoryTreePicker","Boolean","String","initialPath","emits","windowWidth","window","innerWidth","children","label","computed","get","this","set","val","$emit","watch","newVal","mounted","addEventListener","handleResize","beforeUnmount","removeEventListener","methods","response","fetchWithAuth","method","ok","status","json","tree","err","console","error","startsWith","__exports__","to","args","close","active","currentPath","navigate","pathParts","folder","index","length","style","paddingLeft","slice","join","goBack","split","filter","isFolder","handleAction","action","_component_el_tag","_component_el_tab_pane","_component_el_alert","_component_el_tabs","visible","dialogWidth","activeTab","count","fileCount","inputTag","onKeyup","handleAddInputTag","onInput","handleInputChange","clearable","append","showSuggestions","suggestions","tag","selectSuggestion","tagsToAdd","closable","removeFromToAdd","executeAddTags","disabled","commonTags","handleRemoveCommonTag","description","center","handleClearAllTags","selectedFiles","Array","required","debounceTimer","selectedFilesOnly","file","fileIds","map","loadCommonTags","resetData","newTab","tagPromises","encodeURIComponent","responses","Promise","all","allTags","push","tags","every","includes","clearTimeout","trim","setTimeout","fetchSuggestions","prefix","toLowerCase","warning","indexOf","splice","headers","body","JSON","stringify","Error","success","updated","confirm","confirmButtonText","cancelButtonText","then","executeClearTags","catch","info","_component_Loading","_component_el_icon","handleAddTag","currentTags","handleRemoveTag","popularTags","handleAddPopularTag","loadingPopularTags","Loading","fileId","loadFileTags","loadPopularTags","message","_component_el_image","_component_el_descriptions_item","_component_el_descriptions","_component_el_form_item","_component_el_form","isEditing","round","startEdit","openRenameDialog","saveMetadata","editSaving","cancelEdit","onTabClick","handleTabClick","urls","originUrl","readonly","handleUrlClick","mdUrl","htmlUrl","bbUrl","metadata","TgFileId","tgId","S3Location","S3CdnFileUrl","isVideo","src","fileLink","autoplay","muted","loop","openImageLink","isAudio","controls","isImage","fit","lazy","border","column","descColumn","editForm","FileName","FileType","fileSizeDisplay","imageDimensions","Width","Height","orientationIcon","uploadTime","Channel","ChannelName","accessTagType","accessType","Label","UploadIP","UploadAddress","Tags","showRenameDialog","closeRenameDialog","submitRename","renameSaving","renameValidation","valid","onSubmit","renameForm","newFileId","validateRenameInput","INVALID_CHARS","validateFileId","currentFileId","test","Object","fileType","endsWith","TimeStamp","Date","toLocaleString","listType","ListType","height","ratio","sizeBytes","FileSizeBytes","sizeMB","FileSize","toFixed","handleVideoClick","e","video","target","paused","play","pause","input","select","navigator","clipboard","writeText","value","open","result","oldFileId","_component_el_tooltip","selectedCount","content","placement","handleClear","actions","command","className","Number","onTouchstart","onTouchend","onTouchmove","localSelected","toggleSelect","handlePreviewClick","preload","decoding","displayName","fileNameStart","fileNameEnd","item","tagIndex","background","getTagColor","channelTag","uploadDate","selected","tagColors","parts","getFileName","uploaded","toLocaleDateString","_component_el_checkbox","_component_el_card","onChange","videoLoading","videoError","onMouseenter","handleVideoHover","onMouseleave","onFullscreenchange","handleFullscreenChange","onWebkitfullscreenchange","onLoadeddata","onError","handleVideoError","previewSrcList","disableTooltip","fileName","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","isFullscreen","document","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","currentTime","isEnter","folderName","showActions","i","validator","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_component_el_badge","_component_el_checkbox_group","_component_el_dropdown_menu","_component_el_dropdown","dropdown","localFilters","accessStatus","handleFilterChange","accessStatusOptions","option","listTypeOptions","labelOptions","fileTypeOptions","channel","channelOptions","channelNameOptions","channelName","groupedChannelNames","group","typeLabel","channels","clearFilters","activeFilterCount","hidden","filters","values","reduce","arr","groups","forEach","handler","newFilters","isArray","immediate","deep","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_component_DashboardTabs","_component_FilterDropdown","_component_el_dropdown_item","_component_el_header","_component_el_breadcrumb_item","_component_el_breadcrumb","_component_SkeletonLoader","_component_FolderCard","_component_FileCard","_component_FileListItem","_component_el_pagination","_component_el_main","_component_el_container","_component_BatchActionBar","_component_FileDetailDialog","_component_el_radio","_component_el_radio_group","_component_el_switch","_component_TagManagementDialog","_component_BatchTagDialog","_component_MobileActionSheet","_component_MobileDirectoryDrawer","_component_MoveFileDialog","tempSearch","handleSearch","suffix","onCommand","sort","sortIcon","showUrlDialog","viewMode","toggleViewMode","handleLogout","handleSelectPage","selectPageIcon","showMobileDirectoryDrawer","pop","separator","navigateToFolder","isDragging","paginatedTableData","hasSearchOrFilter","isSearchMode","onEnter","enterFolder","onCopy","handleFolderCopy","onMove","handleMove","onDelete","handleDelete","handleFolderTouchStart","handleTouchEnd","getFileLink","onDetail","openDetailDialog","handleCopy","onDownload","handleDownload","handleTouchStart","isSelectAll","isIndeterminate","handleSelectAllPage","onFolderCopy","position","left","selectionRect","top","layout","total","filteredTableData","pageSize","currentPage","pagerCount","onCurrentChange","handlePageChange","refreshFileList","refreshLoading","Math","ceil","loadMoreData","realTotalPages","jumpPage","handleJumpPage","onAction","handleBatchAction","onClear","clearSelection","showdetailDialog","detailFile","allUrl","onTagManagement","handleTagManagement","onBlock","handleBlock","onWhite","handleWhite","handleDetailDelete","onMetadataUpdated","handleMetadataUpdated","onFileRenamed","handleFileRenamed","defaultUrlFormat","useCustomUrl","customUrlPrefix","showTagDialog","currentTagFile","onTagsUpdated","handleTagsUpdated","showBatchTagDialog","handleBatchTagsUpdated","showMobileActionModal","mobileActionIsFolder","getFolderName","mobileActionFile","handleMobileAction","onNavigate","onGoBack","handleGoBack","showMoveDialog","moveTargetPath","onConfirm","confirmMove","FileManager","constructor","FILE_LIST_PATH","fileListCache","storageWarningShown","getLocalFileList","fileList","getMutableFileList","files","directories","localStorage","getItem","parse","createEmptyFileList","updateFileListCache","persisted","persistFileListCache","cacheUpdated","setItem","handleStoragePersistError","warn","removeItem","removeError","ElMessage","i18n","global","t","addFile","newFile","addFolder","moveFile","oldPath","newPath","oldFolderIndex","fileIndex","findIndex","pathArray","substring","newFolder","removeFile","removeFolder","dir","getFilesInFolder","subdirectories","buildFilterParams","params","search","includeTags","excludeTags","url","newFileList","isIndexedResponse","loadMoreFiles","start","moreFiles","fileManager","rectIntersects","rectA","rectB","right","bottom","calcSelectionRect","current","min","x","y","abs","useDragSelect","options","modes","mainSelector","items","startPoint","preSelectSnapshot","isAppendMode","MOBILE_BREAKPOINT","listenerAttached","EDGE_THRESHOLD","SCROLL_SPEED","autoScrollTimer","savedUserSelect","getActiveConfig","mode","toValue","undefined","shouldEnable","syncListenerState","attachContainerListener","cancelDrag","detachContainerListener","isBlankArea","event","mainArea","closest","config","itemEl","itemSelector","container","containerRef","contains","interactive","hasAppendModifier","shiftKey","ctrlKey","metaKey","saveSnapshot","currentItems","lastClientY","startAutoScroll","scrollStep","viewportHeight","innerHeight","scrollDelta","scrollBy","updateSelection","requestAnimationFrame","stopAutoScroll","cancelAnimationFrame","disableTextSelection","userSelect","restoreTextSelection","rect","selRect","itemElements","querySelectorAll","itemRect","getBoundingClientRect","itemBounds","intersects","onMouseDown","button","clientX","clientY","onMouseMove","onMouseUp","currentPoint","_event","onWindowResize","onMounted","onBeforeUnmount","mixins","backgroundManager","directFileCount","directFolderCount","showLogoutButton","tableData","searchKeywords","searchIncludeTags","searchExcludeTags","sortOption","isUploading","activeUrlTab","mobileActionIndex","longPressTimer","moveFileKey","moveFileIndex","DashboardTabs","TagManagementDialog","BatchTagDialog","SkeletonLoader","FileCard","FolderCard","FileListItem","FileDetailDialog","BatchActionBar","MobileActionSheet","MobileDirectoryDrawer","FilterDropdown","MoveFileDialog","LanguageSwitcher","setup","cardContainerRef","listContainerRef","viewModeRef","itemsRef","card","list","totalPages","sortedData","sortData","end","fullList","concat","detailDialogWidth","ExternalLink","rootUrl","tableColumnNum","tablePreviewSpan","selectPage","selectedPageFiles","some","userConfig","urlPrefix","location","origin","newData","newOption","newFormat","$store","commit","parentPath","colors","formatFileSize","bytes","isNaN","units","searchText","excludeTagRegex","replace","match","includeTagRegex","log","extractChannelNames","typeLabels","telegram","cfr2","s3","discord","huggingface","webdav","entries","channelList","a","b","localeCompare","link","createElement","href","download","click","tab","$message","$confirm","reject","updateStats","find","handleBatchDelete","promises","results","successNum","handleBatchCopy","folders","$loading","lock","allFiles","links","generateFileLink","copyToClipboardFallback","textarea","appendChild","clip","execCommand","removeChild","fetchFileList","num","init","videoElement","fetch","credentials","authType","finally","$router","handleBatchDownload","handleBatchMove","handleBatchTagManagement","handleBatchBlock","handleBatchWhite","validation","executeBatchMove","executeSingleMove","newKey","$nextTick","tempData","refreshLocalFileList","f","resolve","zip","fileNameCount","downloadPromises","async","blob","extension","lastIndexOf","baseName","generateAsync","URL","createObjectURL","flag","videoExtensions","audioExtensions","imageExtensions","filename","page","parseInt","max","loadMoreDataUntilPage","targetPage","targetIndex","currentFolderCount","currentFileCount","neededFileCount","relativePath","maxLength","startLength","floor","endLength","getFileNameStart","dotIndex","keepLength","getFileNameEnd","ext","folderPath","Set","folderItems","from","fileItems","totalCount","state","adminLoggedIn","updatedMetadata","isExternal","baseUrl","initializeBackground","adminUrlSettings","savedViewMode","_component_el_popover","popoverVisible","transition","reference","$slots","handleNodeClick","openDrawer","drawerVisible","$refs","treeRef","store","nodesMap","treeRefMobile","setCurrentKey","axios","withAuthCode","module","exports","s","o","h","u","r","l","n","code","call","d","c","p","encode","getTypeOf","charCodeAt","charAt","decode","substr","uint8array","Uint8Array","compressedSize","uncompressedSize","crc32","compression","compressedContent","prototype","getContentWorker","pipe","uncompressWorker","on","streamInfo","data_length","getCompressedWorker","withStreamInfo","createWorkerFrom","compressWorker","STORE","magic","DEFLATE","base64","binary","createFolders","date","compressionOptions","comment","unixPermissions","dosPermissions","lie","Uint16Array","Uint32Array","_pako","_pakoAction","_pakoOptions","meta","inherits","processChunk","_createPako","transformTo","flush","cleanUp","raw","level","onData","pako","A","fromCharCode","O","utf8encode","I","m","g","v","w","k","S","z","C","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCFullYear","getUTCMonth","getUTCDate","B","E","fileRecord","R","LOCAL_FILE_HEADER","dirRecord","CENTRAL_FILE_HEADER","bytesWritten","zipComment","zipPlatform","encodeFileName","streamFiles","accumulate","contentBuffer","dirRecords","currentSourceOffset","entriesCount","currentFile","_sources","percent","openedSource","closedSource","DATA_DESCRIPTOR","shift","CENTRAL_DIRECTORY_END","prepareNextSource","previous","isPaused","resume","registerPrevious","generatedError","generateWorker","platform","_compressWorker","arguments","create","root","clone","loadAsync","support","defaults","version","external","decompressed","extend","checkCRC32","optimizedBinaryString","decodeFileName","utf8decode","isNode","isStream","prepareContent","load","fileNameStr","fileCommentStr","unsafeOriginalName","_upstreamEnded","_bindStream","_stream","Readable","_helper","emit","_read","Buffer","newBufferFrom","allocBuffer","alloc","fill","isBuffer","toUpperCase","toString","remove","generate","generateInternalStream","mimeType","checkSupport","generateNodeStream","toNodejsStream","stream","byteAt","zero","lastIndexOfSignature","readAndCheckSignature","readData","checkOffset","checkIndex","setIndex","skip","readInt","readString","readDate","UTC","subarray","ZIP64_CENTRAL_DIRECTORY_LOCATOR","ZIP64_CENTRAL_DIRECTORY_END","destType","propName","dataIsReady","_tickScheduled","_tickAndRepeat","delay","isFinished","_tick","extraStreamInfo","isLocked","_listeners","mergeStreamInfo","hasOwnProperty","nodestream","_internalType","_outputType","_mimeType","newBlob","apply","_worker","objectMode","array","string","arraybuffer","ArrayBuffer","nodebuffer","Blob","self","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","getBlob","leftOver","applyFromCharCode","Utf8DecodeWorker","Utf8EncodeWorker","stringifyByChunk","stringifyByChar","applyCanBeUsed","buffer","byteLength","MAX_VALUE_16BITS","MAX_VALUE_32BITS","pretty","setImmediate","FileReader","onload","onerror","readAsArrayBuffer","setimmediate","loadOptions","checkSignature","reader","isSignature","readBlockEndOfCentral","diskNumber","diskWithCentralDirStart","centralDirRecordsOnThisDisk","centralDirRecords","centralDirSize","centralDirOffset","zipCommentLength","readBlockZip64EndOfCentral","zip64EndOfCentralSize","zip64ExtensibleData","id","readBlockZip64EndOfCentralLocator","diskWithZip64CentralDirStart","relativeOffsetEndOfZip64CentralDir","disksCount","readLocalFiles","localHeaderOffset","readLocalPart","handleUTF8","processAttributes","readCentralDir","zip64","readCentralPart","readEndOfCentral","prepareReader","isEncrypted","bitFlag","useUTF8","fileNameLength","compressionMethod","versionMadeBy","extraFieldsLength","fileCommentLength","diskNumberStart","internalFileAttributes","externalFileAttributes","readExtraFields","parseZIP64ExtraField","fileComment","extraFields","findExtraFieldUnicodePath","findExtraFieldUnicodeComment","_data","_dataBinary","internalStream","_decompressWorker","nodeStream","MutationObserver","WebKitMutationObserver","createTextNode","observe","characterData","MessageChannel","onreadystatechange","parentNode","documentElement","port1","onmessage","port2","postMessage","TypeError","queue","outcome","promise","onFulfilled","callFulfilled","otherCallFulfilled","onRejected","callRejected","otherCallRejected","race","assign","chunkSize","windowBits","memLevel","strategy","gzip","msg","ended","chunks","strm","avail_out","deflateInit2","header","deflateSetHeader","dictionary","string2buf","deflateSetDictionary","_dict_set","next_in","avail_in","output","Buf8","next_out","deflate","onEnd","buf2binstring","shrinkBuf","deflateEnd","flattenChunks","Deflate","deflateRaw","inflateInit2","Z_OK","inflateGetHeader","Z_FINISH","Z_NO_FLUSH","binstring2buf","inflate","Z_NEED_DICT","inflateSetDictionary","Z_BUF_ERROR","Z_STREAM_END","Z_SYNC_FLUSH","utf8border","buf2string","arraySet","inflateEnd","Inflate","inflateRaw","ungzip","Int32Array","setTyped","Buf16","Buf32","Z_PARTIAL_FLUSH","Z_FULL_FLUSH","Z_BLOCK","Z_TREES","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","T","D","F","pending","pending_buf","pending_out","total_out","N","_tr_flush_block","block_start","strstart","U","P","L","max_chain_length","prev_length","nice_match","w_size","w_mask","prev","good_match","lookahead","match_start","j","window_size","hash_size","head","wrap","adler","total_in","insert","ins_h","hash_shift","hash_mask","Z","match_length","_tr_tally","max_lazy_match","last_lit","W","prev_match","match_available","M","good_length","max_lazy","nice_length","max_chain","func","H","pending_buf_size","gzhead","gzindex","last_flush","w_bits","hash_bits","dyn_ltree","dyn_dtree","bl_tree","l_desc","d_desc","bl_desc","bl_count","heap","heap_len","heap_max","depth","l_buf","lit_bufsize","d_buf","opt_len","static_len","matches","bi_buf","bi_valid","G","data_type","_tr_init","K","Y","deflateInit","deflateReset","deflateResetKeep","hcrc","extra","time","os","_tr_align","_tr_stored_block","deflateInfo","xflags","extra_len","done","dmax","wsize","whave","wnext","hold","bits","lencode","distcode","lenbits","distbits","sane","last","havedict","flags","check","wbits","offset","ncode","nlen","ndist","have","next","lens","work","lendyn","distdyn","back","was","inflateReset","inflateReset2","inflateResetKeep","inflateInit","inflateInfo","static_tree","extra_bits","extra_base","elems","max_length","has_stree","dyn_tree","max_code","stat_desc","X","V","q","J","getPrototypeOf","process","nextTick","importScripts","random","attachEvent","Function","callback","clearImmediate","validateFolderPath","strict","dotPattern","invalidChars"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/770.865557c0.js.map.gz b/frontend-dist/js/770.865557c0.js.map.gz deleted file mode 100644 index ac01ee87d5cc83812e21dd7058f26ecbe1be5a3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145433 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

    soT{`->wRRK2Ds}RIfyU%W`-$-*E+!bKwJ8 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 diff --git a/frontend-dist/js/997.7b6c8b5a.js b/frontend-dist/js/997.7b6c8b5a.js new file mode 100644 index 00000000..29089520 --- /dev/null +++ b/frontend-dist/js/997.7b6c8b5a.js @@ -0,0 +1,2 @@ +(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[997],{4885:function(e,t,a){"use strict";a(85331)},13378:function(e,t,a){"use strict";a(85331),a(38736),a(79899)},15616:function(e,t,a){"use strict";a(85331),a(97197)},20174:function(e,t,a){"use strict";a.r(t),a.d(t,{default:function(){return hn}});var i=a(99114),n=(a(85331),a(30694),a(49385)),s=(a(37952),a(31802)),r=(a(13378),a(9267)),o=(a(15616),a(33892)),l=a(80047),d=(a(99648),a(39623)),c=(a(29092),a(56768)),h=a(24232);const u={class:"move-file-dialog-wrapper"},f={class:"move-dialog-content"},m={class:"move-path-input-container"},p={class:"move-dialog-hint"},g={class:"dialog-footer"},b={class:"move-drawer-content"},v={class:"move-path-section"},k={class:"move-path-label"},y={class:"move-path-input-row"},_={class:"move-dialog-hint"},w={key:0,class:"embedded-tree-section"},F={class:"tree-section-header"},C={class:"tree-section-title"},T={class:"tree-container"},$={key:0,class:"error-state"},L={class:"error-text"},S={class:"node-label"},x={class:"drawer-footer"};function D(e,t,a,D,E,A){const I=d.WK,U=(0,c.g2)("font-awesome-icon"),z=l.S2,B=o.A,W=r.kZ,P=s.qk,R=n.pw,O=i.A;return(0,c.uX)(),(0,c.CE)("div",u,[A.isDesktop?((0,c.uX)(),(0,c.Wv)(W,{key:0,modelValue:A.dialogVisible,"onUpdate:modelValue":t[1]||(t[1]=e=>A.dialogVisible=e),title:a.isBatchMove?e.$t("moveFile.batchTitle"):e.$t("moveFile.title"),width:"500px","show-close":!0,class:"move-dialog",onClose:A.handleClose},{footer:(0,c.k6)(()=>[(0,c.Lk)("span",g,[(0,c.bF)(z,{onClick:A.handleClose},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.cancel")),1)]),_:1},8,["onClick"]),(0,c.bF)(z,{type:"primary",loading:E.loading,onClick:A.handleConfirm},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.confirm")),1)]),_:1},8,["loading","onClick"])])]),default:(0,c.k6)(()=>[(0,c.Lk)("div",f,[(0,c.Lk)("div",m,[(0,c.bF)(I,{modelValue:E.targetPath,"onUpdate:modelValue":t[0]||(t[0]=e=>E.targetPath=e),placeholder:e.$t("moveFile.targetPlaceholder"),class:"move-path-input"},{prepend:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.targetDirectory")),1)]),_:1},8,["modelValue","placeholder"]),(0,c.bF)(B,{"current-directory":a.currentDirectory,source:"admin",onSelect:A.handleDirectorySelect},{trigger:(0,c.k6)(()=>[(0,c.bF)(z,{class:"directory-picker-trigger"},{default:(0,c.k6)(()=>[(0,c.bF)(U,{icon:"folder-tree"})]),_:1})]),_:1},8,["current-directory","onSelect"])]),(0,c.Lk)("p",p,(0,h.v_)(e.$t("moveFile.hint")),1)])]),_:1},8,["modelValue","title","onClose"])):((0,c.uX)(),(0,c.Wv)(R,{key:1,modelValue:A.dialogVisible,"onUpdate:modelValue":t[5]||(t[5]=e=>A.dialogVisible=e),title:a.isBatchMove?e.$t("moveFile.batchTitle"):e.$t("moveFile.title"),direction:"btt",size:"auto","show-close":!0,class:"move-drawer",onClose:A.handleClose},{footer:(0,c.k6)(()=>[(0,c.Lk)("div",x,[(0,c.bF)(z,{onClick:A.handleClose,class:"footer-btn"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.cancel")),1)]),_:1},8,["onClick"]),(0,c.bF)(z,{type:"primary",loading:E.loading,onClick:A.handleConfirm,class:"footer-btn"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.confirm")),1)]),_:1},8,["loading","onClick"])])]),default:(0,c.k6)(()=>[(0,c.Lk)("div",b,[(0,c.Lk)("div",v,[(0,c.Lk)("div",k,(0,h.v_)(e.$t("moveFile.targetDirectory")),1),(0,c.Lk)("div",y,[(0,c.bF)(I,{modelValue:E.targetPath,"onUpdate:modelValue":t[2]||(t[2]=e=>E.targetPath=e),placeholder:e.$t("moveFile.targetPlaceholder"),class:"move-path-input"},null,8,["modelValue","placeholder"]),(0,c.bF)(z,{class:"directory-picker-trigger",onClick:t[3]||(t[3]=e=>E.showTreePicker=!0)},{default:(0,c.k6)(()=>[(0,c.bF)(U,{icon:"folder-tree"})]),_:1})]),(0,c.Lk)("p",_,(0,h.v_)(e.$t("moveFile.hintMobile")),1)]),E.showTreePicker?((0,c.uX)(),(0,c.CE)("div",w,[(0,c.Lk)("div",F,[(0,c.Lk)("span",C,(0,h.v_)(e.$t("moveFile.selectDirectory")),1),(0,c.bF)(z,{text:"",onClick:t[4]||(t[4]=e=>E.showTreePicker=!1)},{default:(0,c.k6)(()=>[(0,c.bF)(U,{icon:"times"})]),_:1})]),(0,c.bo)(((0,c.uX)(),(0,c.CE)("div",T,[E.treeError?((0,c.uX)(),(0,c.CE)("div",$,[(0,c.bF)(U,{icon:"exclamation-circle",class:"error-icon"}),(0,c.Lk)("span",L,(0,h.v_)(E.treeError),1),(0,c.bF)(z,{type:"primary",size:"small",onClick:A.fetchDirectoryTree},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("moveFile.retry")),1)]),_:1},8,["onClick"])])):((0,c.uX)(),(0,c.Wv)(P,{key:1,ref:"treeRef",data:E.treeData,props:E.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":a.currentDirectory,class:"directory-tree",onNodeClick:A.handleTreeNodeClick},{default:(0,c.k6)(({node:e,data:t})=>[(0,c.Lk)("span",{class:(0,h.C4)(["tree-node",{"is-current":t.path===a.currentDirectory}])},[(0,c.bF)(U,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,c.Lk)("span",S,(0,h.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[O,E.treeLoading]])])):(0,c.Q3)("",!0)])]),_:1},8,["modelValue","title","onClose"]))])}var E=a(70797),A={name:"MoveFileDialog",components:{DirectoryTreePicker:o.A},props:{modelValue:{type:Boolean,default:!1},currentDirectory:{type:String,default:""},isBatchMove:{type:Boolean,default:!1},initialPath:{type:String,default:"/"}},emits:["update:modelValue","confirm","close"],data(){return{targetPath:"/",loading:!1,windowWidth:window.innerWidth,showTreePicker:!1,treeData:[],treeLoading:!1,treeError:"",treeProps:{children:"children",label:"name"}}},computed:{dialogVisible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},isDesktop(){return this.windowWidth>768}},watch:{modelValue(e){e&&(this.targetPath=this.initialPath||"/",this.showTreePicker=!1)},showTreePicker(e){e&&!this.isDesktop&&this.fetchDirectoryTree()}},mounted(){window.addEventListener("resize",this.handleResize)},beforeUnmount(){window.removeEventListener("resize",this.handleResize)},methods:{handleResize(){this.windowWidth=window.innerWidth},handleDirectorySelect(e){this.targetPath=e},handleConfirm(){this.$emit("confirm",this.targetPath)},handleClose(){this.$emit("update:modelValue",!1),this.$emit("close")},async fetchDirectoryTree(){this.treeLoading=!0,this.treeError="";try{const e=await(0,E.A)("/api/directoryTree",{method:"GET"});if(!e.ok)return void(401===e.status?this.treeError=this.$t("moveFile.authFailed"):this.treeError=this.$t("moveFile.serverError"));const t=await e.json();t.tree?this.treeData=[t.tree]:this.treeData=[]}catch(e){console.error("Failed to fetch directory tree:",e),this.treeError=this.$t("moveFile.loadTreeFailed")}finally{this.treeLoading=!1}},handleTreeNodeClick(e){let t=e.path;t&&!t.startsWith("/")?t="/"+t:t||(t="/"),this.targetPath=t,this.showTreePicker=!1}}},I=a(71241);const U=(0,I.A)(A,[["render",D],["__scopeId","data-v-7aaa437c"]]);var z=U,B=a(45130);const W={class:"mobile-drawer-header"},P={class:"mobile-drawer-title"},R={class:"mobile-drawer-content"},O=["onClick"];function N(e,t,a,i,n,s){const r=(0,c.g2)("font-awesome-icon");return(0,c.uX)(),(0,c.Wv)(c.Im,{to:"body"},[(0,c.bF)(B.eB,{name:"drawer-slide"},{default:(0,c.k6)(()=>[a.modelValue?((0,c.uX)(),(0,c.CE)("div",{key:0,class:"mobile-drawer-overlay",onClick:t[3]||(t[3]=(...e)=>s.close&&s.close(...e))},[(0,c.Lk)("div",{class:"mobile-drawer",onClick:t[2]||(t[2]=(0,B.D$)(()=>{},["stop"]))},[(0,c.Lk)("div",W,[(0,c.Lk)("span",P,(0,h.v_)(e.$t("mobileDirectory.title")),1),(0,c.bF)(r,{icon:"times",class:"mobile-drawer-close",onClick:s.close},null,8,["onClick"])]),(0,c.Lk)("div",R,[(0,c.Lk)("div",{class:(0,h.C4)(["mobile-drawer-item",{active:!a.currentPath}]),onClick:t[0]||(t[0]=e=>s.navigate(""))},[(0,c.bF)(r,{icon:"home",class:"mobile-drawer-item-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileDirectory.rootDirectory")),1)],2),((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.pathParts,(e,t)=>((0,c.uX)(),(0,c.CE)("div",{key:t,class:(0,h.C4)(["mobile-drawer-item",{active:t===s.pathParts.length-1}]),style:(0,h.Tr)({paddingLeft:16*(t+1)+16+"px"}),onClick:e=>s.navigate(s.pathParts.slice(0,t+1).join("/"))},[(0,c.bF)(r,{icon:"folder",class:"mobile-drawer-item-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e),1)],14,O))),128)),a.currentPath?((0,c.uX)(),(0,c.CE)("div",{key:0,class:"mobile-drawer-back",onClick:t[1]||(t[1]=(...e)=>s.goBack&&s.goBack(...e))},[(0,c.bF)(r,{icon:"arrow-left",class:"mobile-drawer-item-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileDirectory.goBack")),1)])):(0,c.Q3)("",!0)])])])):(0,c.Q3)("",!0)]),_:1})])}a(18111),a(22489);var M={name:"MobileDirectoryDrawer",props:{modelValue:{type:Boolean,default:!1},currentPath:{type:String,default:""}},emits:["update:modelValue","navigate","goBack"],computed:{pathParts(){return this.currentPath.split("/").filter(Boolean)}},methods:{close(){this.$emit("update:modelValue",!1)},navigate(e){this.$emit("navigate",e),this.close()},goBack(){this.$emit("goBack"),this.close()}}};const V=(0,I.A)(M,[["render",N],["__scopeId","data-v-768efd1f"]]);var X=V;const j={class:"bottom-sheet-header"},K={class:"bottom-sheet-title"},Z={class:"bottom-sheet-content"};function G(e,t,a,i,n,s){const r=(0,c.g2)("font-awesome-icon");return(0,c.uX)(),(0,c.Wv)(c.Im,{to:"body"},[(0,c.bF)(B.eB,{name:"bottom-sheet"},{default:(0,c.k6)(()=>[a.modelValue?((0,c.uX)(),(0,c.CE)("div",{key:0,class:"bottom-sheet-overlay",onClick:t[9]||(t[9]=(...e)=>s.close&&s.close(...e))},[(0,c.Lk)("div",{class:"bottom-sheet",onClick:t[8]||(t[8]=(0,B.D$)(()=>{},["stop"]))},[(0,c.Lk)("div",j,[t[10]||(t[10]=(0,c.Lk)("div",{class:"bottom-sheet-handle"},null,-1)),(0,c.Lk)("span",K,(0,h.v_)(a.title),1)]),(0,c.Lk)("div",Z,[a.isFolder?((0,c.uX)(),(0,c.CE)(c.FK,{key:1},[(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[5]||(t[5]=e=>s.handleAction("folderCopy"))},[(0,c.bF)(r,{icon:"copy",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.copyLink")),1)]),(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[6]||(t[6]=e=>s.handleAction("move"))},[(0,c.bF)(r,{icon:"file-export",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.moveFolder")),1)])],64)):((0,c.uX)(),(0,c.CE)(c.FK,{key:0},[(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[0]||(t[0]=e=>s.handleAction("detail"))},[(0,c.bF)(r,{icon:"info-circle",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.viewDetail")),1)]),(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[1]||(t[1]=e=>s.handleAction("copy"))},[(0,c.bF)(r,{icon:"copy",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.copyLink")),1)]),(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[2]||(t[2]=e=>s.handleAction("download"))},[(0,c.bF)(r,{icon:"download",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.downloadFile")),1)]),(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[3]||(t[3]=e=>s.handleAction("move"))},[(0,c.bF)(r,{icon:"file-export",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.moveFile")),1)]),(0,c.Lk)("div",{class:"bottom-sheet-item",onClick:t[4]||(t[4]=e=>s.handleAction("tag"))},[(0,c.bF)(r,{icon:"tags",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("mobileAction.tagManagement")),1)])],64)),(0,c.Lk)("div",{class:"bottom-sheet-item bottom-sheet-danger",onClick:t[7]||(t[7]=e=>s.handleAction("delete"))},[(0,c.bF)(r,{icon:"trash-alt",class:"bottom-sheet-icon"}),(0,c.Lk)("span",null,(0,h.v_)(a.isFolder?e.$t("mobileAction.deleteFolder"):e.$t("mobileAction.deleteFile")),1)])])])])):(0,c.Q3)("",!0)]),_:1})])}var H={name:"MobileActionSheet",props:{modelValue:{type:Boolean,default:!1},title:{type:String,default:""},isFolder:{type:Boolean,default:!1}},emits:["update:modelValue","action"],methods:{close(){this.$emit("update:modelValue",!1)},handleAction(e){this.$emit("action",e),this.close()}}};const q=(0,I.A)(H,[["render",G],["__scopeId","data-v-62bb601c"]]);var Q=q,Y=a(4275),J=a(89559),ee=a(12687);a(18785);const te={class:"batch-tag-container"},ae={class:"tab-content"},ie={class:"tab-description"},ne={class:"input-section"},se={key:0,class:"suggestions-panel"},re=["onClick"],oe={class:"tags-to-add-section"},le={key:0,class:"tags-container"},de={key:1,class:"empty-message"},ce={class:"action-buttons"},he={class:"tab-content"},ue={class:"tab-description"},fe={key:0,class:"common-tags-section"},me={class:"tags-container"},pe={key:1,class:"empty-message"},ge={class:"tab-content"},be={class:"tab-description"},ve={class:"action-buttons"};function ke(e,t,a,i,n,s){const o=(0,c.g2)("font-awesome-icon"),u=l.S2,f=d.WK,m=ee.u,p=Y.v$,g=J.KR,b=Y.q,v=r.kZ;return(0,c.uX)(),(0,c.Wv)(v,{title:e.$t("batchTag.title"),modelValue:s.visible,"onUpdate:modelValue":t[2]||(t[2]=e=>s.visible=e),width:s.dialogWidth,onClose:s.handleClose},{default:(0,c.k6)(()=>[(0,c.Lk)("div",te,[(0,c.bF)(b,{modelValue:n.activeTab,"onUpdate:modelValue":t[1]||(t[1]=e=>n.activeTab=e),type:"border-card"},{default:(0,c.k6)(()=>[(0,c.bF)(p,{label:e.$t("batchTag.addTab"),name:"add"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",ae,[(0,c.Lk)("p",ie,(0,h.v_)(e.$t("batchTag.addDescription",{count:s.fileCount})),1),(0,c.Lk)("div",ne,[(0,c.bF)(f,{modelValue:n.inputTag,"onUpdate:modelValue":t[0]||(t[0]=e=>n.inputTag=e),placeholder:e.$t("batchTag.inputPlaceholder"),onKeyup:(0,B.jR)(s.handleAddInputTag,["enter"]),onInput:s.handleInputChange,clearable:""},{append:(0,c.k6)(()=>[(0,c.bF)(u,{onClick:s.handleAddInputTag,type:"primary"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"plus"})]),_:1},8,["onClick"])]),_:1},8,["modelValue","placeholder","onKeyup","onInput"]),n.showSuggestions&&n.suggestions.length>0?((0,c.uX)(),(0,c.CE)("div",se,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.suggestions,e=>((0,c.uX)(),(0,c.CE)("div",{key:e,class:"suggestion-item",onClick:t=>s.selectSuggestion(e)},(0,h.v_)(e),9,re))),128))])):(0,c.Q3)("",!0)]),(0,c.Lk)("div",oe,[(0,c.Lk)("h4",null,(0,h.v_)(e.$t("batchTag.pendingTags")),1),n.tagsToAdd.length>0?((0,c.uX)(),(0,c.CE)("div",le,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.tagsToAdd,e=>((0,c.uX)(),(0,c.Wv)(m,{key:e,closable:"",onClose:t=>s.removeFromToAdd(e),class:"tag-item"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1032,["onClose"]))),128))])):((0,c.uX)(),(0,c.CE)("div",de,(0,h.v_)(e.$t("batchTag.noPendingTags")),1))]),(0,c.Lk)("div",ce,[(0,c.bF)(u,{type:"primary",onClick:s.executeAddTags,loading:n.loading,disabled:0===n.tagsToAdd.length},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("batchTag.addToAllFiles")),1)]),_:1},8,["onClick","loading","disabled"])])])]),_:1},8,["label"]),(0,c.bF)(p,{label:e.$t("batchTag.removeTab"),name:"remove"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",he,[(0,c.Lk)("p",ue,(0,h.v_)(e.$t("batchTag.removeDescription")),1),n.commonTags.length>0?((0,c.uX)(),(0,c.CE)("div",fe,[(0,c.Lk)("h4",null,(0,h.v_)(e.$t("batchTag.commonTags")),1),(0,c.Lk)("div",me,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.commonTags,e=>((0,c.uX)(),(0,c.Wv)(m,{key:e,closable:"",onClose:t=>s.handleRemoveCommonTag(e),class:"tag-item",type:"warning"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1032,["onClose"]))),128))])])):((0,c.uX)(),(0,c.CE)("div",pe,(0,h.v_)(e.$t("batchTag.noCommonTags")),1))])]),_:1},8,["label"]),(0,c.bF)(p,{label:e.$t("batchTag.clearTab"),name:"clear"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",ge,[(0,c.Lk)("p",be,(0,h.v_)(e.$t("batchTag.clearDescription",{count:s.fileCount})),1),(0,c.bF)(g,{title:e.$t("batchTag.clearWarningTitle"),type:"warning",description:e.$t("batchTag.clearWarningDesc"),closable:!1,style:{"margin-bottom":"20px"},center:""},null,8,["title","description"]),(0,c.Lk)("div",ve,[(0,c.bF)(u,{type:"danger",onClick:s.handleClearAllTags,loading:n.loading},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("batchTag.confirmClearAll")),1)]),_:1},8,["onClick","loading"])])])]),_:1},8,["label"])]),_:1},8,["modelValue"])])]),_:1},8,["title","modelValue","width","onClose"])}a(44114),a(61701),a(33110);var ye=a(51219),_e=a(12933),we={name:"BatchTagDialog",props:{modelValue:{type:Boolean,default:!1},selectedFiles:{type:Array,required:!0,default:()=>[]}},emits:["update:modelValue","tagsUpdated"],data(){return{activeTab:"add",inputTag:"",tagsToAdd:[],commonTags:[],suggestions:[],showSuggestions:!1,loading:!1,debounceTimer:null}},computed:{visible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},dialogWidth(){return window.innerWidth<768?"90%":"600px"},selectedFilesOnly(){return this.selectedFiles.filter(e=>!e.isFolder)},fileCount(){return this.selectedFilesOnly.length},fileIds(){return this.selectedFilesOnly.map(e=>e.name)}},watch:{visible(e){e?this.loadCommonTags():this.resetData()},activeTab(e){"remove"===e&&this.loadCommonTags()}},methods:{resetData(){this.tagsToAdd=[],this.inputTag="",this.showSuggestions=!1,this.activeTab="add"},async loadCommonTags(){if(0!==this.selectedFilesOnly.length)try{const e=this.selectedFilesOnly.map(e=>(0,E.A)(`/api/manage/tags/${encodeURIComponent(e.name)}`,{method:"GET"})),t=await Promise.all(e),a=[];for(const i of t)if(i.ok){const e=await i.json();a.push(e.tags||[])}a.length>0?this.commonTags=a[0].filter(e=>a.every(t=>t.includes(e))):this.commonTags=[]}catch(e){console.error("Error loading common tags:",e),ye.nk.error(this.$t("batchTag.loadCommonTagsFailed"))}else this.commonTags=[]},handleInputChange(){clearTimeout(this.debounceTimer),this.inputTag&&0!==this.inputTag.trim().length?this.debounceTimer=setTimeout(()=>{this.fetchSuggestions()},300):this.showSuggestions=!1},async fetchSuggestions(){try{const e=this.inputTag.trim().toLowerCase(),t=await(0,E.A)(`/api/manage/tags/autocomplete?prefix=${encodeURIComponent(e)}&limit=10`,{method:"GET"});if(t.ok){const e=await t.json();this.suggestions=(e.tags||[]).filter(e=>!this.tagsToAdd.includes(e)),this.showSuggestions=this.suggestions.length>0}}catch(e){console.error("Error fetching suggestions:",e)}},selectSuggestion(e){this.inputTag=e,this.showSuggestions=!1,this.handleAddInputTag()},handleAddInputTag(){const e=this.inputTag.trim();if(e){if(this.tagsToAdd.includes(e))return ye.nk.warning(this.$t("batchTag.tagAlreadyInList")),this.inputTag="",void(this.showSuggestions=!1);this.tagsToAdd.push(e),this.inputTag="",this.showSuggestions=!1}},removeFromToAdd(e){const t=this.tagsToAdd.indexOf(e);t>-1&&this.tagsToAdd.splice(t,1)},async executeAddTags(){if(0!==this.tagsToAdd.length){this.loading=!0;try{const e=await(0,E.A)("/api/manage/tags/batch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({fileIds:this.fileIds,action:"add",tags:this.tagsToAdd})});if(!e.ok)throw new Error(this.$t("batchTag.addFailed"));{const t=await e.json();if(!(t.success||t.updated>0))throw new Error(this.$t("batchTag.addFailed"));ye.nk.success(this.$t("batchTag.addSuccess",{count:t.updated})),this.$emit("tagsUpdated"),this.tagsToAdd=[]}}catch(e){console.error("Error adding tags:",e),ye.nk.error(this.$t("batchTag.addFailed"))}finally{this.loading=!1}}else ye.nk.warning(this.$t("batchTag.pleaseAddTags"))},async handleRemoveCommonTag(e){this.loading=!0;try{const t=await(0,E.A)("/api/manage/tags/batch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({fileIds:this.fileIds,action:"remove",tags:[e]})});if(!t.ok)throw new Error(this.$t("batchTag.removeFailed"));{const e=await t.json();if(!(e.success||e.updated>0))throw new Error(this.$t("batchTag.removeFailed"));ye.nk.success(this.$t("batchTag.removeSuccess",{count:e.updated})),this.$emit("tagsUpdated"),await this.loadCommonTags()}}catch(t){console.error("Error removing tag:",t),ye.nk.error(this.$t("batchTag.removeFailed"))}finally{this.loading=!1}},handleClearAllTags(){_e.s.confirm(this.$t("batchTag.clearConfirmMessage",{count:this.fileCount}),this.$t("batchTag.clearConfirmTitle"),{confirmButtonText:this.$t("batchTag.clearConfirmOk"),cancelButtonText:this.$t("batchTag.clearConfirmCancel"),type:"warning"}).then(()=>{this.executeClearTags()}).catch(()=>{ye.nk.info(this.$t("batchTag.clearCancelled"))})},async executeClearTags(){this.loading=!0;try{const e=await(0,E.A)("/api/manage/tags/batch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({fileIds:this.fileIds,action:"set",tags:[]})});if(!e.ok)throw new Error(this.$t("batchTag.clearFailed"));{const t=await e.json();if(!(t.success||t.updated>0))throw new Error(this.$t("batchTag.clearFailed"));ye.nk.success(this.$t("batchTag.clearSuccess",{count:t.updated})),this.$emit("tagsUpdated"),this.commonTags=[]}}catch(e){console.error("Error clearing tags:",e),ye.nk.error(this.$t("batchTag.clearFailed"))}finally{this.loading=!1}},handleClose(){this.visible=!1}}};const Fe=(0,I.A)(we,[["render",ke],["__scopeId","data-v-ec3adcfc"]]);var Ce=Fe,Te=a(813);a(34896);const $e={class:"tag-management-container"},Le={class:"input-section"},Se={key:0,class:"suggestions-panel"},xe=["onClick"],De={class:"current-tags-section"},Ee={key:0,class:"tags-container"},Ae={key:1,class:"empty-message"},Ie={class:"popular-tags-section"},Ue={key:0,class:"tags-container"},ze={key:1,class:"empty-message"},Be={key:2,class:"empty-message"},We={class:"dialog-footer"};function Pe(e,t,a,i,n,s){const o=(0,c.g2)("font-awesome-icon"),u=l.S2,f=d.WK,m=ee.u,p=(0,c.g2)("Loading"),g=Te.tk,b=r.kZ;return(0,c.uX)(),(0,c.Wv)(b,{title:e.$t("tagManagement.title"),modelValue:s.visible,"onUpdate:modelValue":t[1]||(t[1]=e=>s.visible=e),width:s.dialogWidth,onClose:s.handleClose},{footer:(0,c.k6)(()=>[(0,c.Lk)("span",We,[(0,c.bF)(u,{onClick:s.handleClose},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("tagManagement.close")),1)]),_:1},8,["onClick"])])]),default:(0,c.k6)(()=>[(0,c.Lk)("div",$e,[(0,c.Lk)("div",Le,[(0,c.bF)(f,{modelValue:n.inputTag,"onUpdate:modelValue":t[0]||(t[0]=e=>n.inputTag=e),placeholder:e.$t("tagManagement.inputPlaceholder"),onKeyup:(0,B.jR)(s.handleAddTag,["enter"]),onInput:s.handleInputChange,clearable:""},{append:(0,c.k6)(()=>[(0,c.bF)(u,{onClick:s.handleAddTag,type:"primary"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"plus"})]),_:1},8,["onClick"])]),_:1},8,["modelValue","placeholder","onKeyup","onInput"]),n.showSuggestions&&n.suggestions.length>0?((0,c.uX)(),(0,c.CE)("div",Se,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.suggestions,e=>((0,c.uX)(),(0,c.CE)("div",{key:e,class:"suggestion-item",onClick:t=>s.selectSuggestion(e)},(0,h.v_)(e),9,xe))),128))])):(0,c.Q3)("",!0)]),(0,c.Lk)("div",De,[(0,c.Lk)("h4",null,(0,h.v_)(e.$t("tagManagement.currentTags")),1),n.currentTags.length>0?((0,c.uX)(),(0,c.CE)("div",Ee,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.currentTags,e=>((0,c.uX)(),(0,c.Wv)(m,{key:e,closable:"",onClose:t=>s.handleRemoveTag(e),class:"tag-item"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1032,["onClose"]))),128))])):((0,c.uX)(),(0,c.CE)("div",Ae,(0,h.v_)(e.$t("tagManagement.noTags")),1))]),(0,c.Lk)("div",Ie,[(0,c.Lk)("h4",null,(0,h.v_)(e.$t("tagManagement.popularTags")),1),n.popularTags.length>0?((0,c.uX)(),(0,c.CE)("div",Ue,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.popularTags,e=>((0,c.uX)(),(0,c.Wv)(m,{key:e,onClick:t=>s.handleAddPopularTag(e),class:"tag-item clickable",type:"info"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1032,["onClick"]))),128))])):n.loadingPopularTags?((0,c.uX)(),(0,c.CE)("div",ze,[(0,c.bF)(g,{class:"is-loading"},{default:(0,c.k6)(()=>[(0,c.bF)(p)]),_:1}),(0,c.eW)(" "+(0,h.v_)(e.$t("tagManagement.loading")),1)])):((0,c.uX)(),(0,c.CE)("div",Be,(0,h.v_)(e.$t("tagManagement.noPopularTags")),1))])])]),_:1},8,["title","modelValue","width","onClose"])}var Re=a(57477),Oe={name:"TagManagementDialog",components:{Loading:Re.Loading},props:{modelValue:{type:Boolean,default:!1},fileId:{type:String,required:!0}},emits:["update:modelValue","tagsUpdated"],data(){return{currentTags:[],inputTag:"",suggestions:[],popularTags:[],showSuggestions:!1,loading:!1,loadingPopularTags:!1,debounceTimer:null}},computed:{visible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},dialogWidth(){return window.innerWidth<768?"90%":"500px"}},watch:{visible(e){e&&(this.loadFileTags(),this.loadPopularTags())}},methods:{async loadFileTags(){try{const e=await(0,E.A)(`/api/manage/tags/${encodeURIComponent(this.fileId)}`,{method:"GET"});if(!e.ok)throw new Error("Failed to load tags");{const t=await e.json();this.currentTags=t.tags||[]}}catch(e){console.error("Error loading file tags:",e),ye.nk.error(this.$t("tagManagement.loadFailed"))}},async loadPopularTags(){this.loadingPopularTags=!0;try{const e=await(0,E.A)("/api/manage/tags/autocomplete?limit=20",{method:"GET"});if(e.ok){const t=await e.json();this.popularTags=(t.tags||[]).filter(e=>!this.currentTags.includes(e))}}catch(e){console.error("Error loading popular tags:",e)}finally{this.loadingPopularTags=!1}},handleInputChange(){clearTimeout(this.debounceTimer),this.inputTag&&0!==this.inputTag.trim().length?this.debounceTimer=setTimeout(()=>{this.fetchSuggestions()},300):this.showSuggestions=!1},async fetchSuggestions(){try{const e=this.inputTag.trim().toLowerCase(),t=await(0,E.A)(`/api/manage/tags/autocomplete?prefix=${encodeURIComponent(e)}&limit=10`,{method:"GET"});if(t.ok){const e=await t.json();this.suggestions=(e.tags||[]).filter(e=>!this.currentTags.includes(e)),this.showSuggestions=this.suggestions.length>0}}catch(e){console.error("Error fetching suggestions:",e)}},selectSuggestion(e){this.inputTag=e,this.showSuggestions=!1,this.handleAddTag()},async handleAddTag(){const e=this.inputTag.trim();if(e){if(this.currentTags.includes(e))return ye.nk.warning(this.$t("tagManagement.tagExists")),this.inputTag="",void(this.showSuggestions=!1);try{const t=await(0,E.A)(`/api/manage/tags/${encodeURIComponent(this.fileId)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"add",tags:[e]})});if(!t.ok){const e=await t.json();throw new Error(e.message||this.$t("tagManagement.addFailed"))}{const e=await t.json();this.currentTags=e.tags||[],this.inputTag="",this.showSuggestions=!1,ye.nk.success(this.$t("tagManagement.addSuccess")),this.$emit("tagsUpdated",this.currentTags),this.loadPopularTags()}}catch(t){console.error("Error adding tag:",t),ye.nk.error(t.message||this.$t("tagManagement.addFailed"))}}},async handleRemoveTag(e){try{const t=await(0,E.A)(`/api/manage/tags/${encodeURIComponent(this.fileId)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"remove",tags:[e]})});if(!t.ok)throw new Error(this.$t("tagManagement.removeFailed"));{const e=await t.json();this.currentTags=e.tags||[],ye.nk.success(this.$t("tagManagement.removeSuccess")),this.$emit("tagsUpdated",this.currentTags),this.loadPopularTags()}}catch(t){console.error("Error removing tag:",t),ye.nk.error(this.$t("tagManagement.removeFailed"))}},handleAddPopularTag(e){this.inputTag=e,this.handleAddTag()},handleClose(){this.visible=!1,this.inputTag="",this.showSuggestions=!1,this.currentTags=[],this.popularTags=[]}}};const Ne=(0,I.A)(Oe,[["render",Pe],["__scopeId","data-v-689f94e2"]]);var Me=Ne,Ve=a(55558),Xe=(a(10456),a(66810)),je=(a(34396),a(4885),a(82006)),Ke=(a(98642),a(63003),a(59869)),Ze=(a(70415),a(73565),a(57009));a(78450);const Ge={class:"detail-actions"},He={class:"preview-section"},qe={class:"preview-content"},Qe=["src"],Ye=["src"],Je={key:1},et={key:1},tt={key:0,style:{display:"flex","align-items":"center",gap:"6px"}},at={key:1,style:{color:"#909399"}},it={key:0,style:{display:"flex","flex-wrap":"wrap",gap:"5px"}},nt={key:1,style:{color:"#909399"}};function st(e,t,a,i,n,s){const o=(0,c.g2)("font-awesome-icon"),u=l.S2,f=d.WK,m=Y.v$,p=Y.q,g=Ze.Zq,b=Ke.MF,v=ee.u,k=Ke.TS,y=je.xE,_=je.US,w=r.kZ;return(0,c.uX)(),(0,c.Wv)(w,{title:e.$t("fileDetail.title"),modelValue:s.visible,"onUpdate:modelValue":t[24]||(t[24]=e=>s.visible=e),width:s.dialogWidth},{default:(0,c.k6)(()=>[(0,c.Lk)("div",Ge,[n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:0,type:"primary",onClick:t[0]||(t[0]=t=>e.$emit("download")),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"download",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.download")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:1,type:"primary",onClick:t[1]||(t[1]=t=>e.$emit("tagManagement")),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"tags",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.tags")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:2,type:"primary",onClick:t[2]||(t[2]=t=>e.$emit("block")),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"ban",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.blacklist")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:3,type:"primary",onClick:t[3]||(t[3]=t=>e.$emit("white")),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"shield-alt",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.whitelist")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:4,type:"danger",onClick:t[4]||(t[4]=t=>e.$emit("delete")),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"trash-alt",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.deleteBtn")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:5,type:"warning",onClick:t[5]||(t[5]=e=>s.startEdit()),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"edit",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.edit")),1)]),_:1})),n.isEditing?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(u,{key:6,type:"info",onClick:t[6]||(t[6]=e=>s.openRenameDialog()),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{icon:"i-cursor",style:{"margin-right":"3px"}}),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.rename")),1)]),_:1})),n.isEditing?((0,c.uX)(),(0,c.Wv)(u,{key:7,type:"success",onClick:t[7]||(t[7]=e=>s.saveMetadata()),round:"",size:"small",class:"detail-action",loading:n.editSaving},{default:(0,c.k6)(()=>[n.editSaving?(0,c.Q3)("",!0):((0,c.uX)(),(0,c.Wv)(o,{key:0,icon:"save",style:{"margin-right":"3px"}})),(0,c.eW)(" "+(0,h.v_)(e.$t("fileDetail.save")),1)]),_:1},8,["loading"])):(0,c.Q3)("",!0),n.isEditing?((0,c.uX)(),(0,c.Wv)(u,{key:8,onClick:t[8]||(t[8]=e=>s.cancelEdit()),round:"",size:"small",class:"detail-action"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("fileDetail.cancel")),1)]),_:1})):(0,c.Q3)("",!0)]),(0,c.bF)(p,{modelValue:n.activeTab,"onUpdate:modelValue":t[16]||(t[16]=e=>n.activeTab=e),onTabClick:s.handleTabClick,style:{"margin-bottom":"10px"}},{default:(0,c.k6)(()=>[(0,c.bF)(m,{label:e.$t("fileDetail.originUrl"),name:"originUrl"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.originUrl,"onUpdate:modelValue":t[9]||(t[9]=e=>a.urls.originUrl=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1},8,["label"]),(0,c.bF)(m,{label:"Markdown",name:"mdUrl"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.mdUrl,"onUpdate:modelValue":t[10]||(t[10]=e=>a.urls.mdUrl=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1}),(0,c.bF)(m,{label:"HTML",name:"htmlUrl"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.htmlUrl,"onUpdate:modelValue":t[11]||(t[11]=e=>a.urls.htmlUrl=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1}),(0,c.bF)(m,{label:"BBCode",name:"bbUrl"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.bbUrl,"onUpdate:modelValue":t[12]||(t[12]=e=>a.urls.bbUrl=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1}),a.file?.metadata?.TgFileId?((0,c.uX)(),(0,c.Wv)(m,{key:0,label:"TG File ID",name:"tgId"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.tgId,"onUpdate:modelValue":t[13]||(t[13]=e=>a.urls.tgId=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1})):(0,c.Q3)("",!0),a.file?.metadata?.S3Location?((0,c.uX)(),(0,c.Wv)(m,{key:1,label:"S3 Location",name:"s3Location"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.S3Location,"onUpdate:modelValue":t[14]||(t[14]=e=>a.urls.S3Location=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1})):(0,c.Q3)("",!0),a.file?.metadata?.S3CdnFileUrl?((0,c.uX)(),(0,c.Wv)(m,{key:2,label:"S3 CDN URL",name:"s3CdnFileUrl"},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:a.urls.S3CdnFileUrl,"onUpdate:modelValue":t[15]||(t[15]=e=>a.urls.S3CdnFileUrl=e),readonly:"",onClick:s.handleUrlClick},null,8,["modelValue","onClick"])]),_:1})):(0,c.Q3)("",!0)]),_:1},8,["modelValue","onTabClick"]),(0,c.Lk)("div",He,[(0,c.Lk)("div",qe,[s.isVideo?((0,c.uX)(),(0,c.CE)("video",{key:0,src:a.fileLink,autoplay:"",muted:"",loop:"",class:"video-preview",onClick:t[17]||(t[17]=(...e)=>s.openImageLink&&s.openImageLink(...e))},null,8,Qe)):s.isAudio?((0,c.uX)(),(0,c.CE)("audio",{key:1,src:a.fileLink,controls:"",autoplay:"",class:"audio-preview"},null,8,Ye)):s.isImage?((0,c.uX)(),(0,c.Wv)(g,{key:2,src:a.fileLink,"preview-src-list":[a.fileLink],"preview-teleported":!0,fit:"contain",lazy:"",class:"image-preview"},null,8,["src","preview-src-list"])):((0,c.uX)(),(0,c.Wv)(o,{key:3,icon:"file",class:"file-icon-detail"}))])]),(0,c.bF)(k,{border:"",column:s.descColumn},{default:(0,c.k6)(()=>[(0,c.bF)(b,{label:e.$t("fileDetail.fileNameLabel")},{default:(0,c.k6)(()=>[n.isEditing?((0,c.uX)(),(0,c.Wv)(f,{key:0,modelValue:n.editForm.FileName,"onUpdate:modelValue":t[18]||(t[18]=e=>n.editForm.FileName=e),size:"small",placeholder:e.$t("fileDetail.fileNamePlaceholder")},null,8,["modelValue","placeholder"])):((0,c.uX)(),(0,c.CE)("span",Je,(0,h.v_)(a.file?.metadata?.FileName||a.file?.name),1))]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.fileType")},{default:(0,c.k6)(()=>[n.isEditing?((0,c.uX)(),(0,c.Wv)(f,{key:0,modelValue:n.editForm.FileType,"onUpdate:modelValue":t[19]||(t[19]=e=>n.editForm.FileType=e),size:"small",placeholder:e.$t("fileDetail.fileTypePlaceholder")},null,8,["modelValue","placeholder"])):((0,c.uX)(),(0,c.CE)("span",et,(0,h.v_)(a.file?.metadata?.FileType||e.$t("fileDetail.unknown")),1))]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.fileSizeLabel")},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(s.fileSizeDisplay),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.imageDimensions")},{default:(0,c.k6)(()=>[s.imageDimensions?((0,c.uX)(),(0,c.CE)("div",tt,[(0,c.Lk)("span",null,(0,h.v_)(a.file?.metadata?.Width)+" × "+(0,h.v_)(a.file?.metadata?.Height),1),(0,c.bF)(v,{size:"small",type:"info",style:{display:"inline-flex","align-items":"center","justify-content":"center"}},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(s.orientationIcon),1)]),_:1})])):((0,c.uX)(),(0,c.CE)("span",at,(0,h.v_)(e.$t("fileDetail.noDimensions")),1))]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.uploadTimeLabel")},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(s.uploadTime),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.channelTypeAndName")},{default:(0,c.k6)(()=>[(0,c.bF)(v,{size:"small",type:"info",style:{"margin-right":"6px"}},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(a.file?.metadata?.Channel||e.$t("fileDetail.unknown")),1)]),_:1}),(0,c.Lk)("span",null,(0,h.v_)(a.file?.metadata?.ChannelName||"-"),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.accessStatusAndReview")},{default:(0,c.k6)(()=>[(0,c.bF)(v,{size:"small",type:s.accessTagType,style:{"margin-right":"6px"}},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(s.accessType),1)]),_:1},8,["type"]),(0,c.Lk)("span",null,(0,h.v_)(a.file?.metadata?.Label||e.$t("fileDetail.noTags")),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.uploadIP")},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(a.file?.metadata?.UploadIP||e.$t("fileDetail.unknown")),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.uploadAddressLabel")},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(a.file?.metadata?.UploadAddress||e.$t("fileDetail.unknown")),1)]),_:1},8,["label"]),(0,c.bF)(b,{label:e.$t("fileDetail.fileTags")},{default:(0,c.k6)(()=>[a.file?.metadata?.Tags&&a.file?.metadata?.Tags.length>0?((0,c.uX)(),(0,c.CE)("div",it,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(a.file?.metadata?.Tags,e=>((0,c.uX)(),(0,c.Wv)(v,{key:e,size:"small"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1024))),128))])):((0,c.uX)(),(0,c.CE)("span",nt,(0,h.v_)(e.$t("fileDetail.noTags")),1))]),_:1},8,["label"])]),_:1},8,["column"]),(0,c.bF)(w,{modelValue:n.showRenameDialog,"onUpdate:modelValue":t[23]||(t[23]=e=>n.showRenameDialog=e),title:e.$t("fileDetail.renameTitle"),width:s.dialogWidth,"append-to-body":""},{footer:(0,c.k6)(()=>[(0,c.bF)(u,{onClick:t[21]||(t[21]=e=>s.closeRenameDialog())},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("fileDetail.renameCancel")),1)]),_:1}),(0,c.bF)(u,{type:"primary",onClick:t[22]||(t[22]=e=>s.submitRename()),loading:n.renameSaving,disabled:!n.renameValidation.valid},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("fileDetail.renameConfirm")),1)]),_:1},8,["loading","disabled"])]),default:(0,c.k6)(()=>[(0,c.bF)(_,{onSubmit:(0,B.D$)(s.submitRename,["prevent"])},{default:(0,c.k6)(()=>[(0,c.bF)(y,{label:e.$t("fileDetail.renameLabel"),error:n.renameValidation.error},{default:(0,c.k6)(()=>[(0,c.bF)(f,{modelValue:n.renameForm.newFileId,"onUpdate:modelValue":t[20]||(t[20]=e=>n.renameForm.newFileId=e),placeholder:e.$t("fileDetail.renamePlaceholder"),onInput:s.validateRenameInput,clearable:""},null,8,["modelValue","placeholder","onInput"])]),_:1},8,["label","error"])]),_:1},8,["onSubmit"])]),_:1},8,["modelValue","title","width"])]),_:1},8,["title","modelValue","width"])}const rt=/[\\:\*\?"'<>\| \(\)\[\]\{\}#%\^`~;@&=\+\$,]/;function ot(e,t){return e&&""!==e.trim()?e===t?{valid:!1,error:"文件名未发生变化"}:e.includes("..")?{valid:!1,error:'文件名不能包含路径穿越字符 ".."'}:/\/\.\//.test(e)||/^\.\//.test(e)?{valid:!1,error:'文件名不能包含单独的 "." 路径段'}:rt.test(e)?{valid:!1,error:"文件名包含非法字符,请使用合法的文件名格式"}:e.includes("//")?{valid:!1,error:"文件名不能包含连续的斜杠"}:{valid:!0}:{valid:!1,error:"文件名不能为空"}}var lt={name:"FileDetailDialog",props:{modelValue:{type:Boolean,default:!1},file:{type:Object,default:null},fileLink:{type:String,default:""},urls:{type:Object,default:()=>({originUrl:"",mdUrl:"",htmlUrl:"",bbUrl:"",tgId:"",S3Location:"",S3CdnFileUrl:""})}},emits:["update:modelValue","download","tagManagement","block","white","delete","metadataUpdated","fileRenamed"],watch:{visible(e){e||(this.isEditing=!1,this.editSaving=!1)}},data(){return{activeTab:"originUrl",isEditing:!1,editForm:{FileName:"",FileType:""},editSaving:!1,showRenameDialog:!1,renameForm:{newFileId:""},renameValidation:{valid:!0,error:""},renameSaving:!1}},computed:{visible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},dialogWidth(){return window.innerWidth<768?"95%":"900px"},descColumn(){return window.innerWidth<768?1:2},isVideo(){const e=this.file?.metadata?.FileType?.toLowerCase()||"";if(e.includes("video"))return!0;const t=this.file?.name?.toLowerCase()||"";return t.endsWith(".mp4")||t.endsWith(".webm")||t.endsWith(".mov")||t.endsWith(".avi")},isAudio(){const e=this.file?.metadata?.FileType?.toLowerCase()||"";if(e.includes("audio"))return!0;const t=this.file?.name?.toLowerCase()||"";return t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")||t.endsWith(".flac")},isImage(){const e=this.file?.metadata?.FileType?.toLowerCase()||"";if(e.includes("image"))return!0;const t=this.file?.name?.toLowerCase()||"";return t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".png")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")||t.endsWith(".bmp")||t.endsWith(".avif")||t.endsWith(".heic")||t.endsWith(".heif")},uploadTime(){return this.file?.metadata?.TimeStamp?new Date(this.file.metadata.TimeStamp).toLocaleString():this.$t("fileDetail.unknown")},accessType(){const e=this.file?.metadata?.ListType,t=this.file?.metadata?.Label;return"White"===e?this.$t("fileDetail.accessNormalWhitelist"):"Block"===e?this.$t("fileDetail.accessBlockedBlacklist"):"adult"===t?this.$t("fileDetail.accessBlockedReview"):this.$t("fileDetail.accessNormal")},accessTagType(){const e=this.file?.metadata?.ListType,t=this.file?.metadata?.Label;return"White"===e?"success":"Block"===e||"adult"===t?"danger":"success"},imageDimensions(){const e=this.file?.metadata?.Width,t=this.file?.metadata?.Height;return!(!e||!t)||null},orientationIcon(){const e=this.file?.metadata?.Width,t=this.file?.metadata?.Height;if(!e||!t)return"";const a=e/t;return a>1.1?this.$t("fileDetail.orientationLandscape"):a<.9?this.$t("fileDetail.orientationPortrait"):this.$t("fileDetail.orientationSquare")},fileSizeDisplay(){const e=this.file?.metadata?.FileSizeBytes,t=this.file?.metadata?.FileSize;return e?e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(2)} KB`:`${(e/1024/1024).toFixed(2)} MB`:t?`${t} MB`:this.$t("fileDetail.unknown")}},methods:{handleVideoClick(e){const t=e.target;t.paused?t.play():t.pause()},handleTabClick(){},handleUrlClick(e){const t=e.target;t.select(),navigator.clipboard.writeText(t.value).then(()=>{ye.nk.success(this.$t("fileDetail.linkCopied"))})},openImageLink(){this.fileLink&&window.open(this.fileLink,"_blank")},startEdit(){this.editForm.FileName=this.file?.metadata?.FileName||"",this.editForm.FileType=this.file?.metadata?.FileType||"",this.isEditing=!0},cancelEdit(){this.isEditing=!1,this.editForm.FileName=this.file?.metadata?.FileName||"",this.editForm.FileType=this.file?.metadata?.FileType||"",this.editSaving=!1},async saveMetadata(){this.editSaving=!0;try{const e=this.file.name,t=await(0,E.A)(`/api/manage/metadata/${e}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({FileName:this.editForm.FileName,FileType:this.editForm.FileType})});if(!t.ok){const e=await t.json().catch(()=>({}));throw new Error(e.message||this.$t("fileDetail.metadataSaveFailed"))}{const a=await t.json();ye.nk.success(this.$t("fileDetail.metadataSaved")),this.isEditing=!1,this.$emit("metadataUpdated",e,a.metadata)}}catch(e){console.error("Error saving metadata:",e),ye.nk.error(e.message||this.$t("fileDetail.metadataSaveFailed"))}finally{this.editSaving=!1}},openRenameDialog(){this.renameForm.newFileId=this.file?.name||"",this.renameValidation={valid:!0,error:""},this.showRenameDialog=!0},closeRenameDialog(){this.showRenameDialog=!1,this.renameForm.newFileId="",this.renameValidation={valid:!0,error:""}},validateRenameInput(){const e=ot(this.renameForm.newFileId,this.file?.name||"");this.renameValidation={valid:e.valid,error:e.error||""}},async submitRename(){if(!this.renameSaving&&(this.validateRenameInput(),this.renameValidation.valid)){this.renameSaving=!0;try{const e=this.file.name,t=await(0,E.A)(`/api/manage/rename/${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({newFileId:this.renameForm.newFileId})});if(t.ok){const a=await t.json();ye.nk.success(this.$t("fileDetail.renameSuccess")),this.showRenameDialog=!1,this.$emit("fileRenamed",e,this.renameForm.newFileId,a.metadata)}else{if(409!==t.status){const e=await t.json().catch(()=>({}));throw new Error(e.message||this.$t("fileDetail.renameFailed"))}this.renameValidation={valid:!1,error:this.$t("fileDetail.renameConflict")}}}catch(e){console.error("Error renaming file:",e),ye.nk.error(e.message||this.$t("fileDetail.renameFailed"))}finally{this.renameSaving=!1}}}}};const dt=(0,I.A)(lt,[["render",st],["__scopeId","data-v-3f80812c"]]);var ct=dt,ht=a(78507);a(213);const ut={key:0,class:"batch-floating-bar"},ft={class:"batch-selection-summary"},mt={class:"batch-selection-count"},pt={class:"batch-floating-actions"};function gt(e,t,a,i,n,s){const r=(0,c.g2)("font-awesome-icon"),o=l.S2,d=ht.R7;return(0,c.uX)(),(0,c.Wv)(B.eB,{name:"batch-toolbar"},{default:(0,c.k6)(()=>[a.selectedCount>0?((0,c.uX)(),(0,c.CE)("div",ut,[(0,c.bF)(d,{disabled:s.disableTooltip,content:e.$t("dashboard.clearSelection"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{class:"batch-floating-btn ghost","aria-label":e.$t("dashboard.clearSelection"),onClick:s.handleClear},{default:(0,c.k6)(()=>[(0,c.bF)(r,{icon:"times",class:"batch-floating-icon"})]),_:1},8,["aria-label","onClick"])]),_:1},8,["disabled","content"]),(0,c.bF)(d,{disabled:s.disableTooltip,content:`${a.selectedCount} ${e.$t("dashboard.selectedItems")}`,placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",ft,[(0,c.Lk)("span",mt,(0,h.v_)(a.selectedCount),1)])]),_:1},8,["disabled","content"]),t[0]||(t[0]=(0,c.Lk)("span",{class:"batch-toolbar-divider"},null,-1)),(0,c.Lk)("div",pt,[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.actions,t=>((0,c.uX)(),(0,c.Wv)(d,{key:t.command,disabled:s.disableTooltip,content:e.$t(t.label),placement:"top"},{default:(0,c.k6)(()=>[(0,c.bF)(o,{class:(0,h.C4)(["batch-floating-btn",t.className]),"aria-label":e.$t(t.label),onClick:e=>s.handleAction(t.command)},{default:(0,c.k6)(()=>[(0,c.bF)(r,{icon:t.icon,class:"batch-floating-icon"},null,8,["icon"])]),_:2},1032,["class","aria-label","onClick"])]),_:2},1032,["disabled","content"]))),128))])])):(0,c.Q3)("",!0)]),_:1})}var bt={name:"BatchActionBar",props:{selectedCount:{type:Number,required:!0}},emits:["action","clear"],data(){return{actions:[{command:"copy",label:"dashboard.copy",icon:"copy",className:"copy"},{command:"download",label:"dashboard.download",icon:"download",className:"download"},{command:"move",label:"dashboard.move",icon:"file-export",className:"move"},{command:"tagManagement",label:"dashboard.tagManagement",icon:"tags",className:"tag"},{command:"ban",label:"dashboard.addToBlacklist",icon:"ban",className:"ban"},{command:"white",label:"dashboard.addToWhitelist",icon:"shield-alt",className:"white"},{command:"delete",label:"dashboard.delete",icon:"trash-alt",className:"danger"}]}},computed:{disableTooltip(){return window.innerWidth<768}},methods:{handleAction(e){this.$emit("action",e)},handleClear(){this.$emit("clear")}}};const vt=(0,I.A)(bt,[["render",gt],["__scopeId","data-v-4937e2f0"]]);var kt=vt,yt=a(54880),_t=(a(4318),a(77815));a(72907);const wt={class:"list-col list-col-checkbox"},Ft=["src"],Ct=["src"],Tt=["title"],$t={class:"filename-start"},Lt={class:"filename-end"},St={class:"list-col list-col-tags"},xt={key:1,class:"list-empty"},Dt={class:"list-col list-col-channel"},Et={class:"list-col list-col-channel-name"},At={key:0,class:"channel-name-box"},It={key:1,class:"list-empty"},Ut={class:"list-col list-col-address"},zt={key:0,class:"address-box"},Bt={key:1,class:"list-empty"},Wt={class:"list-col list-col-size"},Pt={class:"list-col list-col-date"},Rt={class:"list-col list-col-actions"};function Ot(e,t,a,i,n,s){const r=(0,c.g2)("font-awesome-icon"),o=ht.R7;return(0,c.uX)(),(0,c.CE)("div",{class:"list-item",onTouchstart:t[9]||(t[9]=t=>e.$emit("touchstart",t)),onTouchend:t[10]||(t[10]=t=>e.$emit("touchend",t)),onTouchmove:t[11]||(t[11]=t=>e.$emit("touchmove",t))},[(0,c.Lk)("div",wt,[(0,c.Lk)("span",{class:(0,h.C4)(["custom-checkbox",{checked:n.localSelected}]),onClick:t[0]||(t[0]=(0,B.D$)((...e)=>s.toggleSelect&&s.toggleSelect(...e),["stop"]))},[n.localSelected?((0,c.uX)(),(0,c.Wv)(r,{key:0,icon:"check",class:"check-icon"})):(0,c.Q3)("",!0)],2)]),(0,c.Lk)("div",{class:"list-col list-col-preview",onClick:t[1]||(t[1]=(...e)=>s.handlePreviewClick&&s.handlePreviewClick(...e))},[s.isFolder?((0,c.uX)(),(0,c.Wv)(r,{key:0,icon:"folder-open",class:"list-folder-icon"})):s.isVideo?((0,c.uX)(),(0,c.CE)("video",{key:1,src:a.fileLink,class:"list-preview-img",muted:"",preload:"metadata"},null,8,Ft)):s.isImage?((0,c.uX)(),(0,c.CE)("img",{key:2,src:a.fileLink,class:"list-preview-img",loading:"lazy",decoding:"async"},null,8,Ct)):((0,c.uX)(),(0,c.Wv)(r,{key:3,icon:"file",class:"list-file-icon"}))]),(0,c.Lk)("div",{class:"list-col list-col-name",onClick:t[2]||(t[2]=(...e)=>s.handlePreviewClick&&s.handlePreviewClick(...e))},[(0,c.Lk)("span",{class:"filename-ellipsis",title:s.displayName},[(0,c.Lk)("span",$t,(0,h.v_)(s.fileNameStart),1),(0,c.Lk)("span",Lt,(0,h.v_)(s.fileNameEnd),1)],8,Tt)]),(0,c.Lk)("div",St,[!s.isFolder&&a.item.metadata?.Tags&&a.item.metadata.Tags.length>0?((0,c.uX)(),(0,c.CE)(c.FK,{key:0},[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(a.item.metadata.Tags.slice(0,3),(e,t)=>((0,c.uX)(),(0,c.CE)("span",{key:t,class:"color-tag",style:(0,h.Tr)({background:s.getTagColor(t)})},(0,h.v_)(e),5))),128)),a.item.metadata.Tags.length>3?((0,c.uX)(),(0,c.CE)("span",{key:0,class:"color-tag color-tag-more",style:(0,h.Tr)({background:s.getTagColor(3)})},"+"+(0,h.v_)(a.item.metadata.Tags.length-3),5)):(0,c.Q3)("",!0)],64)):((0,c.uX)(),(0,c.CE)("span",xt,"-"))]),(0,c.Lk)("div",Dt,(0,h.v_)(s.isFolder?"-":a.item.metadata?.Channel||a.item.channelTag||"-"),1),(0,c.Lk)("div",Et,[!s.isFolder&&a.item.metadata?.ChannelName?((0,c.uX)(),(0,c.CE)("div",At,(0,h.v_)(a.item.metadata.ChannelName),1)):((0,c.uX)(),(0,c.CE)("span",It,"-"))]),(0,c.Lk)("div",Ut,[!s.isFolder&&a.item.metadata?.UploadIP?((0,c.uX)(),(0,c.CE)("div",zt,(0,h.v_)(a.item.metadata.UploadIP),1)):((0,c.uX)(),(0,c.CE)("span",Bt,"-"))]),(0,c.Lk)("div",Wt,(0,h.v_)(s.isFolder?"-":s.fileSizeDisplay),1),(0,c.Lk)("div",Pt,(0,h.v_)(s.uploadDate),1),(0,c.Lk)("div",Rt,[s.isFolder?((0,c.uX)(),(0,c.CE)(c.FK,{key:1},[(0,c.bF)(o,{content:e.$t("dashboard.copyLink"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn",onClick:t[6]||(t[6]=(0,B.D$)(t=>e.$emit("folderCopy"),["stop"]))},[(0,c.bF)(r,{icon:"copy"})])]),_:1},8,["content"]),(0,c.bF)(o,{content:e.$t("dashboard.moveFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn",onClick:t[7]||(t[7]=(0,B.D$)(t=>e.$emit("move"),["stop"]))},[(0,c.bF)(r,{icon:"file-export"})])]),_:1},8,["content"])],64)):((0,c.uX)(),(0,c.CE)(c.FK,{key:0},[(0,c.bF)(o,{content:e.$t("dashboard.copyLink"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn",onClick:t[3]||(t[3]=(0,B.D$)(t=>e.$emit("copy"),["stop"]))},[(0,c.bF)(r,{icon:"copy"})])]),_:1},8,["content"]),(0,c.bF)(o,{content:e.$t("dashboard.downloadFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn",onClick:t[4]||(t[4]=(0,B.D$)(t=>e.$emit("download"),["stop"]))},[(0,c.bF)(r,{icon:"download"})])]),_:1},8,["content"]),(0,c.bF)(o,{content:e.$t("dashboard.moveFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn",onClick:t[5]||(t[5]=(0,B.D$)(t=>e.$emit("move"),["stop"]))},[(0,c.bF)(r,{icon:"file-export"})])]),_:1},8,["content"])],64)),(0,c.bF)(o,{content:e.$t("dashboard.delete"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"list-action-btn list-action-danger",onClick:t[8]||(t[8]=(0,B.D$)(t=>e.$emit("delete"),["stop"]))},[(0,c.bF)(r,{icon:"trash-alt"})])]),_:1},8,["content"])])],32)}var Nt={name:"FileListItem",props:{item:{type:Object,required:!0},selected:{type:Boolean,default:!1},fileLink:{type:String,default:""}},emits:["update:selected","enter","detail","copy","folderCopy","move","delete","download","touchstart","touchend","touchmove"],data(){return{localSelected:this.selected,tagColors:["#f472b6","#a78bfa","#60a5fa","#34d399"]}},computed:{isFolder(){return this.item.isFolder||this.item.name?.endsWith("/")},isVideo(){const e=this.item.name?.toLowerCase()||"";return e.endsWith(".mp4")||e.endsWith(".webm")||e.endsWith(".mov")||e.endsWith(".avi")},isImage(){const e=this.item.name?.toLowerCase()||"";return e.endsWith(".jpg")||e.endsWith(".jpeg")||e.endsWith(".png")||e.endsWith(".gif")||e.endsWith(".webp")||e.endsWith(".svg")||e.endsWith(".bmp")},displayName(){if(this.isFolder){const e=this.item.name.split("/").filter(Boolean);return e[e.length-1]||this.item.name}return this.item.metadata?.FileName||this.getFileName(this.item.name)},fileNameStart(){const e=this.displayName;return e.length<=20?e:e.slice(0,-8)},fileNameEnd(){const e=this.displayName;return e.length<=20?"":e.slice(-8)},uploadDate(){return this.item.uploaded?new Date(this.item.uploaded).toLocaleDateString():this.item.metadata?.TimeStamp?new Date(this.item.metadata.TimeStamp).toLocaleDateString():"-"},fileSizeDisplay(){const e=this.item.metadata?.FileSizeBytes,t=this.item.metadata?.FileSize;return e?e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(2)} MB`:t?`${t} MB`:"-"}},watch:{selected(e){this.localSelected=e}},methods:{toggleSelect(){this.localSelected=!this.localSelected,this.$emit("update:selected",this.localSelected)},handlePreviewClick(){this.isFolder?this.$emit("enter"):this.$emit("detail")},getFileName(e){const t=(e||"").split("/");return t[t.length-1]},getTagColor(e){return this.tagColors[e%this.tagColors.length]}}};const Mt=(0,I.A)(Nt,[["render",Ot],["__scopeId","data-v-78d34f50"]]);var Vt=Mt,Xt=a(70683),jt=(a(95385),a(98469));a(38736);const Kt={class:"file-short-info"},Zt={key:0,class:"success-tag"},Gt={key:1,class:"fail-tag"},Ht={key:2,class:"success-tag"},qt={key:3,class:"primary-tag"},Qt={key:0,style:{"margin-left":"2px"}},Yt={key:0,class:"skeleton-wrapper"},Jt={class:"error-text"},ea=["src"],ta={class:"error-text"},aa={key:3,class:"file-preview"},ia={class:"card-bottom-overlay"},na={class:"file-name-row"},sa={class:"file-name"},ra={class:"action-bar"},oa={class:"action-bar-left"},la={class:"action-bar-right"};function da(e,t,a,i,n,s){const r=jt.dI,o=(0,c.g2)("font-awesome-icon"),l=Ze.Zq,d=ht.R7,u=Xt.Ik;return(0,c.uX)(),(0,c.Wv)(u,{class:"img-card",onTouchstart:t[17]||(t[17]=t=>e.$emit("touchstart",t)),onTouchend:t[18]||(t[18]=t=>e.$emit("touchend",t)),onTouchmove:t[19]||(t[19]=t=>e.$emit("touchmove",t))},{default:(0,c.k6)(()=>[(0,c.bF)(r,{modelValue:n.localSelected,"onUpdate:modelValue":t[0]||(t[0]=e=>n.localSelected=e),onChange:t[1]||(t[1]=t=>e.$emit("update:selected",n.localSelected))},null,8,["modelValue"]),(0,c.Lk)("div",Kt,["White"===a.item.metadata?.ListType?((0,c.uX)(),(0,c.CE)("div",Zt,(0,h.v_)(s.channelTag),1)):"Block"===a.item.metadata?.ListType||"adult"===a.item.metadata?.Label?((0,c.uX)(),(0,c.CE)("div",Gt,(0,h.v_)(s.channelTag),1)):((0,c.uX)(),(0,c.CE)("div",Ht,(0,h.v_)(s.channelTag),1)),a.item.metadata?.Tags&&a.item.metadata?.Tags.length>0?((0,c.uX)(),(0,c.CE)("div",qt,[(0,c.bF)(o,{icon:"tag",style:{"margin-right":"3px","font-size":"12px"}}),(0,c.eW)(" "+(0,h.v_)(a.item.metadata.Tags[0])+" ",1),a.item.metadata.Tags.length>1?((0,c.uX)(),(0,c.CE)("span",Qt," (+"+(0,h.v_)(a.item.metadata.Tags.length-1)+") ",1)):(0,c.Q3)("",!0)])):(0,c.Q3)("",!0)]),s.isVideo?((0,c.uX)(),(0,c.CE)(c.FK,{key:0},[n.videoLoading?((0,c.uX)(),(0,c.CE)("div",Yt)):n.videoError?((0,c.uX)(),(0,c.CE)("div",{key:1,class:"error-wrapper",onClick:t[2]||(t[2]=t=>e.$emit("detail"))},[(0,c.bF)(o,{icon:"exclamation-triangle",class:"error-icon"}),(0,c.Lk)("span",Jt,(0,h.v_)(e.$t("dashboard.loadFailed")),1)])):(0,c.Q3)("",!0),(0,c.bo)((0,c.Lk)("video",{src:a.fileLink,muted:"",loop:"",preload:"metadata",class:"video-preview",onClick:t[3]||(t[3]=(...e)=>s.handleVideoClick&&s.handleVideoClick(...e)),onMouseenter:t[4]||(t[4]=e=>s.handleVideoHover(e,!0)),onMouseleave:t[5]||(t[5]=e=>s.handleVideoHover(e,!1)),onFullscreenchange:t[6]||(t[6]=(...e)=>s.handleFullscreenChange&&s.handleFullscreenChange(...e)),onWebkitfullscreenchange:t[7]||(t[7]=(...e)=>s.handleFullscreenChange&&s.handleFullscreenChange(...e)),onLoadeddata:t[8]||(t[8]=e=>n.videoLoading=!1),onError:t[9]||(t[9]=(...e)=>s.handleVideoError&&s.handleVideoError(...e))},null,40,ea),[[B.aG,!n.videoLoading&&!n.videoError]])],64)):s.isAudio?((0,c.uX)(),(0,c.CE)("div",{key:1,class:"file-preview audio-card-preview",onClick:t[10]||(t[10]=t=>e.$emit("detail"))},[(0,c.bF)(o,{icon:"music",class:"file-icon audio-icon"})])):s.isImage?((0,c.uX)(),(0,c.Wv)(l,{key:2,"preview-teleported":!0,src:a.fileLink,"preview-src-list":a.previewSrcList,fit:"cover",lazy:"",decoding:"async",class:"image-preview"},{placeholder:(0,c.k6)(()=>[...t[20]||(t[20]=[(0,c.Lk)("div",{class:"skeleton-wrapper"},null,-1)])]),error:(0,c.k6)(()=>[(0,c.Lk)("div",{class:"error-wrapper",onClick:t[11]||(t[11]=(0,B.D$)(t=>e.$emit("detail"),["stop"]))},[(0,c.bF)(o,{icon:"image",class:"error-icon"}),(0,c.Lk)("span",ta,(0,h.v_)(e.$t("dashboard.loadFailed")),1)])]),_:1},8,["src","preview-src-list"])):((0,c.uX)(),(0,c.CE)("div",aa,[(0,c.bF)(o,{icon:"file",class:"file-icon"})])),(0,c.Lk)("div",ia,[(0,c.Lk)("div",na,[(0,c.Lk)("span",sa,(0,h.v_)(s.displayName),1)]),(0,c.Lk)("div",ra,[(0,c.Lk)("div",oa,[(0,c.bF)(d,{disabled:a.disableTooltip,content:e.$t("dashboard.detail"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[12]||(t[12]=(0,B.D$)(t=>e.$emit("detail"),["stop"]))},[(0,c.bF)(o,{icon:"info-circle"})])]),_:1},8,["disabled","content"])]),(0,c.Lk)("div",la,[(0,c.bF)(d,{disabled:a.disableTooltip,content:e.$t("dashboard.moveFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[13]||(t[13]=(0,B.D$)(t=>e.$emit("move"),["stop"]))},[(0,c.bF)(o,{icon:"file-export"})])]),_:1},8,["disabled","content"]),(0,c.bF)(d,{disabled:a.disableTooltip,content:e.$t("dashboard.delete"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn action-btn-danger",onClick:t[14]||(t[14]=(0,B.D$)(t=>e.$emit("delete"),["stop"]))},[(0,c.bF)(o,{icon:"trash-alt"})])]),_:1},8,["disabled","content"]),(0,c.bF)(d,{disabled:a.disableTooltip,content:e.$t("dashboard.downloadFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[15]||(t[15]=(0,B.D$)(t=>e.$emit("download"),["stop"]))},[(0,c.bF)(o,{icon:"download"})])]),_:1},8,["disabled","content"]),(0,c.bF)(d,{disabled:a.disableTooltip,content:e.$t("dashboard.copyLink"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[16]||(t[16]=(0,B.D$)(t=>e.$emit("copy"),["stop"]))},[(0,c.bF)(o,{icon:"copy"})])]),_:1},8,["disabled","content"])])])])]),_:1})}var ca={name:"FileCard",props:{item:{type:Object,required:!0},selected:{type:Boolean,default:!1},fileLink:{type:String,required:!0},previewSrcList:{type:Array,default:()=>[]},disableTooltip:{type:Boolean,default:!1}},emits:["update:selected","detail","copy","move","delete","download","touchstart","touchend","touchmove"],data(){return{localSelected:this.selected,videoLoading:!0,videoError:!1}},computed:{channelTag(){return this.item.channelTag||""},isVideo(){const e=this.item.metadata?.FileType?.toLowerCase()||"";if(e.includes("video"))return!0;const t=this.item.name?.toLowerCase()||"";return t.endsWith(".mp4")||t.endsWith(".webm")||t.endsWith(".mov")||t.endsWith(".avi")},isAudio(){const e=this.item.metadata?.FileType?.toLowerCase()||"";if(e.includes("audio"))return!0;const t=this.item.name?.toLowerCase()||"";return t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")||t.endsWith(".flac")},isImage(){const e=this.item.metadata?.FileType?.toLowerCase()||"";if(e.includes("image"))return!0;const t=this.item.name?.toLowerCase()||"";return t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".png")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")||t.endsWith(".bmp")||t.endsWith(".avif")||t.endsWith(".heic")||t.endsWith(".heif")},displayName(){const e=this.item.metadata?.FileName||this.item.name||"",t=e.split("/");return t[t.length-1]}},watch:{selected(e){this.localSelected=e},fileLink(){this.videoLoading=!0,this.videoError=!1}},methods:{handleVideoError(){this.videoLoading=!1,this.videoError=!0},handleVideoClick(e){const t=e.target;t.requestFullscreen?t.requestFullscreen():t.webkitRequestFullscreen?t.webkitRequestFullscreen():t.mozRequestFullScreen?t.mozRequestFullScreen():t.msRequestFullscreen&&t.msRequestFullscreen()},handleFullscreenChange(e){const t=e.target,a=document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement;a?(t.muted=!1,t.loop=!1):(t.muted=!0,t.loop=!0,t.pause(),t.currentTime=0)},handleVideoHover(e,t){const a=e.target;t?a.play().catch(()=>{}):(a.pause(),a.currentTime=0)}}};const ha=(0,I.A)(ca,[["render",da],["__scopeId","data-v-e367e94e"]]);var ua=ha;const fa={class:"card-bottom-overlay"},ma={class:"file-name-row"},pa={class:"file-name"},ga={key:0,class:"action-bar"},ba={class:"action-bar-right"};function va(e,t,a,i,n,s){const r=jt.dI,o=(0,c.g2)("font-awesome-icon"),l=ht.R7,d=Xt.Ik;return(0,c.uX)(),(0,c.Wv)(d,{class:"img-card folder-card",onTouchstart:t[6]||(t[6]=t=>e.$emit("touchstart",t)),onTouchend:t[7]||(t[7]=t=>e.$emit("touchend",t)),onTouchmove:t[8]||(t[8]=t=>e.$emit("touchmove",t))},{default:(0,c.k6)(()=>[(0,c.bF)(r,{modelValue:n.localSelected,"onUpdate:modelValue":t[0]||(t[0]=e=>n.localSelected=e),onChange:t[1]||(t[1]=t=>e.$emit("update:selected",n.localSelected))},null,8,["modelValue"]),(0,c.Lk)("div",{class:"folder-icon",onClick:t[2]||(t[2]=t=>e.$emit("enter"))},[(0,c.bF)(o,{icon:"folder-open",class:"folder-icon-svg"})]),(0,c.Lk)("div",fa,[(0,c.Lk)("div",ma,[(0,c.Lk)("span",pa,(0,h.v_)(s.folderName),1)]),a.showActions?((0,c.uX)(),(0,c.CE)("div",ga,[t[9]||(t[9]=(0,c.Lk)("div",{class:"action-bar-left"},null,-1)),(0,c.Lk)("div",ba,[(0,c.bF)(l,{disabled:a.disableTooltip,content:e.$t("dashboard.copyLink"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[3]||(t[3]=(0,B.D$)(t=>e.$emit("copy"),["stop"]))},[(0,c.bF)(o,{icon:"copy"})])]),_:1},8,["disabled","content"]),(0,c.bF)(l,{disabled:a.disableTooltip,content:e.$t("dashboard.moveFile"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn",onClick:t[4]||(t[4]=(0,B.D$)(t=>e.$emit("move"),["stop"]))},[(0,c.bF)(o,{icon:"file-export"})])]),_:1},8,["disabled","content"]),(0,c.bF)(l,{disabled:a.disableTooltip,content:e.$t("dashboard.delete"),placement:"top"},{default:(0,c.k6)(()=>[(0,c.Lk)("button",{class:"action-btn action-btn-danger",onClick:t[5]||(t[5]=(0,B.D$)(t=>e.$emit("delete"),["stop"]))},[(0,c.bF)(o,{icon:"trash-alt"})])]),_:1},8,["disabled","content"])])])):(0,c.Q3)("",!0)])]),_:1})}var ka={name:"FolderCard",props:{name:{type:String,required:!0},selected:{type:Boolean,default:!1},showActions:{type:Boolean,default:!0},disableTooltip:{type:Boolean,default:!1}},emits:["update:selected","enter","copy","move","delete","touchstart","touchend","touchmove"],data(){return{localSelected:this.selected}},computed:{folderName(){const e=this.name.split("/").filter(Boolean);return e[e.length-1]||this.name}},watch:{selected(e){this.localSelected=e}}};const ya=(0,I.A)(ka,[["render",va],["__scopeId","data-v-5f22ef48"]]);var _a=ya;function wa(e,t,a,i,n,s){return"card"===a.type?((0,c.uX)(!0),(0,c.CE)(c.FK,{key:0},(0,c.pI)(a.count,e=>((0,c.uX)(),(0,c.CE)("div",{key:"skeleton-"+e,class:"skeleton-card"},[...t[0]||(t[0]=[(0,c.Lk)("div",{class:"skeleton-image"},null,-1),(0,c.Lk)("div",{class:"skeleton-info"},[(0,c.Lk)("div",{class:"skeleton-text"})],-1)])]))),128)):"list"===a.type?((0,c.uX)(!0),(0,c.CE)(c.FK,{key:1},(0,c.pI)(a.count,e=>((0,c.uX)(),(0,c.CE)("div",{key:"list-skeleton-"+e,class:"list-item skeleton-list-item"},[...t[1]||(t[1]=[(0,c.Fv)('

    ',10)])]))),128)):(0,c.Q3)("",!0)}var Fa={name:"SkeletonLoader",props:{type:{type:String,default:"card",validator:e=>["card","list"].includes(e)},count:{type:Number,default:15}}};const Ca=(0,I.A)(Fa,[["render",wa],["__scopeId","data-v-5060702c"]]);var Ta=Ca,$a=a(81095),La=(a(77128),a(62086)),Sa=(a(40670),a(88830),a(23597),a(49187),a(77788));a(72099);const xa={class:"el-dropdown-link filter-trigger"},Da={class:"filter-section"},Ea={class:"filter-title"},Aa={class:"filter-options"},Ia={class:"filter-section"},Ua={class:"filter-title"},za={class:"filter-options"},Ba={class:"filter-section"},Wa={class:"filter-title"},Pa={class:"filter-options"},Ra={class:"filter-section"},Oa={class:"filter-title"},Na={class:"filter-options"},Ma={class:"filter-section"},Va={class:"filter-title"},Xa={class:"filter-options"},ja={key:0,class:"filter-section"},Ka={class:"filter-title"},Za={class:"filter-options"},Ga={key:0,class:"channel-divider"},Ha={class:"channel-group-title"},qa={class:"filter-actions"};function Qa(e,t,a,i,n,s){const r=(0,c.g2)("font-awesome-icon"),o=Sa.z_,d=jt.dI,u=jt.o5,f=l.S2,m=La.Iy,p=La.dW;return(0,c.uX)(),(0,c.Wv)(p,{"hide-on-click":!1,trigger:"click",class:"filter-dropdown",ref:"dropdownRef"},{dropdown:(0,c.k6)(()=>[(0,c.bF)(m,{class:"filter-dropdown-menu"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",Da,[(0,c.Lk)("div",Ea,(0,h.v_)(e.$t("filter.accessStatus")),1),(0,c.Lk)("div",Aa,[(0,c.bF)(u,{modelValue:n.localFilters.accessStatus,"onUpdate:modelValue":t[0]||(t[0]=e=>n.localFilters.accessStatus=e),onChange:t[1]||(t[1]=e=>s.handleFilterChange("accessStatus"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.accessStatusOptions,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"accessStatus-"+e.value,label:e.value},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])])]),(0,c.Lk)("div",Ia,[(0,c.Lk)("div",Ua,(0,h.v_)(e.$t("filter.blackWhiteList")),1),(0,c.Lk)("div",za,[(0,c.bF)(u,{modelValue:n.localFilters.listType,"onUpdate:modelValue":t[2]||(t[2]=e=>n.localFilters.listType=e),onChange:t[3]||(t[3]=e=>s.handleFilterChange("listType"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.listTypeOptions,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"listType-"+e.value,label:e.value},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])])]),(0,c.Lk)("div",Ba,[(0,c.Lk)("div",Wa,(0,h.v_)(e.$t("filter.reviewResult")),1),(0,c.Lk)("div",Pa,[(0,c.bF)(u,{modelValue:n.localFilters.label,"onUpdate:modelValue":t[4]||(t[4]=e=>n.localFilters.label=e),onChange:t[5]||(t[5]=e=>s.handleFilterChange("label"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.labelOptions,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"label-"+e.value,label:e.value},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])])]),(0,c.Lk)("div",Ra,[(0,c.Lk)("div",Oa,(0,h.v_)(e.$t("filter.fileType")),1),(0,c.Lk)("div",Na,[(0,c.bF)(u,{modelValue:n.localFilters.fileType,"onUpdate:modelValue":t[6]||(t[6]=e=>n.localFilters.fileType=e),onChange:t[7]||(t[7]=e=>s.handleFilterChange("fileType"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.fileTypeOptions,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"fileType-"+e.value,label:e.value},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])])]),(0,c.Lk)("div",Ma,[(0,c.Lk)("div",Va,(0,h.v_)(e.$t("filter.channelType")),1),(0,c.Lk)("div",Xa,[(0,c.bF)(u,{modelValue:n.localFilters.channel,"onUpdate:modelValue":t[8]||(t[8]=e=>n.localFilters.channel=e),onChange:t[9]||(t[9]=e=>s.handleFilterChange("channel"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.channelOptions,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"channel-"+e.value,label:e.value},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])])]),a.channelNameOptions.length>0?((0,c.uX)(),(0,c.CE)("div",ja,[(0,c.Lk)("div",Ka,(0,h.v_)(e.$t("filter.channelName")),1),(0,c.Lk)("div",Za,[(0,c.bF)(u,{modelValue:n.localFilters.channelName,"onUpdate:modelValue":t[10]||(t[10]=e=>n.localFilters.channelName=e),onChange:t[11]||(t[11]=e=>s.handleFilterChange("channelName"))},{default:(0,c.k6)(()=>[((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(s.groupedChannelNames,(e,t)=>((0,c.uX)(),(0,c.CE)(c.FK,{key:"group-"+e.type},[t>0?((0,c.uX)(),(0,c.CE)("div",Ga)):(0,c.Q3)("",!0),(0,c.Lk)("div",Ha,(0,h.v_)(e.typeLabel),1),((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(e.channels,e=>((0,c.uX)(),(0,c.Wv)(d,{key:"channelName-"+e.type+"-"+e.name,label:e.type+":"+e.name},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.name),1)]),_:2},1032,["label"]))),128))],64))),128))]),_:1},8,["modelValue"])])])):(0,c.Q3)("",!0),(0,c.Lk)("div",qa,[(0,c.bF)(f,{size:"small",onClick:s.clearFilters,disabled:0===s.activeFilterCount},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("filter.clearFilters")),1)]),_:1},8,["onClick","disabled"])])]),_:1})]),default:(0,c.k6)(()=>[(0,c.Lk)("span",xa,[(0,c.bF)(o,{value:s.activeFilterCount,hidden:0===s.activeFilterCount,class:"filter-badge"},{default:(0,c.k6)(()=>[(0,c.bF)(r,{icon:"filter",class:"header-icon"})]),_:1},8,["value","hidden"])])]),_:1},512)}a(7588),a(18237);var Ya={name:"FilterDropdown",props:{filters:{type:Object,default:()=>({accessStatus:[],listType:[],label:[],fileType:[],channel:[],channelName:[]})},channelNameOptions:{type:Array,default:()=>[]}},emits:["update:filters","change"],data(){return{localFilters:{accessStatus:[],listType:[],label:[],fileType:[],channel:[],channelName:[]}}},computed:{accessStatusOptions(){return[{label:this.$t("filter.normal"),value:"normal"},{label:this.$t("filter.blocked"),value:"blocked"}]},listTypeOptions(){return[{label:this.$t("filter.whiteList"),value:"White"},{label:this.$t("filter.blackList"),value:"Block"},{label:this.$t("filter.notSet"),value:"None"}]},labelOptions(){return[{label:this.$t("filter.normal"),value:"normal"},{label:this.$t("filter.teenContent"),value:"teen"},{label:this.$t("filter.adultContent"),value:"adult"}]},fileTypeOptions(){return[{label:this.$t("filter.image"),value:"image"},{label:this.$t("filter.video"),value:"video"},{label:this.$t("filter.audio"),value:"audio"},{label:this.$t("filter.other"),value:"other"}]},channelOptions(){return[{label:"Telegram",value:"TelegramNew"},{label:"Cloudflare R2",value:"CloudflareR2"},{label:"S3",value:"S3"},{label:"Discord",value:"Discord"},{label:"HuggingFace",value:"HuggingFace"},{label:"WebDAV",value:"WebDAV"},{label:this.$t("filter.externalLink"),value:"External"}]},activeFilterCount(){return Object.values(this.localFilters).reduce((e,t)=>e+t.length,0)},groupedChannelNames(){const e={};return this.channelNameOptions.forEach(t=>{e[t.type]||(e[t.type]={type:t.type,typeLabel:t.typeLabel,channels:[]}),e[t.type].channels.push(t)}),Object.values(e)}},watch:{filters:{handler(e){this.localFilters={accessStatus:Array.isArray(e.accessStatus)?[...e.accessStatus]:[],listType:Array.isArray(e.listType)?[...e.listType]:[],label:Array.isArray(e.label)?[...e.label]:[],fileType:Array.isArray(e.fileType)?[...e.fileType]:[],channel:Array.isArray(e.channel)?[...e.channel]:[],channelName:Array.isArray(e.channelName)?[...e.channelName]:[]}},immediate:!0,deep:!0}},methods:{handleFilterChange(e){this.$emit("update:filters",{...this.localFilters}),this.$emit("change",{type:e,filters:{...this.localFilters}})},clearFilters(){this.localFilters={accessStatus:[],listType:[],label:[],fileType:[],channel:[],channelName:[]},this.$emit("update:filters",{...this.localFilters}),this.$emit("change",{type:"clear",filters:{...this.localFilters}})}}};const Ja=(0,I.A)(Ya,[["render",Qa],["__scopeId","data-v-c3aeeea0"]]);var ei=Ja,ti=a(36600);const ai={class:"container"},ii={class:"header-content"},ni={class:"search-area"},si={class:"search-card"},ri={class:"actions"},oi={class:"el-dropdown-link"},li={class:"el-dropdown-link"},di={class:"breadcrumb-container"},ci={class:"mobile-directory-path"},hi={class:"breadcrumb desktop-only"},ui=["title"],fi={key:1,class:"empty-state"},mi={class:"empty-text"},pi={class:"empty-hint"},gi={class:"list-header"},bi={class:"list-col list-col-checkbox"},vi={class:"list-col list-col-preview"},ki={class:"list-col list-col-name"},yi={class:"list-col list-col-tags"},_i={class:"list-col list-col-channel"},wi={class:"list-col list-col-channel-name"},Fi={class:"list-col list-col-address"},Ci={class:"list-col list-col-size"},Ti={class:"list-col list-col-date"},$i={class:"list-col list-col-actions"},Li={key:1,class:"empty-state list-empty"},Si={class:"empty-text"},xi={class:"empty-hint"},Di={class:"pagination-container"},Ei={class:"pagination-center"},Ai={class:"pagination-right"},Ii={class:"page-total"},Ui={class:"page-jump"},zi={class:"dialog-section"},Bi={class:"section-header"},Wi={class:"section-title"},Pi={class:"section-content"},Ri={class:"dialog-section"},Oi={class:"section-header"},Ni={class:"section-title"},Mi={class:"section-content"},Vi={class:"setting-item"},Xi={class:"setting-label"},ji={key:0,class:"setting-item"},Ki={class:"setting-label"},Zi={class:"dialog-action"};function Gi(e,t,a,i,n,s){const o=ti.A,u=(0,c.g2)("font-awesome-icon"),f=d.WK,m=ei,p=La.c6,g=La.Iy,b=La.dW,v=ht.R7,k=yt.bZ,y=$a.WZ,_=$a.vp,w=Ta,F=_a,C=ua,T=Vt,$=_t.aQ,L=l.S2,S=yt.ZO,x=yt.lX,D=kt,E=ct,A=Xe.ll,I=Xe.MQ,U=Ve.qi,W=r.kZ,P=Me,R=Ce,O=Q,N=X,M=z;return(0,c.uX)(),(0,c.CE)("div",ai,[(0,c.bF)(x,null,{default:(0,c.k6)(()=>[(0,c.bF)(k,null,{default:(0,c.k6)(()=>[(0,c.Lk)("div",ii,[(0,c.bF)(o,{activeTab:"dashboard"}),(0,c.Lk)("div",ni,[(0,c.Lk)("div",si,[(0,c.bF)(f,{modelValue:n.tempSearch,"onUpdate:modelValue":t[0]||(t[0]=e=>n.tempSearch=e),size:"small",placeholder:e.$t("dashboard.searchPlaceholder"),onKeyup:(0,B.jR)(s.handleSearch,["enter"])},{suffix:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"search",class:"search-icon",onClick:s.handleSearch},null,8,["onClick"])]),_:1},8,["modelValue","placeholder","onKeyup"])]),(0,c.bF)(m,{filters:n.filters,"onUpdate:filters":t[1]||(t[1]=e=>n.filters=e),channelNameOptions:n.channelNameOptions,onChange:s.handleFilterChange},null,8,["filters","channelNameOptions","onChange"])]),(0,c.Lk)("div",ri,[(0,c.bF)(b,{onCommand:s.sort,"hide-on-click":!1},{dropdown:(0,c.k6)(()=>[(0,c.bF)(g,null,{default:(0,c.k6)(()=>[(0,c.bF)(p,{command:"dateDesc"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("dashboard.sortByDateDesc")),1)]),_:1}),(0,c.bF)(p,{command:"nameAsc"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("dashboard.sortByNameAsc")),1)]),_:1})]),_:1})]),default:(0,c.k6)(()=>[(0,c.Lk)("span",oi,[(0,c.bF)(u,{icon:s.sortIcon,class:"header-icon"},null,8,["icon"])])]),_:1},8,["onCommand"]),(0,c.bF)(v,{disabled:s.disableTooltip,content:e.$t("dashboard.linkFormat"),placement:"bottom"},{default:(0,c.k6)(()=>[(0,c.Lk)("span",li,[(0,c.bF)(u,{icon:"link",class:"header-icon",onClick:t[2]||(t[2]=e=>n.showUrlDialog=!0)})])]),_:1},8,["disabled","content"]),(0,c.bF)(v,{disabled:s.disableTooltip,content:"card"===n.viewMode?e.$t("dashboard.listView"):e.$t("dashboard.cardView"),placement:"bottom"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"card"===n.viewMode?"list":"th-large",class:"header-icon",onClick:s.toggleViewMode},null,8,["icon","onClick"])]),_:1},8,["disabled","content"]),(0,c.bF)(v,{disabled:s.disableTooltip,content:e.$t("dashboard.logout"),placement:"bottom"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"sign-out-alt",class:"header-icon",onClick:s.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,c.bF)(S,{class:(0,h.C4)(["main-container",{"has-batch-toolbar":n.selectedFiles.length>0}])},{default:(0,c.k6)(()=>[(0,c.Lk)("div",di,[(0,c.Lk)("button",{class:"breadcrumb-select-button",type:"button",onClick:t[3]||(t[3]=(...e)=>s.handleSelectPage&&s.handleSelectPage(...e))},[(0,c.bF)(u,{icon:s.selectPageIcon,class:"breadcrumb-select-icon"},null,8,["icon"])]),(0,c.Lk)("div",{class:"mobile-directory-trigger",onClick:t[4]||(t[4]=e=>n.showMobileDirectoryDrawer=!0)},[(0,c.bF)(u,{icon:"folder-open",class:"mobile-directory-icon"}),(0,c.Lk)("span",ci,(0,h.v_)(n.currentPath&&n.currentPath.split("/").filter(Boolean).length>0?n.currentPath.split("/").filter(Boolean).pop():e.$t("dashboard.rootDirectory")),1),(0,c.bF)(u,{icon:"chevron-down",class:"mobile-directory-arrow"})]),(0,c.Lk)("div",hi,[(0,c.bF)(_,{separator:"/"},{default:(0,c.k6)(()=>[(0,c.bF)(y,{onClick:t[5]||(t[5]=e=>s.navigateToFolder(""))},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"home",class:"breadcrumb-home-icon"})]),_:1}),((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(n.currentPath.split("/").filter(Boolean),(e,t)=>((0,c.uX)(),(0,c.Wv)(y,{key:t,onClick:e=>s.navigateToFolder(n.currentPath.split("/").filter(Boolean).slice(0,t+1).join("/"))},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e),1)]),_:2},1032,["onClick"]))),128))]),_:1})]),(0,c.Lk)("span",{class:"stats-badge",title:e.$t("dashboard.totalFiles",{count:e.$data.Number})},[(0,c.bF)(u,{icon:"database",class:"stats-badge-icon"}),(0,c.eW)(" "+(0,h.v_)(n.Number),1)],8,ui)]),"card"===n.viewMode?((0,c.uX)(),(0,c.CE)("div",{key:0,class:(0,h.C4)(["content",{"is-drag-selecting":i.isDragging}]),ref:"cardContainerRef"},[n.loading?((0,c.uX)(),(0,c.Wv)(w,{key:0,type:"card",count:15})):0===s.paginatedTableData.length?((0,c.uX)(),(0,c.CE)("div",fi,[(0,c.bF)(u,{icon:"folder-open",class:"empty-icon"}),(0,c.Lk)("p",mi,(0,h.v_)(s.hasSearchOrFilter?e.$t("dashboard.noMatchingFiles"):e.$t("dashboard.currentDirEmpty")),1),(0,c.Lk)("p",pi,(0,h.v_)(s.hasSearchOrFilter?e.$t("dashboard.adjustSearchHint"):e.$t("dashboard.uploadHint")),1)])):((0,c.uX)(!0),(0,c.CE)(c.FK,{key:2},(0,c.pI)(s.paginatedTableData,(e,t)=>((0,c.uX)(),(0,c.CE)(c.FK,{key:t},[s.isFolder(e)?((0,c.uX)(),(0,c.Wv)(F,{key:0,name:e.name,selected:e.selected,"onUpdate:selected":t=>e.selected=t,showActions:!n.isSearchMode,disableTooltip:s.disableTooltip,onEnter:t=>s.enterFolder(e.name),onCopy:t=>s.handleFolderCopy(e.name),onMove:a=>s.handleMove(t,e.name),onDelete:a=>s.handleDelete(t,e.name),onTouchstart:a=>s.handleFolderTouchStart(e,t),onTouchend:s.handleTouchEnd,onTouchmove:s.handleTouchEnd},null,8,["name","selected","onUpdate:selected","showActions","disableTooltip","onEnter","onCopy","onMove","onDelete","onTouchstart","onTouchend","onTouchmove"])):((0,c.uX)(),(0,c.Wv)(C,{key:1,item:e,selected:e.selected,"onUpdate:selected":t=>e.selected=t,fileLink:s.getFileLink(e.name),previewSrcList:e.previewSrcList,disableTooltip:s.disableTooltip,onDetail:a=>s.openDetailDialog(t,e.name),onCopy:a=>s.handleCopy(t,e.name),onMove:a=>s.handleMove(t,e.name),onDelete:a=>s.handleDelete(t,e.name),onDownload:t=>s.handleDownload(e.name),onTouchstart:a=>s.handleTouchStart(e,t),onTouchend:s.handleTouchEnd,onTouchmove:s.handleTouchEnd},null,8,["item","selected","onUpdate:selected","fileLink","previewSrcList","disableTooltip","onDetail","onCopy","onMove","onDelete","onDownload","onTouchstart","onTouchend","onTouchmove"]))],64))),128))],2)):((0,c.uX)(),(0,c.CE)("div",{key:1,class:(0,h.C4)(["list-view",{"is-drag-selecting":i.isDragging}]),ref:"listContainerRef"},[(0,c.Lk)("div",gi,[(0,c.Lk)("div",bi,[(0,c.Lk)("span",{class:(0,h.C4)(["custom-checkbox",{checked:s.isSelectAll,indeterminate:s.isIndeterminate}]),onClick:t[6]||(t[6]=e=>s.handleSelectAllPage(!s.isSelectAll))},[s.isSelectAll?((0,c.uX)(),(0,c.Wv)(u,{key:0,icon:"check",class:"check-icon"})):s.isIndeterminate?((0,c.uX)(),(0,c.Wv)(u,{key:1,icon:"minus",class:"check-icon"})):(0,c.Q3)("",!0)],2)]),(0,c.Lk)("div",vi,(0,h.v_)(e.$t("dashboard.preview")),1),(0,c.Lk)("div",ki,(0,h.v_)(e.$t("dashboard.fileName")),1),(0,c.Lk)("div",yi,(0,h.v_)(e.$t("dashboard.tags")),1),(0,c.Lk)("div",_i,(0,h.v_)(e.$t("dashboard.channelType")),1),(0,c.Lk)("div",wi,(0,h.v_)(e.$t("dashboard.channelNameCol")),1),(0,c.Lk)("div",Fi,(0,h.v_)(e.$t("dashboard.uploadAddress")),1),(0,c.Lk)("div",Ci,(0,h.v_)(e.$t("dashboard.fileSize")),1),(0,c.Lk)("div",Ti,(0,h.v_)(e.$t("dashboard.uploadTime")),1),(0,c.Lk)("div",$i,(0,h.v_)(e.$t("dashboard.actions")),1)]),n.loading?((0,c.uX)(),(0,c.Wv)(w,{key:0,type:"list",count:15})):0===s.paginatedTableData.length?((0,c.uX)(),(0,c.CE)("div",Li,[(0,c.bF)(u,{icon:"folder-open",class:"empty-icon"}),(0,c.Lk)("p",Si,(0,h.v_)(s.hasSearchOrFilter?e.$t("dashboard.noMatchingFiles"):e.$t("dashboard.currentDirEmpty")),1),(0,c.Lk)("p",xi,(0,h.v_)(s.hasSearchOrFilter?e.$t("dashboard.adjustSearchHint"):e.$t("dashboard.uploadHint")),1)])):((0,c.uX)(!0),(0,c.CE)(c.FK,{key:2},(0,c.pI)(s.paginatedTableData,(e,t)=>((0,c.uX)(),(0,c.Wv)(T,{key:t,item:e,selected:e.selected,"onUpdate:selected":t=>e.selected=t,fileLink:s.getFileLink(e.name),onEnter:t=>s.enterFolder(e.name),onDetail:a=>s.openDetailDialog(t,e.name),onCopy:a=>s.handleCopy(t,e.name),onFolderCopy:t=>s.handleFolderCopy(e.name),onMove:a=>s.handleMove(t,e.name),onDelete:a=>s.handleDelete(t,e.name),onDownload:t=>s.handleDownload(e.name),onTouchstart:a=>s.isFolder(e)?s.handleFolderTouchStart(e,t):s.handleTouchStart(e,t),onTouchend:s.handleTouchEnd,onTouchmove:s.handleTouchEnd},null,8,["item","selected","onUpdate:selected","fileLink","onEnter","onDetail","onCopy","onFolderCopy","onMove","onDelete","onDownload","onTouchstart","onTouchend","onTouchmove"]))),128))],2)),i.isDragging?((0,c.uX)(),(0,c.CE)("div",{key:2,class:"drag-select-overlay",style:(0,h.Tr)({position:"fixed",left:i.selectionRect.left+"px",top:i.selectionRect.top+"px",width:i.selectionRect.width+"px",height:i.selectionRect.height+"px"})},null,4)):(0,c.Q3)("",!0),(0,c.Lk)("div",Di,[(0,c.Lk)("div",Ei,[(0,c.bF)($,{background:"",layout:"prev, pager, next",total:s.filteredTableData.length,"page-size":n.pageSize,"current-page":n.currentPage,"pager-count":s.pagerCount,onCurrentChange:s.handlePageChange},null,8,["total","page-size","current-page","pager-count","onCurrentChange"]),(0,c.bF)(L,{type:"primary",onClick:s.refreshFileList,class:"refresh-btn"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"sync",class:(0,h.C4)({"fa-spin":n.refreshLoading})},null,8,["class"])]),_:1},8,["onClick"]),n.currentPage===Math.ceil(s.filteredTableData.length/n.pageSize)?((0,c.uX)(),(0,c.Wv)(L,{key:0,type:"primary",onClick:s.loadMoreData,loading:n.loading,class:"load-more"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("dashboard.loadMore")),1)]),_:1},8,["onClick","loading"])):(0,c.Q3)("",!0)]),(0,c.Lk)("div",Ai,[(0,c.Lk)("span",Ii,(0,h.v_)(e.$t("dashboard.totalPages",{count:s.realTotalPages})),1),(0,c.Lk)("div",Ui,[(0,c.Lk)("span",null,(0,h.v_)(e.$t("dashboard.jumpTo")),1),(0,c.bF)(f,{modelValue:n.jumpPage,"onUpdate:modelValue":t[7]||(t[7]=e=>n.jumpPage=e),size:"small",class:"jump-input",onKeyup:(0,B.jR)(s.handleJumpPage,["enter"])},null,8,["modelValue","onKeyup"]),(0,c.bF)(L,{size:"small",type:"primary",onClick:s.handleJumpPage,class:"jump-btn"},{default:(0,c.k6)(()=>[...t[24]||(t[24]=[(0,c.eW)("GO",-1)])]),_:1},8,["onClick"])])])])]),_:1},8,["class"])]),_:1}),(0,c.bF)(D,{"selected-count":n.selectedFiles.length,onAction:s.handleBatchAction,onClear:s.clearSelection},null,8,["selected-count","onAction","onClear"]),(0,c.bF)(E,{modelValue:n.showdetailDialog,"onUpdate:modelValue":t[8]||(t[8]=e=>n.showdetailDialog=e),file:n.detailFile,fileLink:s.getFileLink(n.detailFile?.name),urls:s.allUrl,onDownload:t[9]||(t[9]=e=>s.handleDownload(n.detailFile?.name)),onTagManagement:t[10]||(t[10]=e=>s.handleTagManagement(n.detailFile?.name)),onBlock:t[11]||(t[11]=e=>s.handleBlock(n.detailFile?.name)),onWhite:t[12]||(t[12]=e=>s.handleWhite(n.detailFile?.name)),onDelete:t[13]||(t[13]=e=>s.handleDetailDelete(n.detailFile?.name)),onMetadataUpdated:s.handleMetadataUpdated,onFileRenamed:s.handleFileRenamed},null,8,["modelValue","file","fileLink","urls","onMetadataUpdated","onFileRenamed"]),(0,c.bF)(W,{title:e.$t("dashboard.linkFormat"),modelValue:n.showUrlDialog,"onUpdate:modelValue":t[18]||(t[18]=e=>n.showUrlDialog=e),width:s.dialogWidth,"show-close":!1,class:"settings-dialog"},{default:(0,c.k6)(()=>[(0,c.Lk)("div",zi,[(0,c.Lk)("div",Bi,[(0,c.Lk)("span",Wi,(0,h.v_)(e.$t("settings.defaultCopyLink")),1)]),(0,c.Lk)("div",Pi,[(0,c.bF)(I,{modelValue:n.defaultUrlFormat,"onUpdate:modelValue":t[14]||(t[14]=e=>n.defaultUrlFormat=e),class:"radio-card-group grid-2x2"},{default:(0,c.k6)(()=>[(0,c.bF)(A,{label:"originUrl",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"link",class:"radio-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("settings.rawLink")),1)]),_:1}),(0,c.bF)(A,{label:"mdUrl",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"code",class:"radio-icon"}),t[25]||(t[25]=(0,c.Lk)("span",null,"Markdown",-1))]),_:1}),(0,c.bF)(A,{label:"htmlUrl",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"code-branch",class:"radio-icon"}),t[26]||(t[26]=(0,c.Lk)("span",null,"HTML",-1))]),_:1}),(0,c.bF)(A,{label:"bbUrl",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"quote-right",class:"radio-icon"}),t[27]||(t[27]=(0,c.Lk)("span",null,"BBCode",-1))]),_:1}),(0,c.bF)(A,{label:"tgId",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"paper-plane",class:"radio-icon"}),t[28]||(t[28]=(0,c.Lk)("span",null,"TG File ID",-1))]),_:1}),(0,c.bF)(A,{label:"s3Location",class:"radio-card"},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"cloud",class:"radio-icon"}),(0,c.Lk)("span",null,(0,h.v_)(e.$t("settings.s3Link")),1)]),_:1})]),_:1},8,["modelValue"])])]),(0,c.Lk)("div",Ri,[(0,c.Lk)("div",Oi,[(0,c.Lk)("span",Ni,(0,h.v_)(e.$t("settings.customLink")),1),(0,c.bF)(v,{content:e.$t("settings.customLinkTooltip"),placement:"top","raw-content":""},{default:(0,c.k6)(()=>[(0,c.bF)(u,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,c.Lk)("div",Mi,[(0,c.Lk)("div",Vi,[(0,c.Lk)("span",Xi,(0,h.v_)(e.$t("settings.enableCustom")),1),(0,c.bF)(U,{modelValue:n.useCustomUrl,"onUpdate:modelValue":t[15]||(t[15]=e=>n.useCustomUrl=e),"active-value":"true","inactive-value":"false"},null,8,["modelValue"])]),"true"===n.useCustomUrl?((0,c.uX)(),(0,c.CE)("div",ji,[(0,c.Lk)("span",Ki,(0,h.v_)(e.$t("settings.customPrefix")),1),(0,c.bF)(f,{modelValue:n.customUrlPrefix,"onUpdate:modelValue":t[16]||(t[16]=e=>n.customUrlPrefix=e),placeholder:e.$t("settings.customPrefixPlaceholder"),class:"setting-input"},null,8,["modelValue","placeholder"])])):(0,c.Q3)("",!0)])]),(0,c.Lk)("div",Zi,[(0,c.bF)(L,{type:"primary",onClick:t[17]||(t[17]=e=>n.showUrlDialog=!1),class:"confirm-btn"},{default:(0,c.k6)(()=>[(0,c.eW)((0,h.v_)(e.$t("settings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"]),(0,c.bF)(P,{modelValue:n.showTagDialog,"onUpdate:modelValue":t[19]||(t[19]=e=>n.showTagDialog=e),fileId:n.currentTagFile,onTagsUpdated:s.handleTagsUpdated},null,8,["modelValue","fileId","onTagsUpdated"]),(0,c.bF)(R,{modelValue:n.showBatchTagDialog,"onUpdate:modelValue":t[20]||(t[20]=e=>n.showBatchTagDialog=e),selectedFiles:n.selectedFiles,onTagsUpdated:s.handleBatchTagsUpdated},null,8,["modelValue","selectedFiles","onTagsUpdated"]),(0,c.bF)(O,{modelValue:n.showMobileActionModal,"onUpdate:modelValue":t[21]||(t[21]=e=>n.showMobileActionModal=e),title:n.mobileActionIsFolder?s.getFolderName(n.mobileActionFile?.name||""):n.mobileActionFile?.metadata?.FileName||s.getFileName(n.mobileActionFile?.name||""),isFolder:n.mobileActionIsFolder,onAction:s.handleMobileAction},null,8,["modelValue","title","isFolder","onAction"]),(0,c.bF)(N,{modelValue:n.showMobileDirectoryDrawer,"onUpdate:modelValue":t[22]||(t[22]=e=>n.showMobileDirectoryDrawer=e),currentPath:n.currentPath,onNavigate:s.navigateToFolder,onGoBack:s.handleGoBack},null,8,["modelValue","currentPath","onNavigate","onGoBack"]),(0,c.bF)(M,{modelValue:n.showMoveDialog,"onUpdate:modelValue":t[23]||(t[23]=e=>n.showMoveDialog=e),"current-directory":n.currentPath,"is-batch-move":n.isBatchMove,"initial-path":n.moveTargetPath,onConfirm:s.confirmMove},null,8,["modelValue","current-directory","is-batch-move","initial-path","onConfirm"])])}a(81148),a(20116),a(13579),a(17642),a(58004),a(33853),a(45876),a(32475),a(15024),a(31698),a(14603),a(47566),a(98721);var Hi=a(60782),qi=a(44813),Qi=a.n(qi),Yi=a(54047),Ji=(a(58335),a(46638));class en{constructor(){this.FILE_LIST_PATH="data/fileList.json",this.fileListCache=null,this.storageWarningShown=!1}getLocalFileList(){const e=this.getMutableFileList();return{...e,files:[...e.files||[]],directories:[...e.directories||[]]}}getMutableFileList(){if(this.fileListCache)return this.fileListCache;try{const e=localStorage.getItem(this.FILE_LIST_PATH);return this.fileListCache=e?JSON.parse(e):this.createEmptyFileList(),this.fileListCache}catch(e){return console.error("Error reading local file list:",e),this.fileListCache=this.createEmptyFileList(),this.fileListCache}}updateFileListCache(e){this.fileListCache=e||this.createEmptyFileList();const t=this.persistFileListCache();return{cacheUpdated:!0,persisted:t}}persistFileListCache(){try{return localStorage.setItem(this.FILE_LIST_PATH,JSON.stringify(this.fileListCache)),!0}catch(e){return this.handleStoragePersistError(e),!1}}createEmptyFileList(){return{files:[],directories:[]}}handleStoragePersistError(e){console.warn("File list is kept in memory because localStorage persistence failed:",e);try{localStorage.removeItem(this.FILE_LIST_PATH)}catch(t){console.warn("Failed to remove stale file list cache:",t)}this.storageWarningShown||(this.storageWarningShown=!0,ye.nk.warning(Ji.Ay.global.t("dashboard.fileListMemoryCacheWarning")))}addFile(e){try{const t=this.getMutableFileList();return t.files.push(e),this.updateFileListCache(t).cacheUpdated}catch(t){return console.error("Error adding file:",t),!1}}addFolder(e){try{const t=this.getMutableFileList();return!t.directories.includes(e)&&(t.directories.push(e),this.updateFileListCache(t).cacheUpdated)}catch(t){return console.error("Error adding folder:",t),!1}}moveFile(e,t,a=!1,i=""){try{let n=this.getMutableFileList();if(a){const t=n.directories.indexOf(e);-1!==t&&n.directories.splice(t,1)}else{const t=n.files.findIndex(t=>t.name===e);-1!==t&&n.files.splice(t,1)}if(t.startsWith(i)){const e=t.substring(i.length).split("/");if(e.length>1){const t=i+e[0];n.directories.includes(t)||n.directories.push(t)}}return this.updateFileListCache(n).cacheUpdated}catch(n){return console.error("Error moving file:",n),!1}}removeFile(e){try{let t=this.getMutableFileList();return t.files=t.files.filter(t=>t.name!==e),this.updateFileListCache(t).cacheUpdated}catch(t){return console.error("Error removing file:",t),!1}}removeFolder(e){try{let t=this.getMutableFileList();return t.files=t.files.filter(t=>!t.name.startsWith(e+"/")),t.directories=t.directories.filter(t=>t!==e),this.updateFileListCache(t).cacheUpdated}catch(t){return console.error("Error removing folder:",t),!1}}getFilesInFolder(e){try{const t=this.getMutableFileList(),a=t.files.filter(t=>t.name.startsWith(e+"/")),i=t.directories.filter(t=>t.startsWith(e+"/"));return{files:a,directories:i}}catch(t){return console.error("Error getting files in folder:",t),{files:[],directories:[]}}}buildFilterParams(e){let t="";return e.accessStatus&&e.accessStatus.length>0&&(t+=`&accessStatus=${encodeURIComponent(e.accessStatus.join(","))}`),e.listType&&e.listType.length>0&&(t+=`&listType=${encodeURIComponent(e.listType.join(","))}`),e.label&&e.label.length>0&&(t+=`&label=${encodeURIComponent(e.label.join(","))}`),e.fileType&&e.fileType.length>0&&(t+=`&fileType=${encodeURIComponent(e.fileType.join(","))}`),e.channel&&e.channel.length>0&&(t+=`&channel=${encodeURIComponent(e.channel.join(","))}`),e.channelName&&e.channelName.length>0&&(t+=`&channelName=${encodeURIComponent(e.channelName.join(","))}`),t}async refreshFileList(e,t="",a="",i="",n={}){t=t.trim();try{let s=`/api/manage/list?count=60&dir=${e}&search=${encodeURIComponent(t)}`;a&&(s+=`&includeTags=${encodeURIComponent(a)}`),i&&(s+=`&excludeTags=${encodeURIComponent(i)}`),s+=this.buildFilterParams(n);const r=await(0,E.A)(s,{method:"GET"}),o=await r.json();return o.isIndexedResponse||ye.nk.warning(Ji.Ay.global.t("dashboard.indexingWarning")),this.updateFileListCache(o).cacheUpdated}catch(s){return console.error("Error refreshing file list:",s),!1}}async loadMoreFiles(e,t="",a="",i="",n=60,s={}){t=t.trim();try{const r=this.getMutableFileList(),o=r.files.length;let l=`/api/manage/list?dir=${e}&start=${o}&count=${n}&search=${encodeURIComponent(t)}`;a&&(l+=`&includeTags=${encodeURIComponent(a)}`),i&&(l+=`&excludeTags=${encodeURIComponent(i)}`),l+=this.buildFilterParams(s);const d=await(0,E.A)(l,{method:"GET"}),c=await d.json();return r.files.push(...c.files),this.updateFileListCache(r).cacheUpdated}catch(r){return console.error("Error loading more files:",r),{files:[],directories:[]}}}}const tn=new en;var an=a(62388),nn=a(48903),sn=a(90144);function rn(e,t){return!(e.right<=t.left||e.left>=t.right||e.bottom<=t.top||e.top>=t.bottom)}function on(e,t){const a=Math.min(e.x,t.x),i=Math.min(e.y,t.y),n=Math.abs(t.x-e.x),s=Math.abs(t.y-e.y);return{left:a,top:i,width:n,height:s,right:a+n,bottom:i+s}}function ln(e){const{modes:t,mainSelector:a=".main-container",viewMode:i,items:n}=e,s=(0,sn.KR)(!1),r=(0,sn.KR)({left:0,top:0,width:0,height:0,right:0,bottom:0});let o=null,l=[],d=!1;const h=768;let u=!1;const f=50,m=10;let p=null,g="";function b(){const e=(0,sn.BA)(i);return t[e]||void 0}function v(){const e=(0,sn.BA)(i);return("card"===e||"list"===e)&&window.innerWidth>h}function k(){v()?u||A():u&&(U(),I())}function y(e){const t=e.target,i=t.closest(a);if(!i)return!1;const n=b();if(n){const e=t.closest(n.itemSelector);if(e){const t=(0,sn.BA)(n.containerRef);if(t&&t.contains(e))return!1}}const s=t.closest("button, a, input, .el-input, .el-dropdown, .el-checkbox, .el-breadcrumb, .el-pagination, .el-pager, .header-content, .breadcrumb-container");return!s}function _(e){return e.shiftKey||e.ctrlKey||e.metaKey}function w(){const e=(0,sn.BA)(n);l=e.map(e=>!!e.selected)}let F=0;function C(){function e(){const t=window.innerHeight;let a=0;F>=t-f?a=m:F<=f&&(a=-m),0!==a&&(window.scrollBy(0,a),o&&(o.y-=a,r.value=on(o,{x:r.value.right>=o.x?r.value.right:r.value.left,y:F}),S())),p=requestAnimationFrame(e)}null===p&&(p=requestAnimationFrame(e))}function T(){null!==p&&(cancelAnimationFrame(p),p=null)}function $(){g=document.body.style.userSelect,document.body.style.userSelect="none"}function L(){document.body.style.userSelect=g}function S(){const e=b();if(!e)return;const t=(0,sn.BA)(e.containerRef);if(!t)return;const a=(0,sn.BA)(n),i=r.value,s={left:i.left,top:i.top,right:i.right,bottom:i.bottom},o=t.querySelectorAll(e.itemSelector);a.forEach((e,t)=>{const a=o[t];if(!a)return;const i=a.getBoundingClientRect(),n={left:i.left,top:i.top,right:i.right,bottom:i.bottom},r=rn(s,n);d&&l[t]?e.selected=!0:e.selected=r})}function x(e){if(0===e.button&&y(e)){if(o={x:e.clientX,y:e.clientY},d=_(e),w(),!d){const e=(0,sn.BA)(n);e.forEach(e=>{e.selected=!1})}s.value=!0,r.value=on(o,o),$(),document.addEventListener("mousemove",D),document.addEventListener("mouseup",E)}}function D(e){if(!s.value||!o)return;const t={x:e.clientX,y:e.clientY};F=e.clientY,r.value=on(o,t),S();const a=window.innerHeight;F<=f||F>=a-f?C():T()}function E(e){s.value&&(T(),L(),s.value=!1,r.value={left:0,top:0,width:0,height:0,right:0,bottom:0},o=null,document.removeEventListener("mousemove",D),document.removeEventListener("mouseup",E))}function A(){u||(document.addEventListener("mousedown",x),u=!0)}function I(){u&&(document.removeEventListener("mousedown",x),u=!1)}function U(){s.value&&(T(),L(),s.value=!1,r.value={left:0,top:0,width:0,height:0,right:0,bottom:0},o=null,document.removeEventListener("mousemove",D),document.removeEventListener("mouseup",E))}function z(){k()}return(0,c.wB)(()=>(0,sn.BA)(i),()=>{U(),k()}),(0,c.sV)(()=>{v()&&A(),window.addEventListener("resize",z)}),(0,c.xo)(()=>{U(),L(),T(),I(),window.removeEventListener("resize",z)}),{isDragging:s,selectionRect:r}}var dn={name:"AdminDashBoard",mixins:[nn.A],data(){return{Number:0,directFileCount:0,directFolderCount:0,showLogoutButton:!1,tableData:[],tempSearch:"",search:"",searchKeywords:"",searchIncludeTags:"",searchExcludeTags:"",isSearchMode:!1,currentPage:1,pageSize:15,selectedFiles:[],sortOption:"dateDesc",isUploading:!1,showdetailDialog:!1,detailFile:null,activeUrlTab:"originUrl",defaultUrlFormat:"originUrl",showUrlDialog:!1,useCustomUrl:"false",customUrlPrefix:"",loading:!1,currentPath:"",refreshLoading:!1,showTagDialog:!1,showBatchTagDialog:!1,currentTagFile:"",viewMode:"card",showMobileActionModal:!1,mobileActionFile:null,mobileActionIndex:-1,mobileActionIsFolder:!1,longPressTimer:null,showMobileDirectoryDrawer:!1,jumpPage:"",filters:{accessStatus:[],listType:[],label:[],fileType:[],channel:[],channelName:[]},channelNameOptions:[],showMoveDialog:!1,moveTargetPath:"/",moveFileKey:"",moveFileIndex:-1,isBatchMove:!1}},components:{DashboardTabs:ti.A,TagManagementDialog:Me,BatchTagDialog:Ce,SkeletonLoader:Ta,FileCard:ua,FolderCard:_a,FileListItem:Vt,FileDetailDialog:ct,BatchActionBar:kt,MobileActionSheet:Q,MobileDirectoryDrawer:X,FilterDropdown:ei,MoveFileDialog:z,LanguageSwitcher:Yi.A},setup(){const e=(0,sn.KR)(null),t=(0,sn.KR)(null),a=(0,sn.KR)("card"),i=(0,sn.KR)([]),{isDragging:n,selectionRect:s}=ln({modes:{card:{containerRef:e,itemSelector:".img-card"},list:{containerRef:t,itemSelector:".list-item"}},viewMode:a,items:i});return{cardContainerRef:e,listContainerRef:t,viewModeRef:a,itemsRef:i,isDragging:n,selectionRect:s}},computed:{...(0,Hi.L8)(["adminUrlSettings","userConfig"]),filteredTableData(){return this.tableData},totalPages(){return Math.ceil(this.filteredTableData.length/this.pageSize)||1},realTotalPages(){const e=this.directFolderCount+this.directFileCount;return Math.ceil(e/this.pageSize)||1},activeFilterCount(){return Object.values(this.filters).reduce((e,t)=>e+(Array.isArray(t)?t.length:0),0)},hasSearchOrFilter(){return this.isSearchMode||this.activeFilterCount>0},paginatedTableData(){const e=this.sortData(this.filteredTableData),t=(this.currentPage-1)*this.pageSize,a=t+this.pageSize;let i=e.slice(t,a);const n=i.filter(e=>this.isImage(e)).map(e=>this.getFileLink(e.name));return i.forEach(e=>{this.isImage(e)&&(e.previewSrcList=n.slice(n.indexOf(this.getFileLink(e.name))).concat(n.slice(0,n.indexOf(this.getFileLink(e.name)))))}),i.forEach(e=>{"TelegramNew"===e.metadata?.Channel||"Telegram"===e.metadata?.Channel?e.channelTag="TG":"CloudflareR2"===e.metadata?.Channel?e.channelTag="R2":"S3"===e.metadata?.Channel?e.channelTag="S3":"Discord"===e.metadata?.Channel?e.channelTag="DC":"HuggingFace"===e.metadata?.Channel?e.channelTag="HF":"WebDAV"===e.metadata?.Channel?e.channelTag="WD":"External"===e.metadata?.Channel?e.channelTag=this.$t("dashboard.externalTag"):e.channelTag=this.$t("dashboard.unknownTag")}),i},sortIcon(){return"dateDesc"===this.sortOption?"sort-amount-down":"sort-alpha-up"},dialogWidth(){return window.innerWidth>768?"50%":"90%"},detailDialogWidth(){return window.innerWidth>768?"70%":"90%"},accessType(){return"White"===this.detailFile?.metadata?.ListType?this.$t("filter.normal"):"Block"===this.detailFile?.metadata?.ListType||"adult"===this.detailFile?.metadata?.Label?this.$t("filter.blocked"):this.$t("filter.normal")},allUrl(){return"External"===this.detailFile?.metadata?.Channel?{originUrl:`${this.detailFile?.metadata?.ExternalLink}`,mdUrl:`![${this.detailFile?.metadata?.FileName||this.detailFile?.name}](${this.detailFile?.metadata?.ExternalLink})`,htmlUrl:`${this.detailFile?.metadata?.FileName||this.detailFile?.name}`,bbUrl:`[img]${this.detailFile?.metadata?.ExternalLink}[/img]`,tgId:this.detailFile?.metadata?.TgFileId||this.$t("fileDetail.unknown"),S3Location:this.detailFile?.metadata?.S3Location||this.$t("fileDetail.unknown"),S3CdnFileUrl:this.detailFile?.metadata?.S3CdnFileUrl||this.$t("fileDetail.unknown")}:{originUrl:`${this.rootUrl}${this.detailFile?.name}`,mdUrl:`![${this.detailFile?.metadata?.FileName||this.detailFile?.name}](${this.rootUrl}${this.detailFile?.name})`,htmlUrl:`${this.detailFile?.metadata?.FileName||this.detailFile?.name}`,bbUrl:`[img]${this.rootUrl}${this.detailFile?.name}[/img]`,tgId:this.detailFile?.metadata?.TgFileId||this.$t("fileDetail.unknown"),S3Location:this.detailFile?.metadata?.S3Location||this.$t("fileDetail.unknown"),S3CdnFileUrl:this.detailFile?.metadata?.S3CdnFileUrl||this.$t("fileDetail.unknown")}},tableColumnNum(){return window.innerWidth>768?3:1},tablePreviewSpan(){return window.innerWidth>768?2:1},disableTooltip(){return window.innerWidth<768},selectPage(){return this.paginatedTableData.every(e=>e.selected)},selectedPageFiles(){return this.paginatedTableData.some(e=>e.selected)},selectPageIcon(){return this.selectPage?"check-square":this.selectedPageFiles?"minus-square":"square"},rootUrl(){return"true"===this.useCustomUrl?this.customUrlPrefix:this.userConfig?.urlPrefix||`${document.location.origin}/file/`},isSelectAll:{get(){return this.paginatedTableData.length>0&&this.paginatedTableData.every(e=>e.selected)},set(e){this.paginatedTableData.forEach(t=>t.selected=e)}},isIndeterminate(){const e=this.paginatedTableData.filter(e=>e.selected).length;return e>0&&ee.selected&&!this.selectedFiles.includes(e))),this.selectedFiles=this.selectedFiles.filter(e=>e.selected),this.selectedFiles=this.selectedFiles.filter(t=>e.includes(t))},deep:!0},sortOption(e){localStorage.setItem("sortOption",e)},defaultUrlFormat(e){localStorage.setItem("defaultUrlFormat",e)},showdetailDialog(e){e&&(this.activeUrlTab=this.defaultUrlFormat||"originUrl")},customUrlPrefix(e){this.$store.commit("setAdminUrlSettings",{key:"customUrlPrefix",value:e})},useCustomUrl(e){this.$store.commit("setAdminUrlSettings",{key:"useCustomUrl",value:e})},currentPath(e){this.tableData.forEach(e=>e.selected=!1)}},methods:{toggleViewMode(){this.viewMode="card"===this.viewMode?"list":"card",localStorage.setItem("viewMode",this.viewMode)},handleSelectAllPage(e){this.paginatedTableData.forEach(t=>t.selected=e)},handleTouchStart(e,t){this.longPressTimer=setTimeout(()=>{this.mobileActionFile=e,this.mobileActionIndex=t,this.mobileActionIsFolder=!1,this.showMobileActionModal=!0},500)},handleTouchEnd(){this.longPressTimer&&(clearTimeout(this.longPressTimer),this.longPressTimer=null)},handleFolderTouchStart(e,t){this.longPressTimer=setTimeout(()=>{this.mobileActionFile=e,this.mobileActionIndex=t,this.mobileActionIsFolder=!0,this.showMobileActionModal=!0},500)},handleMobileAction(e){const t=this.mobileActionFile,a=this.mobileActionIndex;if(this.showMobileActionModal=!1,t)switch(e){case"detail":this.openDetailDialog(a,t.name);break;case"copy":this.handleCopy(a,t.name);break;case"folderCopy":this.handleFolderCopy(t.name);break;case"download":this.handleDownload(t.name);break;case"move":this.handleMove(a,t.name);break;case"delete":this.handleDelete(a,t.name);break;case"tag":this.handleTagManagement(t.name);break}},handleGoBack(){const e=this.currentPath.split("/").filter(Boolean);if(e.length>0){e.pop();const t=e.join("/");this.navigateToFolder(t)}this.showMobileDirectoryDrawer=!1},getTagColor(e){const t=["linear-gradient(135deg, #667eea 0%, #764ba2 100%)","linear-gradient(135deg, #f093fb 0%, #f5576c 100%)","linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)","linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)","linear-gradient(135deg, #fa709a 0%, #fee140 100%)","linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)"];return t[e%t.length]},handleVideoHover(e,t){const a=e.target;t?a.play().catch(()=>{}):(a.pause(),a.currentTime=0)},formatFileSize(e){if(!e||0===e)return"-";if(e=Number(e),isNaN(e))return"-";const t=["B","KB","MB","GB","TB"];let a=0;while(e>=1024&&a0?1:0)+" "+t[a]},handleSearch(){if(this.search=this.tempSearch,this.isSearchMode=""!==this.search.trim(),this.currentPage=1,this.search&&this.search.trim()){const e=[],t=[];let a=this.search;const i=/-#([\w\u4e00-\u9fa5\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af\.\+\-]+)/g;a=a.replace(i,(e,a)=>(t.push(a.toLowerCase())," "));const n=/#([\w\u4e00-\u9fa5\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af\.\+\-]+)/g;a=a.replace(n,(t,a)=>(e.push(a.toLowerCase())," ")),this.searchKeywords=a.replace(/\s+/g," ").trim(),this.searchIncludeTags=e.join(","),this.searchExcludeTags=t.join(","),console.log("Search keywords:",this.searchKeywords),console.log("Include tags:",this.searchIncludeTags),console.log("Exclude tags:",this.searchExcludeTags)}else this.searchKeywords="",this.searchIncludeTags="",this.searchExcludeTags="";this.refreshFileList()},handleFilterChange({type:e,filters:t}){this.filters=t,this.currentPage=1,this.refreshFileList()},clearFilters(){this.filters={listType:[],label:[],fileType:[],channel:[],channelName:[]},this.currentPage=1,this.refreshFileList()},async extractChannelNames(){try{const e=await(0,E.A)("/api/channels?includeDisabled=true",{method:"GET"});if(e.ok){const t=await e.json(),a=[],i={telegram:"Telegram",cfr2:"Cloudflare R2",s3:"S3",discord:"Discord",huggingface:"HuggingFace",webdav:"WebDAV"};Object.entries(t).forEach(([e,t])=>{Array.isArray(t)&&t.length>0&&t.forEach(t=>{t.name&&a.push({name:t.name,type:t.type,typeLabel:i[e]||e,value:`${t.type}:${t.name}`})})}),a.sort((e,t)=>e.type!==t.type?e.type.localeCompare(t.type):e.name.localeCompare(t.name)),this.channelNameOptions=a}}catch(e){console.error("Failed to fetch channel names:",e)}},handleDownload(e){const t=document.createElement("a");t.href=this.getFileLink(e),t.download=e,t.click()},openDetailDialog(e,t){this.detailFile=this.paginatedTableData[e],this.showdetailDialog=!0},handleTabClick(e){this.activeUrlTab=e.props.name},handleUrlClick(e){navigator.clipboard.writeText(e.target.value).then(()=>{this.$message({type:"success",message:this.$t("dashboard.copySuccess")})}).catch(()=>{this.$message({type:"error",message:this.$t("dashboard.copyFailed")})})},handleDetailDelete(e){this.$confirm(this.$t("dashboard.deleteConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{(0,E.A)(`/api/manage/delete/${e}`,{method:"GET"}).then(t=>{if(!t.ok)return Promise.reject("Request failed");{const t=this.tableData.findIndex(t=>t.name===e);-1!==t&&this.tableData.splice(t,1)}}).then(()=>{this.updateStats(-1,!1),this.$message.success(this.$t("dashboard.deleteSuccess")),this.showdetailDialog=!1}).catch(()=>this.$message.error(this.$t("dashboard.deleteFailed")))}).catch(()=>console.log("Delete cancelled"))},handleBlock(e){this.$confirm(this.$t("dashboard.blockConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{(0,E.A)(`/api/manage/block/${e}`,{method:"GET"}).then(t=>{if(!t.ok)return Promise.reject("Request failed");{const t=this.tableData.findIndex(t=>t.name===e);-1!==t&&(this.tableData[t].metadata.ListType="Block")}}).then(()=>{this.$message.success(this.$t("dashboard.blockSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.blockFailed")))}).catch(()=>console.log("Block cancelled"))},handleWhite(e){this.$confirm(this.$t("dashboard.whiteConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{(0,E.A)(`/api/manage/white/${e}`,{method:"GET"}).then(t=>{if(!t.ok)return Promise.reject("Request failed");{const t=this.tableData.findIndex(t=>t.name===e);-1!==t&&(this.tableData[t].metadata.ListType="White")}}).then(()=>{this.$message.success(this.$t("dashboard.whiteSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.whiteFailed")))}).catch(()=>console.log("White cancelled"))},handleDelete(e,t){const a=this.tableData.find(e=>e.name===t).isFolder;this.$confirm(a?this.$t("dashboard.deleteFolderConfirm"):this.$t("dashboard.deleteFileConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{(0,E.A)(`/api/manage/delete/${t}?folder=${a}`,{method:"GET"}).then(e=>{if(!e.ok)return Promise.reject("Request failed");{const e=this.tableData.findIndex(e=>e.name===t);-1!==e&&this.tableData.splice(e,1)}}).then(()=>{this.updateStats(-1,!1),tn.removeFile(t),this.$message.success(this.$t("dashboard.deleteSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.deleteFailed")))}).catch(()=>console.log("Delete cancelled"))},handleBatchDelete(){this.$confirm(this.$t("dashboard.batchDeleteConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{const e=this.selectedFiles.map(e=>{const t=e.isFolder;return(0,E.A)(`/api/manage/delete/${e.name}?folder=${t}`,{method:"GET"})});Promise.all(e).then(e=>{let t=0;e.forEach((e,a)=>{if(e.ok){t++;const e=this.tableData.findIndex(e=>e.name===this.selectedFiles[a].name);-1!==e&&this.tableData.splice(e,1),tn.removeFile(this.selectedFiles[a].name)}}),this.selectedFiles=[],this.updateStats(-t,!1),this.$message.success(this.$t("dashboard.batchDeleteSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.batchDeleteFailed")))}).catch(()=>console.log("Batch delete cancelled"))},async handleBatchCopy(){const e=this.selectedFiles.filter(e=>!e.isFolder),t=this.selectedFiles.filter(e=>e.isFolder);let a=null;t.length>0&&(a=this.$loading({lock:!0,text:this.$t("dashboard.fetchingFileList")}));try{let n=[...e];for(const e of t)try{const t=await(0,E.A)(`/api/manage/list?dir=${encodeURIComponent(e.name)}&recursive=true&count=-1`,{method:"GET"}),a=await t.json();a.files&&a.files.length>0&&(n=n.concat(a.files))}catch(i){console.error(`获取文件夹 ${e.name} 内容失败:`,i)}if(a&&a.close(),0===n.length)return void this.$message.warning(this.$t("dashboard.noLinksAvailable"));const s=n.map(e=>this.generateFileLink(e.name,e.metadata)).filter(e=>e);if(0===s.length)return void this.$message.warning(this.$t("dashboard.noLinksAvailable"));const r=s.join("\n");navigator.clipboard?(await navigator.clipboard.writeText(r),this.$message.success(this.$t("dashboard.batchCopySuccess",{count:s.length}))):this.copyToClipboardFallback(r)}catch(i){a&&a.close(),console.error("Batch copy failed:",i),this.$message.error(this.$t("dashboard.batchCopyFailed"))}},copyToClipboardFallback(e){const t=document.createElement("textarea");document.body.appendChild(t),t.style.position="fixed",t.style.clip="rect(0 0 0 0)",t.style.top="10px",t.value=e,t.select(),document.execCommand("copy"),document.body.removeChild(t),this.$message.success(this.$t("dashboard.batchCopyLinksSuccess"))},handleCopy(e,t){let a="";if("External"===this.paginatedTableData[e].metadata?.Channel)switch(this.defaultUrlFormat){case"originUrl":a=this.paginatedTableData[e].metadata?.ExternalLink;break;case"mdUrl":a=`![${this.paginatedTableData[e].metadata?.FileName||t}](${this.paginatedTableData[e].metadata?.ExternalLink})`;break;case"htmlUrl":a=`${this.paginatedTableData[e].metadata?.FileName||t}`;break;case"bbUrl":a=`[img]${this.paginatedTableData[e].metadata?.ExternalLink}[/img]`;break;case"tgId":a=this.paginatedTableData[e].metadata?.TgFileId||"none";break;case"s3Location":a=this.paginatedTableData[e].metadata?.S3Location||"none";break}else switch(this.defaultUrlFormat){case"originUrl":a=`${this.rootUrl}${t}`;break;case"mdUrl":a=`![${this.paginatedTableData[e].metadata?.FileName||t}](${this.rootUrl}${t})`;break;case"htmlUrl":a=`${this.paginatedTableData[e].metadata?.FileName||t}`;break;case"bbUrl":a=`[img]${this.rootUrl}${t}[/img]`;break;case"tgId":a=this.paginatedTableData[e].metadata?.TgFileId||"none";break;case"s3Location":a=this.paginatedTableData[e].metadata?.S3Location||"none";break}navigator.clipboard?navigator.clipboard.writeText(a).then(()=>this.$message.success(this.$t("dashboard.copyFileLinkSuccess"))):this.copyToClipboardFallback(a)},async loadMoreData(){this.loading=!0;try{await tn.loadMoreFiles(this.currentPath,this.searchKeywords,this.searchIncludeTags,this.searchExcludeTags,60,this.filters),await this.fetchFileList()}catch(e){this.$message.error(this.$t("dashboard.loadMoreFailed"))}finally{this.loading=!1}},updateStats(e,t=!1){t?this.Number=e:this.Number+=e},sort(e){this.sortOption=e},sortData(e){const t=e.filter(e=>e.isFolder),a=e.filter(e=>!e.isFolder);return"dateDesc"===this.sortOption?(t.sort((e,t)=>new Date(t.metadata?.TimeStamp)-new Date(e.metadata?.TimeStamp)),a.sort((e,t)=>new Date(t.metadata?.TimeStamp)-new Date(e.metadata?.TimeStamp))):(t.sort((e,t)=>e.name.localeCompare(t.name)),a.sort((e,t)=>e.name.localeCompare(t.name))),t.concat(a)},handleVideoClick(e){const t=e.target;t.requestFullscreen?t.requestFullscreen():t.webkitRequestFullscreen?t.webkitRequestFullscreen():t.mozRequestFullScreen?t.mozRequestFullScreen():t.msRequestFullscreen&&t.msRequestFullscreen()},handleLogout(){const e="/api/auth/logout";fetch(e,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:"admin"})}).finally(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")})},handleSelectPage(){this.selectPage?this.paginatedTableData.forEach(e=>e.selected=!1):this.paginatedTableData.forEach(e=>e.selected=!0)},clearSelection(){this.tableData.forEach(e=>e.selected=!1),this.selectedFiles=[]},handleBatchAction(e){"copy"===e?this.handleBatchCopy():"delete"===e?this.handleBatchDelete():"download"===e?this.handleBatchDownload():"move"===e?this.handleBatchMove():"tagManagement"===e?this.handleBatchTagManagement():"ban"===e?this.handleBatchBlock():"white"===e&&this.handleBatchWhite()},handleMove(e,t){this.moveFileKey=t,this.moveFileIndex=e,this.isBatchMove=!1,this.moveTargetPath="/",this.showMoveDialog=!0},handleBatchMove(){this.isBatchMove=!0,this.moveTargetPath="/",this.showMoveDialog=!0},confirmMove(e){const t=e,a=(0,an.G)(t);if(!a.valid)return void this.$message.error(a.error);const i=t.replace(/^\/+/,"")+(t.endsWith("/")||""===t?"":"/");i!==this.currentPath?(this.showMoveDialog=!1,this.isBatchMove?this.executeBatchMove(i):this.executeSingleMove(i)):this.$message.warning(this.$t("dashboard.moveTargetSameAsCurrent"))},executeSingleMove(e){const t=this.moveFileKey,a=this.tableData.find(e=>e.name===t)?.isFolder;(0,E.A)(`/api/manage/move/${t}?folder=${a}&dist=${encodeURIComponent(e)}`,{method:"GET"}).then(i=>{if(!i.ok)return Promise.reject("Request failed");{const i=this.tableData.findIndex(e=>e.name===t);if(-1!==i){const n=e+t.split("/").pop();tn.moveFile(t,n,a,this.currentPath),this.tableData.splice(i,1),this.$nextTick(()=>{const e=[...this.tableData];this.tableData=[],this.$nextTick(()=>{this.tableData=e})})}this.updateStats(-1,!1),this.$message.success(this.$t("dashboard.moveSuccess"))}}).then(()=>{this.refreshLocalFileList()}).catch(()=>this.$message.error(this.$t("dashboard.moveFailed")))},executeBatchMove(e){const t=this.selectedFiles.map(t=>{const a=t.isFolder;return(0,E.A)(`/api/manage/move/${t.name}?folder=${a}&dist=${encodeURIComponent(e)}`,{method:"GET"})});Promise.all(t).then(t=>{let a=0;t.forEach((t,i)=>{if(t.ok){a++;const t=this.selectedFiles[i];t.selected=!1;const n=this.tableData.findIndex(e=>e.name===t.name);if(-1!==n){const a=e+t.name.split("/").pop();tn.moveFile(t.name,a,t.isFolder,this.currentPath),this.tableData.splice(n,1)}}}),this.$nextTick(()=>{const e=[...this.tableData];this.tableData=[],this.$nextTick(()=>{this.tableData=e})}),this.updateStats(-a,!1),this.$message.success(this.$t("dashboard.moveSuccess"))}).then(()=>{this.refreshLocalFileList()}).catch(()=>this.$message.error(this.$t("dashboard.moveFailed")))},handleBatchBlock(){this.$confirm(this.$t("dashboard.batchBlockConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{const e=this.selectedFiles.map(e=>e.isFolder?Promise.resolve({ok:!1}):(0,E.A)(`/api/manage/block/${e.name}`,{method:"GET"}));Promise.all(e).then(e=>{e.forEach((e,t)=>{if(e.ok){const e=this.tableData.findIndex(e=>e.name===this.selectedFiles[t].name);-1!==e&&(this.tableData[e].metadata.ListType="Block")}}),this.$message.success(this.$t("dashboard.batchBlockSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.batchBlockFailed")))}).catch(()=>console.log("Batch block cancelled"))},handleBatchWhite(){this.$confirm(this.$t("dashboard.batchWhiteConfirm"),this.$t("dashboard.deleteConfirmTitle"),{confirmButtonText:this.$t("dashboard.deleteConfirmOk"),cancelButtonText:this.$t("dashboard.deleteConfirmCancel"),type:"warning"}).then(()=>{const e=this.selectedFiles.map(e=>e.isFolder?Promise.resolve({ok:!1}):(0,E.A)(`/api/manage/white/${e.name}`,{method:"GET"}));Promise.all(e).then(e=>{e.forEach((e,t)=>{if(e.ok){const e=this.tableData.findIndex(e=>e.name===this.selectedFiles[t].name);-1!==e&&(this.tableData[e].metadata.ListType="White")}}),this.$message.success(this.$t("dashboard.batchWhiteSuccess"))}).catch(()=>this.$message.error(this.$t("dashboard.batchWhiteFailed")))}).catch(()=>console.log("Batch white cancelled"))},handleBatchDownload(){const e=new(Qi()),t=e.folder("files"),a={},i=this.selectedFiles.map(async e=>{if(e.isFolder)return;const i=await fetch(this.getFileLink(e.name)),n=await i.blob();let s=e.metadata?.FileName||e.name;if(a[s]){const t=s.substring(s.lastIndexOf(".")),i=s.substring(0,s.lastIndexOf("."));s=`${i}(${a[s]})${t}`,a[e.name]++}else a[s]=1;t.file(s,n)});Promise.all(i).then(()=>e.generateAsync({type:"blob"})).then(e=>{const t=document.createElement("a");t.href=URL.createObjectURL(e),t.download="files.zip",t.click()})},isVideo(e){if(this.isAudio(e))return!1;let t=e.metadata?.FileType?.includes("video");if(!t){const a=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","rmvb","3gp","mpg","mpeg","m4v","f4v","rm","asf","dat","ts","vob","swf","divx","xvid","m2ts","mts","m2v","3g2","3gp2","3gpp","3gpp2","mpe","m1v","mpv","mpv2","mp2v","m2t","m2ts","m2v","m4v"],i=e.name.substring(e.name.lastIndexOf(".")+1).toLowerCase();t=a.includes(i)}return t},isAudio(e){let t=e.metadata?.FileType?.includes("audio");if(!t){const a=["mp3","wav","flac","aac","ogg","wma","m4a","ape","aiff","alac","opus","mid","midi","m4b","m4p","m4r","amr","au","ra","ram"],i=e.name.substring(e.name.lastIndexOf(".")+1).toLowerCase();t=a.includes(i)}return t},isImage(e){let t=e.metadata?.FileType?.includes("image");if(!t){const a=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","psd","ai","eps","raw","cr2","nef","orf","sr2","dng","arw","rw2","raf","pef","x3f","srf","erf","mrw","nrw","kdc","dcr","mef","mos","crw","raf","rwl","srw","3fr","fff","iiq","qtk","bay","k25","kdc","dcs","drf","dng","erf","kdc","mdc","mef","mos","mrw","nef","nrw","orf","pef","ptx","pxn","r3d","raf","raw","rwl","rw2","rwz","sr2","srf","x3f"],i=e.name.substring(e.name.lastIndexOf(".")+1).toLowerCase();t=a.includes(i)}return t},getFileLink(e){const t=`/file/${e}?from=admin`;return t},handlePageChange(e){this.currentPage=e,this.currentPage===Math.ceil(this.tableData.length/this.pageSize)&&this.loadMoreData()},handleJumpPage(){const e=parseInt(this.jumpPage);isNaN(e)||e<1?this.$message.warning(this.$t("dashboard.invalidPageNumber")):e>this.realTotalPages?this.$message.warning(this.$t("dashboard.pageExceedsMax",{max:this.realTotalPages})):(e>this.totalPages?(this.$message.info(this.$t("dashboard.loadingData")),this.loadMoreDataUntilPage(e)):this.currentPage=e,this.jumpPage="")},async loadMoreDataUntilPage(e){this.loading=!0;try{const t=e*this.pageSize,a=this.filteredTableData.filter(e=>e.isFolder).length,i=this.filteredTableData.filter(e=>!e.isFolder).length,n=Math.max(0,t-a-i);n>0&&(await tn.loadMoreFiles(this.currentPath,this.searchKeywords,this.searchIncludeTags,this.searchExcludeTags,n,this.filters),await this.fetchFileList()),this.currentPage=Math.min(e,this.totalPages)}catch(t){this.$message.error(this.$t("dashboard.loadDataFailed"))}finally{this.loading=!1}},isFolder(e){if(e.isFolder)return!0;let t=e.name;if(t.startsWith("http")&&(t=t.split("/file/")[1]),t&&t.includes("/")){const e=this.currentPath?t.substring(this.currentPath.length):t;return""===this.currentPath?!t.split("/")[0].includes("."):e.includes("/")}return!1},getFolderName(e){let t="";if(e&&e.includes("/")){const a=e.split("/");if(""===this.currentPath)t=a[0];else{const a=e.substring(this.currentPath.length);t=a.split("/")[0]}}else t=e;const a=20;if(t.length>a){const e=Math.floor((a-3)/2),i=Math.ceil((a-3)/2);return`${t.substring(0,e)}...${t.substring(t.length-i)}`}return t},getFileName(e){let t=e.split("/").pop();const a=20;if(t.length>a){const e=Math.floor((a-3)/2),i=Math.ceil((a-3)/2);return`${t.substring(0,e)}...${t.substring(t.length-i)}`}return t},getFileNameStart(e){if(!e)return"";if(e.length<=30)return e;const t=e.lastIndexOf(".");if(t>0){const a=e.substring(0,t),i=Math.min(a.length,Math.floor(.6*e.length));return a.substring(0,i)}return e.substring(0,Math.floor(.6*e.length))},getFileNameEnd(e){if(!e)return"";if(e.length<=30)return"";const t=e.lastIndexOf(".");if(t>0){const a=e.substring(t),i=e.substring(0,t),n=Math.min(8,Math.floor(.2*i.length));return"…"+i.substring(i.length-n)+a}const a=Math.min(10,Math.floor(.3*e.length));return"…"+e.substring(e.length-a)},enterFolder(e){this.currentPath=e+(e.endsWith("/")?"":"/"),this.refreshFileList()},navigateToFolder(e){this.currentPath=e?e+(e.endsWith("/")?"":"/"):"",this.refreshFileList()},async fetchFileList(){this.loading=!0;try{const e=tn.getLocalFileList(),t=new Set(e.directories||[]),a=e.files||[],i=Array.from(t).map(e=>({name:e,isFolder:!0,selected:!1,metadata:{FileName:e.split("/").pop()}})),n=a.map(e=>({name:e.name,isFolder:!1,selected:!1,metadata:e.metadata}));this.tableData=[...i,...n],this.updateStats(e.totalCount,!0),this.directFileCount=e.directFileCount||0,this.directFolderCount=e.directFolderCount||0}catch(e){console.error("Error fetching file list:",e),this.$message.error(this.$t("dashboard.fetchFileListFailed"))}finally{this.loading=!1}},async refreshFileList(){this.refreshLoading=!0,this.loading=!0;try{const e=await tn.refreshFileList(this.currentPath,this.searchKeywords,this.searchIncludeTags,this.searchExcludeTags,this.filters);if(!e)throw new Error("Refresh failed");await this.fetchFileList()}catch(e){!e.message?.includes("Unauthorized")&&this.$store.state.adminLoggedIn&&(console.error("Error refreshing file list:",e),this.$message.error(this.$t("dashboard.refreshFailed")))}finally{this.refreshLoading=!1,this.loading=!1}},async refreshLocalFileList(){this.refreshLoading=!0,this.loading=!0;try{await this.fetchFileList()}catch(e){console.error("Error refreshing local file list:",e),this.$message.error(this.$t("dashboard.refreshFailed"))}finally{this.refreshLoading=!1,this.loading=!1}},handleTagManagement(e){this.currentTagFile=e,this.showTagDialog=!0},handleBatchTagManagement(){0!==this.selectedFiles.length?this.showBatchTagDialog=!0:this.$message.warning(this.$t("dashboard.selectFilesFirst"))},async handleTagsUpdated(e){const t=this.tableData.findIndex(e=>e.name===this.currentTagFile);-1!==t&&(this.tableData[t].metadata||(this.tableData[t].metadata={}),this.tableData[t].metadata.Tags=e,this.showdetailDialog&&this.detailFile?.name===this.currentTagFile&&(this.detailFile.metadata||(this.detailFile.metadata={}),this.detailFile.metadata.Tags=e))},async handleBatchTagsUpdated(){await this.refreshLocalFileList()},handleMetadataUpdated(e,t){const a=this.tableData.findIndex(t=>t.name===e);-1!==a&&(this.tableData[a].metadata={...this.tableData[a].metadata,...t}),this.detailFile&&this.detailFile.name===e&&(this.detailFile.metadata={...this.detailFile.metadata,...t})},handleFileRenamed(e,t,a){const i=this.tableData.findIndex(t=>t.name===e);-1!==i&&(this.tableData[i].name=t,this.tableData[i].metadata={...this.tableData[i].metadata,...a}),this.detailFile&&this.detailFile.name===e&&(this.detailFile.name=t,this.detailFile.metadata={...this.detailFile.metadata,...a},this.showdetailDialog=!1,this.$nextTick(()=>{this.showdetailDialog=!0}))},generateFileLink(e,t){const a="External"===t?.Channel,i=a?t?.ExternalLink:`${this.rootUrl}${e}`,n=t?.FileName||e;switch(this.defaultUrlFormat){case"originUrl":return i;case"mdUrl":return`![${n}](${i})`;case"htmlUrl":return`${n}`;case"bbUrl":return`[img]${i}[/img]`;case"tgId":return t?.TgFileId||"";case"s3Location":return t?.S3Location||"";default:return i}},async handleFolderCopy(e){const t=this.$loading({lock:!0,text:this.$t("dashboard.fetchingFileList")});try{const a=await(0,E.A)(`/api/manage/list?dir=${encodeURIComponent(e)}&recursive=true&count=-1`,{method:"GET"}),i=await a.json();if(t.close(),!i.files||0===i.files.length)return void this.$message.warning(this.$t("dashboard.folderEmptyNoLinks"));const n=i.files.map(e=>this.generateFileLink(e.name,e.metadata)).filter(e=>e);if(0===n.length)return void this.$message.warning(this.$t("dashboard.noLinksAvailable"));const s=n.join("\n");navigator.clipboard?(await navigator.clipboard.writeText(s),this.$message.success(this.$t("dashboard.copiedFileLinks",{count:n.length}))):(this.copyToClipboardFallback(s),this.$message.success(this.$t("dashboard.copiedFileLinks",{count:n.length})))}catch(a){t.close(),console.error("Copy folder links failed:",a),this.$message.error(this.$t("dashboard.copyFolderLinksFailed"))}}},mounted(){this.initializeBackground("adminBkImg",".container",!1,!0),this.loading=!0,this.showLogoutButton=this.$store.state.adminLoggedIn,this.refreshFileList().then(()=>this.extractChannelNames()).catch(e=>{"Unauthorized"!==e.message&&this.$message.error(this.$t("dashboard.syncDataError"))}).finally(()=>{this.loading=!1}),this.customUrlPrefix=this.adminUrlSettings.customUrlPrefix,this.useCustomUrl=this.adminUrlSettings.useCustomUrl;const e=localStorage.getItem("viewMode");"card"!==e&&"list"!==e||(this.viewMode=e)}};const cn=(0,I.A)(dn,[["render",Gi],["__scopeId","data-v-437b7a30"]]);var hn=cn},23597:function(e,t,a){"use strict";a(85331)},33892:function(e,t,a){"use strict";a.d(t,{A:function(){return $}});var i=a(99114),n=(a(85331),a(30694),a(49385)),s=(a(37952),a(30650)),r=(a(19104),a(31802)),o=(a(13378),a(80047)),l=(a(99648),a(56768)),d=a(45130),c=a(24232);const h={class:"directory-tree-picker"},u={class:"tree-container"},f={key:0,class:"error-state"},m={class:"error-text"},p={class:"node-label"},g={class:"tree-container"},b={key:0,class:"error-state"},v={class:"error-text"},k={class:"node-label"};function y(e,t,a,y,_,w){const F=(0,l.g2)("font-awesome-icon"),C=o.S2,T=r.qk,$=s.Vc,L=n.pw,S=i.A;return(0,l.uX)(),(0,l.CE)("div",h,[w.isDesktop?((0,l.uX)(),(0,l.Wv)($,{key:0,visible:_.popoverVisible,"onUpdate:visible":t[1]||(t[1]=e=>_.popoverVisible=e),placement:"bottom-start",width:320,trigger:"click","popper-class":"directory-tree-popover","show-arrow":!0,"hide-after":0,"show-after":50,transition:"el-zoom-in-top"},{reference:(0,l.k6)(()=>[(0,l.Lk)("span",{class:"popover-trigger-wrapper",onClick:t[0]||(t[0]=(0,d.D$)(()=>{},["stop"]))},[(0,l.RG)(e.$slots,"trigger",{},void 0,!0)])]),default:(0,l.k6)(()=>[(0,l.bo)(((0,l.uX)(),(0,l.CE)("div",u,[_.error?((0,l.uX)(),(0,l.CE)("div",f,[(0,l.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,l.Lk)("span",m,(0,c.v_)(_.error),1),(0,l.bF)(C,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,l.k6)(()=>[(0,l.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,l.uX)(),(0,l.Wv)(T,{key:1,ref:"treeRef",data:_.treeData,props:_.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":a.currentDirectory,class:"directory-tree",onNodeClick:w.handleNodeClick},{default:(0,l.k6)(({node:e,data:t})=>[(0,l.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===a.currentDirectory}])},[(0,l.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,l.Lk)("span",p,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[S,_.loading]])]),_:3},8,["visible"])):((0,l.uX)(),(0,l.CE)(l.FK,{key:1},[(0,l.Lk)("span",{class:"drawer-trigger-wrapper",onClick:t[2]||(t[2]=(...e)=>w.openDrawer&&w.openDrawer(...e))},[(0,l.RG)(e.$slots,"trigger",{},void 0,!0)]),(0,l.bF)(L,{modelValue:_.drawerVisible,"onUpdate:modelValue":t[3]||(t[3]=e=>_.drawerVisible=e),direction:"btt",size:"60%","show-close":!0,"with-header":!0,"z-index":3e3,title:e.$t("directoryTree.selectDirectory"),class:"directory-tree-drawer"},{default:(0,l.k6)(()=>[(0,l.bo)(((0,l.uX)(),(0,l.CE)("div",g,[_.error?((0,l.uX)(),(0,l.CE)("div",b,[(0,l.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,l.Lk)("span",v,(0,c.v_)(_.error),1),(0,l.bF)(C,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,l.k6)(()=>[(0,l.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,l.uX)(),(0,l.Wv)(T,{key:1,ref:"treeRefMobile",data:_.treeData,props:_.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":a.currentDirectory,class:"directory-tree mobile-tree",onNodeClick:w.handleNodeClick},{default:(0,l.k6)(({node:e,data:t})=>[(0,l.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===a.currentDirectory}])},[(0,l.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,l.Lk)("span",k,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[S,_.loading]])]),_:1},8,["modelValue","title"])],64))])}var _=a(457),w=a(70797),F={name:"DirectoryTreePicker",props:{currentDirectory:{type:String,default:""},source:{type:String,default:"upload",validator:e=>["upload","admin"].includes(e)}},data(){return{popoverVisible:!1,drawerVisible:!1,treeData:[],loading:!1,error:"",treeProps:{children:"children",label:"name"},windowWidth:window.innerWidth}},computed:{isDesktop(){return this.windowWidth>=769}},watch:{popoverVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.popoverVisible&&this.$refs.treeRef){const e=this.$refs.treeRef.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},200)},drawerVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.drawerVisible&&this.$refs.treeRefMobile){const e=this.$refs.treeRefMobile.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},300)},currentDirectory(e){this.$nextTick(()=>{this.$refs.treeRef&&e&&this.$refs.treeRef.setCurrentKey(e),this.$refs.treeRefMobile&&e&&this.$refs.treeRefMobile.setCurrentKey(e)})}},mounted(){window.addEventListener("resize",this.handleResize)},beforeUnmount(){window.removeEventListener("resize",this.handleResize)},methods:{handleResize(){this.windowWidth=window.innerWidth},openDrawer(){this.drawerVisible=!0},async fetchDirectoryTree(){this.loading=!0,this.error="";try{let e;if("admin"===this.source){const t=await(0,w.A)("/api/directoryTree",{method:"GET"});if(!t.ok)return void(401===t.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.serverError"));e=await t.json()}else{const t=await _.A.get("/api/directoryTree",{withAuthCode:!0});e=t.data}e.tree?this.treeData=[e.tree]:this.treeData=[]}catch(e){console.error("Failed to fetch directory tree:",e),401===e.response?.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.loadFailed")}finally{this.loading=!1}},handleNodeClick(e){let t=e.path;t&&!t.startsWith("/")?t="/"+t:t||(t="/"),this.$emit("select",t),this.popoverVisible=!1,this.drawerVisible=!1}}},C=a(71241);const T=(0,C.A)(F,[["render",y],["__scopeId","data-v-62eab69a"]]);var $=T},34396:function(e,t,a){"use strict";a(85331),a(4885)},34896:function(e,t,a){"use strict";a(85331)},37952:function(e,t,a){"use strict";a(85331),a(97197)},40670:function(e,t,a){"use strict";a(85331),a(99648),a(19104),a(85970)},44813:function(e,t,a){a(44114),a(16573),a(78100),a(77936),a(18111),a(22489),a(7588),a(79577),a(41549),a(49797),a(49631),a(35623),a(59848),function(t){e.exports=t()}(function(){return function e(t,a,i){function n(r,o){if(!a[r]){if(!t[r]){var l=void 0;if(!o&&l)return require(r,!0);if(s)return s(r,!0);var d=new Error("Cannot find module '"+r+"'");throw d.code="MODULE_NOT_FOUND",d}var c=a[r]={exports:{}};t[r][0].call(c.exports,function(e){var a=t[r][1][e];return n(a||e)},c,c.exports,e,t,a,i)}return a[r].exports}for(var s=void 0,r=0;r>2,o=(3&t)<<4|a>>4,l=1>6:64,d=2>4,a=(15&r)<<4|(o=s.indexOf(e.charAt(d++)))>>2,i=(3&o)<<6|(l=s.indexOf(e.charAt(d++))),u[c++]=t,64!==o&&(u[c++]=a),64!==l&&(u[c++]=i);return u}},{"./support":30,"./utils":32}],2:[function(e,t,a){"use strict";var i=e("./external"),n=e("./stream/DataWorker"),s=e("./stream/Crc32Probe"),r=e("./stream/DataLengthProbe");function o(e,t,a,i,n){this.compressedSize=e,this.uncompressedSize=t,this.crc32=a,this.compression=i,this.compressedContent=n}o.prototype={getContentWorker:function(){var e=new n(i.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new r("data_length")),t=this;return e.on("end",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),e},getCompressedWorker:function(){return new n(i.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},o.createWorkerFrom=function(e,t,a){return e.pipe(new s).pipe(new r("uncompressedSize")).pipe(t.compressWorker(a)).pipe(new r("compressedSize")).withStreamInfo("compression",t)},t.exports=o},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(e,t,a){"use strict";var i=e("./stream/GenericWorker");a.STORE={magic:"\0\0",compressWorker:function(){return new i("STORE compression")},uncompressWorker:function(){return new i("STORE decompression")}},a.DEFLATE=e("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(e,t,a){"use strict";var i=e("./utils"),n=function(){for(var e,t=[],a=0;a<256;a++){e=a;for(var i=0;i<8;i++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?"string"!==i.getTypeOf(e)?function(e,t,a,i){var s=n,r=i+a;e^=-1;for(var o=i;o>>8^s[255&(e^t[o])];return-1^e}(0|t,e,e.length,0):function(e,t,a,i){var s=n,r=i+a;e^=-1;for(var o=i;o>>8^s[255&(e^t.charCodeAt(o))];return-1^e}(0|t,e,e.length,0):0}},{"./utils":32}],5:[function(e,t,a){"use strict";a.base64=!1,a.binary=!1,a.dir=!1,a.createFolders=!0,a.date=null,a.compression=null,a.compressionOptions=null,a.comment=null,a.unixPermissions=null,a.dosPermissions=null},{}],6:[function(e,t,a){"use strict";var i=null;i="undefined"!=typeof Promise?Promise:e("lie"),t.exports={Promise:i}},{lie:37}],7:[function(e,t,a){"use strict";var i="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,n=e("pako"),s=e("./utils"),r=e("./stream/GenericWorker"),o=i?"uint8array":"array";function l(e,t){r.call(this,"FlateWorker/"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}a.magic="\b\0",s.inherits(l,r),l.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},l.prototype.flush=function(){r.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},l.prototype.cleanUp=function(){r.prototype.cleanUp.call(this),this._pako=null},l.prototype._createPako=function(){this._pako=new n[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var e=this;this._pako.onData=function(t){e.push({data:t,meta:e.meta})}},a.compressWorker=function(e){return new l("Deflate",e)},a.uncompressWorker=function(){return new l("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(e,t,a){"use strict";function i(e,t){var a,i="";for(a=0;a>>=8;return i}function n(e,t,a,n,r,c){var h,u,f=e.file,m=e.compression,p=c!==o.utf8encode,g=s.transformTo("string",c(f.name)),b=s.transformTo("string",o.utf8encode(f.name)),v=f.comment,k=s.transformTo("string",c(v)),y=s.transformTo("string",o.utf8encode(v)),_=b.length!==f.name.length,w=y.length!==v.length,F="",C="",T="",$=f.dir,L=f.date,S={crc32:0,compressedSize:0,uncompressedSize:0};t&&!a||(S.crc32=e.crc32,S.compressedSize=e.compressedSize,S.uncompressedSize=e.uncompressedSize);var x=0;t&&(x|=8),p||!_&&!w||(x|=2048);var D=0,E=0;$&&(D|=16),"UNIX"===r?(E=798,D|=function(e,t){var a=e;return e||(a=t?16893:33204),(65535&a)<<16}(f.unixPermissions,$)):(E=20,D|=function(e){return 63&(e||0)}(f.dosPermissions)),h=L.getUTCHours(),h<<=6,h|=L.getUTCMinutes(),h<<=5,h|=L.getUTCSeconds()/2,u=L.getUTCFullYear()-1980,u<<=4,u|=L.getUTCMonth()+1,u<<=5,u|=L.getUTCDate(),_&&(C=i(1,1)+i(l(g),4)+b,F+="up"+i(C.length,2)+C),w&&(T=i(1,1)+i(l(k),4)+y,F+="uc"+i(T.length,2)+T);var A="";return A+="\n\0",A+=i(x,2),A+=m.magic,A+=i(h,2),A+=i(u,2),A+=i(S.crc32,4),A+=i(S.compressedSize,4),A+=i(S.uncompressedSize,4),A+=i(g.length,2),A+=i(F.length,2),{fileRecord:d.LOCAL_FILE_HEADER+A+g+F,dirRecord:d.CENTRAL_FILE_HEADER+i(E,2)+A+i(k.length,2)+"\0\0\0\0"+i(D,4)+i(n,4)+g+F+k}}var s=e("../utils"),r=e("../stream/GenericWorker"),o=e("../utf8"),l=e("../crc32"),d=e("../signature");function c(e,t,a,i){r.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=a,this.encodeFileName=i,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}s.inherits(c,r),c.prototype.push=function(e){var t=e.meta.percent||0,a=this.entriesCount,i=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,r.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:a?(t+100*(a-i-1))/a:100}}))},c.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var a=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:a.fileRecord,meta:{percent:0}})}else this.accumulate=!0},c.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,a=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(a.dirRecord),t)this.push({data:function(e){return d.DATA_DESCRIPTOR+i(e.crc32,4)+i(e.compressedSize,4)+i(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:a.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},c.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)a=(a<<8)+this.byteAt(t);return this.index+=e,a},readString:function(e){return i.transformTo("string",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=n},{"../utils":32}],19:[function(e,t,a){"use strict";var i=e("./Uint8ArrayReader");function n(e){i.call(this,e)}e("../utils").inherits(n,i),n.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=n},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(e,t,a){"use strict";var i=e("./DataReader");function n(e){i.call(this,e)}e("../utils").inherits(n,i),n.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},n.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},n.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},n.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=n},{"../utils":32,"./DataReader":18}],21:[function(e,t,a){"use strict";var i=e("./ArrayReader");function n(e){i.call(this,e)}e("../utils").inherits(n,i),n.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=n},{"../utils":32,"./ArrayReader":17}],22:[function(e,t,a){"use strict";var i=e("../utils"),n=e("../support"),s=e("./ArrayReader"),r=e("./StringReader"),o=e("./NodeBufferReader"),l=e("./Uint8ArrayReader");t.exports=function(e){var t=i.getTypeOf(e);return i.checkSupport(t),"string"!==t||n.uint8array?"nodebuffer"===t?new o(e):n.uint8array?new l(i.transformTo("uint8array",e)):new s(i.transformTo("array",e)):new r(e)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(e,t,a){"use strict";a.LOCAL_FILE_HEADER="PK",a.CENTRAL_FILE_HEADER="PK",a.CENTRAL_DIRECTORY_END="PK",a.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",a.ZIP64_CENTRAL_DIRECTORY_END="PK",a.DATA_DESCRIPTOR="PK\b"},{}],24:[function(e,t,a){"use strict";var i=e("./GenericWorker"),n=e("../utils");function s(e){i.call(this,"ConvertWorker to "+e),this.destType=e}n.inherits(s,i),s.prototype.processChunk=function(e){this.push({data:n.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{"../utils":32,"./GenericWorker":28}],25:[function(e,t,a){"use strict";var i=e("./GenericWorker"),n=e("../crc32");function s(){i.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}e("../utils").inherits(s,i),s.prototype.processChunk=function(e){this.streamInfo.crc32=n(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(e,t,a){"use strict";var i=e("../utils"),n=e("./GenericWorker");function s(e){n.call(this,"DataLengthProbe for "+e),this.propName=e,this.withStreamInfo(e,0)}i.inherits(s,n),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}n.prototype.processChunk.call(this,e)},t.exports=s},{"../utils":32,"./GenericWorker":28}],27:[function(e,t,a){"use strict";var i=e("../utils"),n=e("./GenericWorker");function s(e){n.call(this,"DataWorker");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=i.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}i.inherits(s,n),s.prototype.cleanUp=function(){n.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!n.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,i.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(i.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":e=this.data.substring(this.index,t);break;case"uint8array":e=this.data.subarray(this.index,t);break;case"array":case"nodebuffer":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{"../utils":32,"./GenericWorker":28}],28:[function(e,t,a){"use strict";function i(e){this.name=e||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}i.prototype={push:function(e){this.emit("data",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit("error",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit("error",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var a=0;a "+e:e}},t.exports=i},{}],29:[function(e,t,a){"use strict";var i=e("../utils"),n=e("./ConvertWorker"),s=e("./GenericWorker"),r=e("../base64"),o=e("../support"),l=e("../external"),d=null;if(o.nodestream)try{d=e("../nodejs/NodejsStreamOutputAdapter")}catch(e){}function c(e,t){return new l.Promise(function(a,n){var s=[],o=e._internalType,l=e._outputType,d=e._mimeType;e.on("data",function(e,a){s.push(e),t&&t(a)}).on("error",function(e){s=[],n(e)}).on("end",function(){try{var e=function(e,t,a){switch(e){case"blob":return i.newBlob(i.transformTo("arraybuffer",t),a);case"base64":return r.encode(t);default:return i.transformTo(e,t)}}(l,function(e,t){var a,i=0,n=null,s=0;for(a=0;a>>6:(a<65536?t[r++]=224|a>>>12:(t[r++]=240|a>>>18,t[r++]=128|a>>>12&63),t[r++]=128|a>>>6&63),t[r++]=128|63&a);return t}(e)},a.utf8decode=function(e){return n.nodebuffer?i.transformTo("nodebuffer",e).toString("utf-8"):function(e){var t,a,n,s,r=e.length,l=new Array(2*r);for(t=a=0;t>10&1023,l[a++]=56320|1023&n)}return l.length!==a&&(l.subarray?l=l.subarray(0,a):l.length=a),i.applyFromCharCode(l)}(e=i.transformTo(n.uint8array?"uint8array":"array",e))},i.inherits(d,r),d.prototype.processChunk=function(e){var t=i.transformTo(n.uint8array?"uint8array":"array",e.data);if(this.leftOver&&this.leftOver.length){if(n.uint8array){var s=t;(t=new Uint8Array(s.length+this.leftOver.length)).set(this.leftOver,0),t.set(s,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var r=function(e,t){var a;for((t=t||e.length)>e.length&&(t=e.length),a=t-1;0<=a&&128==(192&e[a]);)a--;return a<0||0===a?t:a+o[e[a]]>t?a:t}(t),l=t;r!==t.length&&(n.uint8array?(l=t.subarray(0,r),this.leftOver=t.subarray(r,t.length)):(l=t.slice(0,r),this.leftOver=t.slice(r,t.length))),this.push({data:a.utf8decode(l),meta:e.meta})},d.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:a.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},a.Utf8DecodeWorker=d,i.inherits(c,r),c.prototype.processChunk=function(e){this.push({data:a.utf8encode(e.data),meta:e.meta})},a.Utf8EncodeWorker=c},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(e,t,a){"use strict";var i=e("./support"),n=e("./base64"),s=e("./nodejsUtils"),r=e("./external");function o(e){return e}function l(e,t){for(var a=0;a>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=i(this.extraFields[1].value);this.uncompressedSize===n.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===n.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===n.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===n.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,a,i,n=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(a<65536?t[r++]=224|a>>>12:(t[r++]=240|a>>>18,t[r++]=128|a>>>12&63),t[r++]=128|a>>>6&63),t[r++]=128|63&a);return t},a.buf2binstring=function(e){return l(e,e.length)},a.binstring2buf=function(e){for(var t=new i.Buf8(e.length),a=0,n=t.length;a>10&1023,d[i++]=56320|1023&n)}return l(d,i)},a.utf8border=function(e,t){var a;for((t=t||e.length)>e.length&&(t=e.length),a=t-1;0<=a&&128==(192&e[a]);)a--;return a<0||0===a?t:a+r[e[a]]>t?a:t}},{"./common":41}],43:[function(e,t,a){"use strict";t.exports=function(e,t,a,i){for(var n=65535&e,s=e>>>16&65535,r=0;0!==a;){for(a-=r=2e3>>1:e>>>1;t[a]=e}return t}();t.exports=function(e,t,a,n){var s=i,r=n+a;e^=-1;for(var o=n;o>>8^s[255&(e^t[o])];return-1^e}},{}],46:[function(e,t,a){"use strict";var i,n=e("../utils/common"),s=e("./trees"),r=e("./adler32"),o=e("./crc32"),l=e("./messages"),d=0,c=4,h=0,u=-2,f=-1,m=4,p=2,g=8,b=9,v=286,k=30,y=19,_=2*v+1,w=15,F=3,C=258,T=C+F+1,$=42,L=113,S=1,x=2,D=3,E=4;function A(e,t){return e.msg=l[t],t}function I(e){return(e<<1)-(4e.avail_out&&(a=e.avail_out),0!==a&&(n.arraySet(e.output,t.pending_buf,t.pending_out,a,e.next_out),e.next_out+=a,t.pending_out+=a,e.total_out+=a,e.avail_out-=a,t.pending-=a,0===t.pending&&(t.pending_out=0))}function B(e,t){s._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,z(e.strm)}function W(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function R(e,t){var a,i,n=e.max_chain_length,s=e.strstart,r=e.prev_length,o=e.nice_match,l=e.strstart>e.w_size-T?e.strstart-(e.w_size-T):0,d=e.window,c=e.w_mask,h=e.prev,u=e.strstart+C,f=d[s+r-1],m=d[s+r];e.prev_length>=e.good_match&&(n>>=2),o>e.lookahead&&(o=e.lookahead);do{if(d[(a=t)+r]===m&&d[a+r-1]===f&&d[a]===d[s]&&d[++a]===d[s+1]){s+=2,a++;do{}while(d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&d[++s]===d[++a]&&sl&&0!=--n);return r<=e.lookahead?r:e.lookahead}function O(e){var t,a,i,s,l,d,c,h,u,f,m=e.w_size;do{if(s=e.window_size-e.lookahead-e.strstart,e.strstart>=m+(m-T)){for(n.arraySet(e.window,e.window,m,m,0),e.match_start-=m,e.strstart-=m,e.block_start-=m,t=a=e.hash_size;i=e.head[--t],e.head[t]=m<=i?i-m:0,--a;);for(t=a=m;i=e.prev[--t],e.prev[t]=m<=i?i-m:0,--a;);s+=m}if(0===e.strm.avail_in)break;if(d=e.strm,c=e.window,h=e.strstart+e.lookahead,u=s,f=void 0,f=d.avail_in,u=F)for(l=e.strstart-e.insert,e.ins_h=e.window[l],e.ins_h=(e.ins_h<=F&&(e.ins_h=(e.ins_h<=F)if(i=s._tr_tally(e,e.strstart-e.match_start,e.match_length-F),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=F){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=F&&(e.ins_h=(e.ins_h<=F&&e.match_length<=e.prev_length){for(n=e.strstart+e.lookahead-F,i=s._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-F),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=n&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(a=e.pending_buf_size-5);;){if(e.lookahead<=1){if(O(e),0===e.lookahead&&t===d)return S;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var i=e.block_start+a;if((0===e.strstart||e.strstart>=i)&&(e.lookahead=e.strstart-i,e.strstart=i,B(e,!1),0===e.strm.avail_out))return S;if(e.strstart-e.block_start>=e.w_size-T&&(B(e,!1),0===e.strm.avail_out))return S}return e.insert=0,t===c?(B(e,!0),0===e.strm.avail_out?D:E):(e.strstart>e.block_start&&(B(e,!1),e.strm.avail_out),S)}),new V(4,4,8,4,N),new V(4,5,16,8,N),new V(4,6,32,32,N),new V(4,4,16,16,M),new V(8,16,32,32,M),new V(8,16,128,128,M),new V(8,32,128,256,M),new V(32,128,258,1024,M),new V(32,258,258,4096,M)],a.deflateInit=function(e,t){return Z(e,t,g,15,8,0)},a.deflateInit2=Z,a.deflateReset=K,a.deflateResetKeep=j,a.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?u:(e.state.gzhead=t,h):u},a.deflate=function(e,t){var a,n,r,l;if(!e||!e.state||5>8&255),W(n,n.gzhead.time>>16&255),W(n,n.gzhead.time>>24&255),W(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),W(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(W(n,255&n.gzhead.extra.length),W(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=o(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(W(n,0),W(n,0),W(n,0),W(n,0),W(n,0),W(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),W(n,3),n.status=L);else{var f=g+(n.w_bits-8<<4)<<8;f|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(f|=32),f+=31-f%31,n.status=L,P(n,f),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(r=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>r&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),z(e),r=n.pending,n.pending!==n.pending_buf_size));)W(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>r&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){r=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>r&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),z(e),r=n.pending,n.pending===n.pending_buf_size)){l=1;break}l=n.gzindexr&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),0===l&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){r=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>r&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),z(e),r=n.pending,n.pending===n.pending_buf_size)){l=1;break}l=n.gzindexr&&(e.adler=o(e.adler,n.pending_buf,n.pending-r,r)),0===l&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&z(e),n.pending+2<=n.pending_buf_size&&(W(n,255&e.adler),W(n,e.adler>>8&255),e.adler=0,n.status=L)):n.status=L),0!==n.pending){if(z(e),0===e.avail_out)return n.last_flush=-1,h}else if(0===e.avail_in&&I(t)<=I(a)&&t!==c)return A(e,-5);if(666===n.status&&0!==e.avail_in)return A(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==d&&666!==n.status){var m=2===n.strategy?function(e,t){for(var a;;){if(0===e.lookahead&&(O(e),0===e.lookahead)){if(t===d)return S;break}if(e.match_length=0,a=s._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,a&&(B(e,!1),0===e.strm.avail_out))return S}return e.insert=0,t===c?(B(e,!0),0===e.strm.avail_out?D:E):e.last_lit&&(B(e,!1),0===e.strm.avail_out)?S:x}(n,t):3===n.strategy?function(e,t){for(var a,i,n,r,o=e.window;;){if(e.lookahead<=C){if(O(e),e.lookahead<=C&&t===d)return S;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=F&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=F?(a=s._tr_tally(e,1,e.match_length-F),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(a=s._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),a&&(B(e,!1),0===e.strm.avail_out))return S}return e.insert=0,t===c?(B(e,!0),0===e.strm.avail_out?D:E):e.last_lit&&(B(e,!1),0===e.strm.avail_out)?S:x}(n,t):i[n.level].func(n,t);if(m!==D&&m!==E||(n.status=666),m===S||m===D)return 0===e.avail_out&&(n.last_flush=-1),h;if(m===x&&(1===t?s._tr_align(n):5!==t&&(s._tr_stored_block(n,0,0,!1),3===t&&(U(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),z(e),0===e.avail_out))return n.last_flush=-1,h}return t!==c?h:n.wrap<=0?1:(2===n.wrap?(W(n,255&e.adler),W(n,e.adler>>8&255),W(n,e.adler>>16&255),W(n,e.adler>>24&255),W(n,255&e.total_in),W(n,e.total_in>>8&255),W(n,e.total_in>>16&255),W(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),z(e),0=a.w_size&&(0===o&&(U(a.head),a.strstart=0,a.block_start=0,a.insert=0),f=new n.Buf8(a.w_size),n.arraySet(f,t,m-a.w_size,a.w_size,0),t=f,m=a.w_size),l=e.avail_in,d=e.next_in,c=e.input,e.avail_in=m,e.next_in=0,e.input=t,O(a);a.lookahead>=F;){for(i=a.strstart,s=a.lookahead-(F-1);a.ins_h=(a.ins_h<>>=y=k>>>24,m-=y,0===(y=k>>>16&255))$[s++]=65535&k;else{if(!(16&y)){if(0==(64&y)){k=p[(65535&k)+(f&(1<>>=y,m-=y),m<15&&(f+=T[i++]<>>=y=k>>>24,m-=y,!(16&(y=k>>>16&255))){if(0==(64&y)){k=g[(65535&k)+(f&(1<>>=y,m-=y,(y=s-r)>3,f&=(1<<(m-=_<<3))-1,e.next_in=i,e.next_out=s,e.avail_in=i>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function g(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new i.Buf16(320),this.work=new i.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function b(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=u,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new i.Buf32(f),t.distcode=t.distdyn=new i.Buf32(m),t.sane=1,t.back=-1,c):h}function v(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,b(e)):h}function k(e,t){var a,i;return e&&e.state?(i=e.state,t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=r.wsize?(i.arraySet(r.window,t,a-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):(n<(s=r.wsize-r.wnext)&&(s=n),i.arraySet(r.window,t,a-n,s,r.wnext),(n-=s)?(i.arraySet(r.window,t,a-n,n,0),r.wnext=n,r.whave=r.wsize):(r.wnext+=s,r.wnext===r.wsize&&(r.wnext=0),r.whave>>8&255,a.check=s(a.check,O,2,0),_=y=0,a.mode=2;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&y)<<8)+(y>>8))%31){e.msg="incorrect header check",a.mode=30;break}if(8!=(15&y)){e.msg="unknown compression method",a.mode=30;break}if(_-=4,z=8+(15&(y>>>=4)),0===a.wbits)a.wbits=z;else if(z>a.wbits){e.msg="invalid window size",a.mode=30;break}a.dmax=1<>8&1),512&a.flags&&(O[0]=255&y,O[1]=y>>>8&255,a.check=s(a.check,O,2,0)),_=y=0,a.mode=3;case 3:for(;_<32;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}a.head&&(a.head.time=y),512&a.flags&&(O[0]=255&y,O[1]=y>>>8&255,O[2]=y>>>16&255,O[3]=y>>>24&255,a.check=s(a.check,O,4,0)),_=y=0,a.mode=4;case 4:for(;_<16;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}a.head&&(a.head.xflags=255&y,a.head.os=y>>8),512&a.flags&&(O[0]=255&y,O[1]=y>>>8&255,a.check=s(a.check,O,2,0)),_=y=0,a.mode=5;case 5:if(1024&a.flags){for(;_<16;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}a.length=y,a.head&&(a.head.extra_len=y),512&a.flags&&(O[0]=255&y,O[1]=y>>>8&255,a.check=s(a.check,O,2,0)),_=y=0}else a.head&&(a.head.extra=null);a.mode=6;case 6:if(1024&a.flags&&(v<($=a.length)&&($=v),$&&(a.head&&(z=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Array(a.head.extra_len)),i.arraySet(a.head.extra,f,g,$,z)),512&a.flags&&(a.check=s(a.check,f,$,g)),v-=$,g+=$,a.length-=$),a.length))break e;a.length=0,a.mode=7;case 7:if(2048&a.flags){if(0===v)break e;for($=0;z=f[g+$++],a.head&&z&&a.length<65536&&(a.head.name+=String.fromCharCode(z)),z&&$>9&1,a.head.done=!0),e.adler=a.check=0,a.mode=12;break;case 10:for(;_<32;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}e.adler=a.check=p(y),_=y=0,a.mode=11;case 11:if(0===a.havedict)return e.next_out=b,e.avail_out=k,e.next_in=g,e.avail_in=v,a.hold=y,a.bits=_,2;e.adler=a.check=1,a.mode=12;case 12:if(5===t||6===t)break e;case 13:if(a.last){y>>>=7&_,_-=7&_,a.mode=27;break}for(;_<3;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}switch(a.last=1&y,_-=1,3&(y>>>=1)){case 0:a.mode=14;break;case 1:if(C(a),a.mode=20,6!==t)break;y>>>=2,_-=2;break e;case 2:a.mode=17;break;case 3:e.msg="invalid block type",a.mode=30}y>>>=2,_-=2;break;case 14:for(y>>>=7&_,_-=7&_;_<32;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if((65535&y)!=(y>>>16^65535)){e.msg="invalid stored block lengths",a.mode=30;break}if(a.length=65535&y,_=y=0,a.mode=15,6===t)break e;case 15:a.mode=16;case 16:if($=a.length){if(v<$&&($=v),k<$&&($=k),0===$)break e;i.arraySet(m,f,g,$,b),v-=$,g+=$,k-=$,b+=$,a.length-=$;break}a.mode=12;break;case 17:for(;_<14;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if(a.nlen=257+(31&y),y>>>=5,_-=5,a.ndist=1+(31&y),y>>>=5,_-=5,a.ncode=4+(15&y),y>>>=4,_-=4,286>>=3,_-=3}for(;a.have<19;)a.lens[N[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,W={bits:a.lenbits},B=o(0,a.lens,0,19,a.lencode,0,a.work,W),a.lenbits=W.bits,B){e.msg="invalid code lengths set",a.mode=30;break}a.have=0,a.mode=19;case 19:for(;a.have>>16&255,E=65535&R,!((x=R>>>24)<=_);){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if(E<16)y>>>=x,_-=x,a.lens[a.have++]=E;else{if(16===E){for(P=x+2;_>>=x,_-=x,0===a.have){e.msg="invalid bit length repeat",a.mode=30;break}z=a.lens[a.have-1],$=3+(3&y),y>>>=2,_-=2}else if(17===E){for(P=x+3;_>>=x)),y>>>=3,_-=3}else{for(P=x+7;_>>=x)),y>>>=7,_-=7}if(a.have+$>a.nlen+a.ndist){e.msg="invalid bit length repeat",a.mode=30;break}for(;$--;)a.lens[a.have++]=z}}if(30===a.mode)break;if(0===a.lens[256]){e.msg="invalid code -- missing end-of-block",a.mode=30;break}if(a.lenbits=9,W={bits:a.lenbits},B=o(l,a.lens,0,a.nlen,a.lencode,0,a.work,W),a.lenbits=W.bits,B){e.msg="invalid literal/lengths set",a.mode=30;break}if(a.distbits=6,a.distcode=a.distdyn,W={bits:a.distbits},B=o(d,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,W),a.distbits=W.bits,B){e.msg="invalid distances set",a.mode=30;break}if(a.mode=20,6===t)break e;case 20:a.mode=21;case 21:if(6<=v&&258<=k){e.next_out=b,e.avail_out=k,e.next_in=g,e.avail_in=v,a.hold=y,a.bits=_,r(e,F),b=e.next_out,m=e.output,k=e.avail_out,g=e.next_in,f=e.input,v=e.avail_in,y=a.hold,_=a.bits,12===a.mode&&(a.back=-1);break}for(a.back=0;D=(R=a.lencode[y&(1<>>16&255,E=65535&R,!((x=R>>>24)<=_);){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if(D&&0==(240&D)){for(A=x,I=D,U=E;D=(R=a.lencode[U+((y&(1<>A)])>>>16&255,E=65535&R,!(A+(x=R>>>24)<=_);){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}y>>>=A,_-=A,a.back+=A}if(y>>>=x,_-=x,a.back+=x,a.length=E,0===D){a.mode=26;break}if(32&D){a.back=-1,a.mode=12;break}if(64&D){e.msg="invalid literal/length code",a.mode=30;break}a.extra=15&D,a.mode=22;case 22:if(a.extra){for(P=a.extra;_>>=a.extra,_-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=23;case 23:for(;D=(R=a.distcode[y&(1<>>16&255,E=65535&R,!((x=R>>>24)<=_);){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if(0==(240&D)){for(A=x,I=D,U=E;D=(R=a.distcode[U+((y&(1<>A)])>>>16&255,E=65535&R,!(A+(x=R>>>24)<=_);){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}y>>>=A,_-=A,a.back+=A}if(y>>>=x,_-=x,a.back+=x,64&D){e.msg="invalid distance code",a.mode=30;break}a.offset=E,a.extra=15&D,a.mode=24;case 24:if(a.extra){for(P=a.extra;_>>=a.extra,_-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){e.msg="invalid distance too far back",a.mode=30;break}a.mode=25;case 25:if(0===k)break e;if($=F-k,a.offset>$){if(($=a.offset-$)>a.whave&&a.sane){e.msg="invalid distance too far back",a.mode=30;break}L=$>a.wnext?($-=a.wnext,a.wsize-$):a.wnext-$,$>a.length&&($=a.length),S=a.window}else S=m,L=b-a.offset,$=a.length;for(k<$&&($=k),k-=$,a.length-=$;m[b++]=S[L++],--$;);0===a.length&&(a.mode=21);break;case 26:if(0===k)break e;m[b++]=a.length,k--,a.mode=21;break;case 27:if(a.wrap){for(;_<32;){if(0===v)break e;v--,y|=f[g++]<<_,_+=8}if(F-=k,e.total_out+=F,a.total+=F,F&&(e.adler=a.check=a.flags?s(a.check,m,F,b-F):n(a.check,m,F,b-F)),F=k,(a.flags?y:p(y))!==a.check){e.msg="incorrect data check",a.mode=30;break}_=y=0}a.mode=28;case 28:if(a.wrap&&a.flags){for(;_<32;){if(0===v)break e;v--,y+=f[g++]<<_,_+=8}if(y!==(4294967295&a.total)){e.msg="incorrect length check",a.mode=30;break}_=y=0}a.mode=29;case 29:B=1;break e;case 30:B=-3;break e;case 31:return-4;case 32:default:return h}return e.next_out=b,e.avail_out=k,e.next_in=g,e.avail_in=v,a.hold=y,a.bits=_,(a.wsize||F!==e.avail_out&&a.mode<30&&(a.mode<27||4!==t))&&T(e,e.output,e.next_out,F-e.avail_out)?(a.mode=31,-4):(w-=e.avail_in,F-=e.avail_out,e.total_in+=w,e.total_out+=F,a.total+=F,a.wrap&&F&&(e.adler=a.check=a.flags?s(a.check,m,F,e.next_out-F):n(a.check,m,F,e.next_out-F)),e.data_type=a.bits+(a.last?64:0)+(12===a.mode?128:0)+(20===a.mode||15===a.mode?256:0),(0==w&&0===F||4===t)&&B===c&&(B=-5),B)},a.inflateEnd=function(e){if(!e||!e.state)return h;var t=e.state;return t.window&&(t.window=null),e.state=null,c},a.inflateGetHeader=function(e,t){var a;return e&&e.state?0==(2&(a=e.state).wrap)?h:((a.head=t).done=!1,c):h},a.inflateSetDictionary=function(e,t){var a,i=t.length;return e&&e.state?0!==(a=e.state).wrap&&11!==a.mode?h:11===a.mode&&n(1,t,i,0)!==a.check?-3:T(e,t,i,i)?(a.mode=31,-4):(a.havedict=1,c):h},a.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":41,"./adler32":43,"./crc32":45,"./inffast":48,"./inftrees":50}],50:[function(e,t,a){"use strict";var i=e("../utils/common"),n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],s=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],r=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],o=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,a,l,d,c,h,u){var f,m,p,g,b,v,k,y,_,w=u.bits,F=0,C=0,T=0,$=0,L=0,S=0,x=0,D=0,E=0,A=0,I=null,U=0,z=new i.Buf16(16),B=new i.Buf16(16),W=null,P=0;for(F=0;F<=15;F++)z[F]=0;for(C=0;Cv?(y=W[P+h[C]],I[U+h[C]]):(y=96,0),f=1<>x)+(m-=f)]=k<<24|y<<16|_,0!==m;);for(f=1<>=1;if(0!==f?(A&=f-1,A+=f):A=0,C++,0==--z[F]){if(F===$)break;F=t[a+h[C]]}if(L>>7)]}function W(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,a){e.bi_valid>p-a?(e.bi_buf|=t<>p-e.bi_valid,e.bi_valid+=a-p):(e.bi_buf|=t<>>=1,a<<=1,0<--t;);return a>>>1}function N(e,t,a){var i,n,s=new Array(m+1),r=0;for(i=1;i<=m;i++)s[i]=r=r+a[i-1]<<1;for(n=0;n<=t;n++){var o=e[2*n+1];0!==o&&(e[2*n]=O(s[o]++,o))}}function M(e){var t;for(t=0;t>1;1<=a;a--)j(e,s,a);for(n=l;a=e.heap[1],e.heap[1]=e.heap[e.heap_len--],j(e,s,1),i=e.heap[1],e.heap[--e.heap_max]=a,e.heap[--e.heap_max]=i,s[2*n]=s[2*a]+s[2*i],e.depth[n]=(e.depth[a]>=e.depth[i]?e.depth[a]:e.depth[i])+1,s[2*a+1]=s[2*i+1]=n,e.heap[1]=n++,j(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var a,i,n,s,r,o,l=t.dyn_tree,d=t.max_code,c=t.stat_desc.static_tree,h=t.stat_desc.has_stree,u=t.stat_desc.extra_bits,p=t.stat_desc.extra_base,g=t.stat_desc.max_length,b=0;for(s=0;s<=m;s++)e.bl_count[s]=0;for(l[2*e.heap[e.heap_max]+1]=0,a=e.heap_max+1;a>=7;i>>=1)if(1&a&&0!==e.dyn_ltree[2*t])return n;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return s;for(t=32;t>>3,(o=e.static_len+3+7>>>3)<=r&&(r=o)):r=o=a+5,a+4<=r&&-1!==t?Q(e,t,a,i):4===e.strategy||o===r?(P(e,2+(i?1:0),3),K(e,T,$)):(P(e,4+(i?1:0),3),function(e,t,a,i){var n;for(P(e,t-257,5),P(e,a-1,5),P(e,i-4,4),n=0;n>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&a,e.last_lit++,0===t?e.dyn_ltree[2*a]++:(e.matches++,t--,e.dyn_ltree[2*(S[a]+d+1)]++,e.dyn_dtree[2*B(t)]++),e.last_lit===e.lit_bufsize-1},a._tr_align=function(e){P(e,2,3),R(e,b,T),function(e){16===e.bi_valid?(W(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{"../utils/common":41}],53:[function(e,t,a){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,i){(function(e){!function(e,t){"use strict";if(!e.setImmediate){var a,i,n,s,r=1,o={},l=!1,d=e.document,c=Object.getPrototypeOf&&Object.getPrototypeOf(e);c=c&&c.setTimeout?c:e,a="[object process]"==={}.toString.call(e.process)?function(e){process.nextTick(function(){u(e)})}:function(){if(e.postMessage&&!e.importScripts){var t=!0,a=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=a,t}}()?(s="setImmediate$"+Math.random()+"$",e.addEventListener?e.addEventListener("message",f,!1):e.attachEvent("onmessage",f),function(t){e.postMessage(s+t,"*")}):e.MessageChannel?((n=new MessageChannel).port1.onmessage=function(e){u(e.data)},function(e){n.port2.postMessage(e)}):d&&"onreadystatechange"in d.createElement("script")?(i=d.documentElement,function(e){var t=d.createElement("script");t.onreadystatechange=function(){u(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):function(e){setTimeout(u,0,e)},c.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),i=0;i\| \(\)\[\]\{\}#%\^`~;@&=\+\$,]/;return n.test(e)?{valid:!1,error:i.Ay.global.t("validation.invalidCharacters")}:{valid:!0}}},63003:function(e,t,a){"use strict";a(85331)},70415:function(e,t,a){"use strict";a(85331),a(73565)},72907:function(e,t,a){"use strict";a(85331),a(96808),a(29092)},73565:function(e,t,a){"use strict";a(85331)},79899:function(e,t,a){"use strict";a(85331)},88830:function(e,t,a){"use strict";a(85331)},95385:function(e,t,a){"use strict";a(85331)},98642:function(e,t,a){"use strict";a(85331)}}]); +//# sourceMappingURL=997.7b6c8b5a.js.map \ No newline at end of file diff --git a/frontend-dist/js/997.7b6c8b5a.js.gz b/frontend-dist/js/997.7b6c8b5a.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..02f30f6144afd786c7777c20d7e252af349654b3 GIT binary patch literal 57735 zcmV)UK(N0biwFP!000023hcdWb0oQz81`3+dHeEaZlkiR_-65D(|mN#aHe0=WKYiw zo7)XmqKY}p%B;ym@iE2p7q2Xbz3W{^Xjcw}BKO3D| zC*IT=H#f&8jyoKsXZG>&=H~hd8n0|@taf^%s7r%5vI(LHJ7a5$T5=qeKq*598|u>9y5pdj6~ZK0)#Z&%s2Y0M-e|Q})*a+Sh0V>i z71nBbb8TtaaZndZmo{6QtcTUL^|cMhL1!MemsXaRmz=F`9Hq1|^2Xf|r)kF;#22L5 z3qsQL102Tv=4FD1Ly}k->Y0_q_ih|f5>YEd1M~Y3)3as}4M&vK!9m2J3@f3W1q?(# z|0v3PaZFjW(?YWZUy?-Y{Gy`sl(03jGIUYRv@&#EJM1LBv@-O5(tt0$@j1Ef zw2-Jm2B*aLiQl9NA=&_*=0Nlh%`<|1Hod*-?=+wxu`+aIe%A5%pg4jgiIZkZF@=WD z@`k*ek}DYYVO|`?KFLvWrO?muE789t>AkVfHwoHDPtcAt=HzqW`R?1#(HqZhp|0Cs za%`&?N3@AANg5AGGw8;V<)H7q&^=s2yI$<>ptoM)o_~X0d8zx|IeP6y?(h=5^a6Kh zi|;4~YxI?4JBaMagETk|39{no&Cth`bW|m)Lyy}hH#au?;}P$1p^--%#8#z)-5}k?w0rhEz98Gg zeL!tSAy0#lxTo;ph^?N}DSYFL>Y&TOr)M2&wbdG4S;$Jy;>%_?j8kHD7V_oPXwE`$ zvafY5uQ|5uc#n_SuV?3uZKXpTS*VYA(dkpi{vM41R?s~! z!ICFj1u*i~0bHNC7w;XrFsUw%x+Jt52eq9O2fgpKGqiz@Ezym2BGyLqPOpcgV-1sF zfRk$rg)#PnsNZ?wioZ~4cyZJVlEEDY$N`i`D0;MzHdgo#P3VZBmC<4k6-x#ho)6Gi zqrWFE#YvygSD2pF5?_lGUyBi+-U29Z7~(EDi$k9zC92{TRRzmI)#sX(q46*wLlXJ( zB9V8pA0(tpa6(nf2n|1KI^-BFT|h&KHkRtLMHFo%!Qc$9QW$HM*~h=BeN zNl3ahr;5BLFVE1JCPBYny%z-Oan@8v);-i z9t?bxrwI$sN6Y98De4(oXo%`C&+Z$6?plQNlZ6v9oFgZW)2TciU-Q$keVfy9l@sXd zM?M`n#sWa|DWw)lgYSV5Ml_ysRnDGD-tU+{&VhPb zI#4f4CFf|a0}2(IU*GM7Ug8^I>7$;|(I^aOKT&5m)^eJl$IE;I%VGksnT`@dUa*#SxVmJjDuLmT2QCDseu0wY{h8Ag&}Axz)%O?N~bY zRyg)nYOvRy2YWOakhB7Cr?F#CnDr4le&Pbkp8!)o2|o`|MX%(l8{z?GFN|)Gbm7i0 zUI~m}&-69qhLTD8?qMtuCH{mOJ z6DFj`Ustb5&q6+?xWnhTk10mOBp#-s;1&Fh_{-^>Tw5IrcCLjiG599A8sf-r!hAam zZDfhxfNdB~6I${wXF>lg4EkrZDHsKIo#kAE>Y{=-Ds6bS2T>foh<#!n|A5@Qv=Yl> z=&D2bylGbTeh?=NTY|k6$3Et7Q8pPgwt`g6fx3VZ&-2Q|&Q6@Hf+mT}kwpA$d8EWc z5?S(qvDDSYK5`0GrzHD*Ql{8LMX}V4@PIH9K}!aiz@*`Dg>|(mun#vujy_Ot<2T><>cQQe?`VGf7=WZN_1V{OeywJ{2aiv7nLz)0bA!}MzhBVG@ z0=ys!Xn;ew7;8X1va$@3K|s^au{A1PwaAhz2C_J>cf#m1m${AA)eFFKK4_thE`!LA zFW<5kHviiVqKG7{1es?x)R!B*b9{odHI<*(IS1E3zW+Pp?pYA}35hzE{L4a2kkYYW z#jGsL*dmQ6@jGLKP40~QgeuV?JquD-O*}&>p*C^Gto#8W$gV;UaWYs7AqFXc(-81@ zeQhJl&?T&yP7BZlSzNSPeT|D@zqQr7xdG&|(yGhOEE7N%I1o9w#YOhJeB|3Ohe14w zDDiD)ES3uU{*wz5(Pu$QNkkIcN(kH{Vif#Pd(DcR44sl*oRBvW1EYW>1g?iU;0y>o zi~Y1S*2`_N3>rSY5F)m!5PA#V1)8HWREbfQv)oGRDca_^=u@ z<|uCD=x9Le4s2R9b;NLv0s7<|vtAJ4Fubl

    `$-!?@#NWFdiR5_T1DQP`4z;Dn}c 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 literal 0 HcmV?d00001 diff --git a/frontend-dist/js/997.7b6c8b5a.js.map b/frontend-dist/js/997.7b6c8b5a.js.map new file mode 100644 index 00000000..5bcae8cd --- /dev/null +++ b/frontend-dist/js/997.7b6c8b5a.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/997.7b6c8b5a.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/dashboard/MoveFileDialog.vue?cb6d","webpack://sanyue_imghub/./src/components/dashboard/MoveFileDialog.vue","webpack://sanyue_imghub/./src/components/dashboard/MoveFileDialog.vue?cba1","webpack://sanyue_imghub/./src/components/dashboard/MobileDirectoryDrawer.vue?99b2","webpack://sanyue_imghub/./src/components/dashboard/MobileDirectoryDrawer.vue","webpack://sanyue_imghub/./src/components/dashboard/MobileDirectoryDrawer.vue?256e","webpack://sanyue_imghub/./src/components/dashboard/MobileActionSheet.vue?5420","webpack://sanyue_imghub/./src/components/dashboard/MobileActionSheet.vue","webpack://sanyue_imghub/./src/components/dashboard/MobileActionSheet.vue?f2e3","webpack://sanyue_imghub/./src/components/dashboard/BatchTagDialog.vue?ffce","webpack://sanyue_imghub/./src/components/dashboard/BatchTagDialog.vue","webpack://sanyue_imghub/./src/components/dashboard/BatchTagDialog.vue?9ca8","webpack://sanyue_imghub/./src/components/dashboard/TagManagementDialog.vue?e1c6","webpack://sanyue_imghub/./src/components/dashboard/TagManagementDialog.vue","webpack://sanyue_imghub/./src/components/dashboard/TagManagementDialog.vue?e3f8","webpack://sanyue_imghub/./src/components/dashboard/FileDetailDialog.vue?25b5","webpack://sanyue_imghub/./src/utils/fileIdValidator.js","webpack://sanyue_imghub/./src/components/dashboard/FileDetailDialog.vue","webpack://sanyue_imghub/./src/components/dashboard/FileDetailDialog.vue?8cda","webpack://sanyue_imghub/./src/components/dashboard/BatchActionBar.vue?5ea1","webpack://sanyue_imghub/./src/components/dashboard/BatchActionBar.vue","webpack://sanyue_imghub/./src/components/dashboard/BatchActionBar.vue?ed70","webpack://sanyue_imghub/./src/components/dashboard/FileListItem.vue?9d79","webpack://sanyue_imghub/./src/components/dashboard/FileListItem.vue","webpack://sanyue_imghub/./src/components/dashboard/FileListItem.vue?6ed7","webpack://sanyue_imghub/./src/components/dashboard/FileCard.vue?f89c","webpack://sanyue_imghub/./src/components/dashboard/FileCard.vue","webpack://sanyue_imghub/./src/components/dashboard/FileCard.vue?8969","webpack://sanyue_imghub/./src/components/dashboard/FolderCard.vue?1c31","webpack://sanyue_imghub/./src/components/dashboard/FolderCard.vue","webpack://sanyue_imghub/./src/components/dashboard/FolderCard.vue?a03e","webpack://sanyue_imghub/./src/components/dashboard/SkeletonLoader.vue?136f","webpack://sanyue_imghub/./src/components/dashboard/SkeletonLoader.vue","webpack://sanyue_imghub/./src/components/dashboard/SkeletonLoader.vue?4854","webpack://sanyue_imghub/./src/components/dashboard/FilterDropdown.vue?bd3a","webpack://sanyue_imghub/./src/components/dashboard/FilterDropdown.vue","webpack://sanyue_imghub/./src/components/dashboard/FilterDropdown.vue?09c8","webpack://sanyue_imghub/./src/views/AdminDashBoard.vue?0ec3","webpack://sanyue_imghub/./src/utils/fileManager.js","webpack://sanyue_imghub/./src/utils/dashboard/rectIntersects.js","webpack://sanyue_imghub/./src/utils/dashboard/useDragSelect.js","webpack://sanyue_imghub/./src/views/AdminDashBoard.vue","webpack://sanyue_imghub/./src/views/AdminDashBoard.vue?40d2","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?9e0f","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?6984","webpack://sanyue_imghub/./node_modules/jszip/dist/jszip.min.js","webpack://sanyue_imghub/./src/utils/pathValidator.js"],"sourcesContent":["import { toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, createElementVNode as _createElementVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"move-file-dialog-wrapper\"\n};\nconst _hoisted_2 = {\n class: \"move-dialog-content\"\n};\nconst _hoisted_3 = {\n class: \"move-path-input-container\"\n};\nconst _hoisted_4 = {\n class: \"move-dialog-hint\"\n};\nconst _hoisted_5 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_6 = {\n class: \"move-drawer-content\"\n};\nconst _hoisted_7 = {\n class: \"move-path-section\"\n};\nconst _hoisted_8 = {\n class: \"move-path-label\"\n};\nconst _hoisted_9 = {\n class: \"move-path-input-row\"\n};\nconst _hoisted_10 = {\n class: \"move-dialog-hint\"\n};\nconst _hoisted_11 = {\n key: 0,\n class: \"embedded-tree-section\"\n};\nconst _hoisted_12 = {\n class: \"tree-section-header\"\n};\nconst _hoisted_13 = {\n class: \"tree-section-title\"\n};\nconst _hoisted_14 = {\n class: \"tree-container\"\n};\nconst _hoisted_15 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_16 = {\n class: \"error-text\"\n};\nconst _hoisted_17 = {\n class: \"node-label\"\n};\nconst _hoisted_18 = {\n class: \"drawer-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_DirectoryTreePicker = _resolveComponent(\"DirectoryTreePicker\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_tree = _resolveComponent(\"el-tree\");\n const _component_el_drawer = _resolveComponent(\"el-drawer\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [$options.isDesktop ? (_openBlock(), _createBlock(_component_el_dialog, {\n key: 0,\n modelValue: $options.dialogVisible,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $options.dialogVisible = $event),\n title: $props.isBatchMove ? _ctx.$t('moveFile.batchTitle') : _ctx.$t('moveFile.title'),\n width: \"500px\",\n \"show-close\": true,\n class: \"move-dialog\",\n onClose: $options.handleClose\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_5, [_createVNode(_component_el_button, {\n onClick: $options.handleClose\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.cancel')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.loading,\n onClick: $options.handleConfirm\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.confirm')), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_input, {\n modelValue: $data.targetPath,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.targetPath = $event),\n placeholder: _ctx.$t('moveFile.targetPlaceholder'),\n class: \"move-path-input\"\n }, {\n prepend: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.targetDirectory')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"]), _createVNode(_component_DirectoryTreePicker, {\n \"current-directory\": $props.currentDirectory,\n source: \"admin\",\n onSelect: $options.handleDirectorySelect\n }, {\n trigger: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"directory-picker-trigger\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-tree\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"current-directory\", \"onSelect\"])]), _createElementVNode(\"p\", _hoisted_4, _toDisplayString(_ctx.$t('moveFile.hint')), 1)])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClose\"])) : (_openBlock(), _createBlock(_component_el_drawer, {\n key: 1,\n modelValue: $options.dialogVisible,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $options.dialogVisible = $event),\n title: $props.isBatchMove ? _ctx.$t('moveFile.batchTitle') : _ctx.$t('moveFile.title'),\n direction: \"btt\",\n size: \"auto\",\n \"show-close\": true,\n class: \"move-drawer\",\n onClose: $options.handleClose\n }, {\n footer: _withCtx(() => [_createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n onClick: $options.handleClose,\n class: \"footer-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.cancel')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.loading,\n onClick: $options.handleConfirm,\n class: \"footer-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.confirm')), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"div\", _hoisted_8, _toDisplayString(_ctx.$t('moveFile.targetDirectory')), 1), _createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_el_input, {\n modelValue: $data.targetPath,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.targetPath = $event),\n placeholder: _ctx.$t('moveFile.targetPlaceholder'),\n class: \"move-path-input\"\n }, null, 8, [\"modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n class: \"directory-picker-trigger\",\n onClick: _cache[3] || (_cache[3] = $event => $data.showTreePicker = true)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-tree\"\n })]),\n _: 1\n })]), _createElementVNode(\"p\", _hoisted_10, _toDisplayString(_ctx.$t('moveFile.hintMobile')), 1)]), $data.showTreePicker ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(_ctx.$t('moveFile.selectDirectory')), 1), _createVNode(_component_el_button, {\n text: \"\",\n onClick: _cache[4] || (_cache[4] = $event => $data.showTreePicker = false)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n })]),\n _: 1\n })]), _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_14, [$data.treeError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_15, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_16, _toDisplayString($data.treeError), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('moveFile.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRef\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree\",\n onNodeClick: $options.handleTreeNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_17, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.treeLoading]])])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClose\"]))]);\n}","import DirectoryTreePicker from '@/components/DirectoryTreePicker.vue';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'MoveFileDialog',\n components: {\n DirectoryTreePicker\n },\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n currentDirectory: {\n type: String,\n default: ''\n },\n isBatchMove: {\n type: Boolean,\n default: false\n },\n initialPath: {\n type: String,\n default: '/'\n }\n },\n emits: ['update:modelValue', 'confirm', 'close'],\n data() {\n return {\n targetPath: '/',\n loading: false,\n windowWidth: window.innerWidth,\n // 移动端内嵌树相关\n showTreePicker: false,\n treeData: [],\n treeLoading: false,\n treeError: '',\n treeProps: {\n children: 'children',\n label: 'name'\n }\n };\n },\n computed: {\n dialogVisible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n isDesktop() {\n return this.windowWidth > 768;\n }\n },\n watch: {\n modelValue(newVal) {\n if (newVal) {\n this.targetPath = this.initialPath || '/';\n this.showTreePicker = false;\n }\n },\n showTreePicker(newVal) {\n if (newVal && !this.isDesktop) {\n this.fetchDirectoryTree();\n }\n }\n },\n mounted() {\n window.addEventListener('resize', this.handleResize);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.handleResize);\n },\n methods: {\n handleResize() {\n this.windowWidth = window.innerWidth;\n },\n handleDirectorySelect(path) {\n this.targetPath = path;\n },\n handleConfirm() {\n this.$emit('confirm', this.targetPath);\n },\n handleClose() {\n this.$emit('update:modelValue', false);\n this.$emit('close');\n },\n // 移动端内嵌树相关方法\n async fetchDirectoryTree() {\n this.treeLoading = true;\n this.treeError = '';\n try {\n const response = await fetchWithAuth('/api/directoryTree', {\n method: 'GET'\n });\n if (!response.ok) {\n if (response.status === 401) {\n this.treeError = this.$t('moveFile.authFailed');\n } else {\n this.treeError = this.$t('moveFile.serverError');\n }\n return;\n }\n const data = await response.json();\n if (data.tree) {\n this.treeData = [data.tree];\n } else {\n this.treeData = [];\n }\n } catch (err) {\n console.error('Failed to fetch directory tree:', err);\n this.treeError = this.$t('moveFile.loadTreeFailed');\n } finally {\n this.treeLoading = false;\n }\n },\n handleTreeNodeClick(data) {\n let path = data.path;\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n } else if (!path) {\n path = '/';\n }\n this.targetPath = path;\n this.showTreePicker = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./MoveFileDialog.vue?vue&type=template&id=7aaa437c&scoped=true\"\nimport script from \"./MoveFileDialog.vue?vue&type=script&lang=js\"\nexport * from \"./MoveFileDialog.vue?vue&type=script&lang=js\"\n\nimport \"./MoveFileDialog.vue?vue&type=style&index=0&id=7aaa437c&scoped=true&lang=css\"\nimport \"./MoveFileDialog.vue?vue&type=style&index=1&id=7aaa437c&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7aaa437c\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeStyle as _normalizeStyle, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, Transition as _Transition, withCtx as _withCtx, Teleport as _Teleport, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"mobile-drawer-header\"\n};\nconst _hoisted_2 = {\n class: \"mobile-drawer-title\"\n};\nconst _hoisted_3 = {\n class: \"mobile-drawer-content\"\n};\nconst _hoisted_4 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Teleport, {\n to: \"body\"\n }, [_createVNode(_Transition, {\n name: \"drawer-slide\"\n }, {\n default: _withCtx(() => [$props.modelValue ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"mobile-drawer-overlay\",\n onClick: _cache[3] || (_cache[3] = (...args) => $options.close && $options.close(...args))\n }, [_createElementVNode(\"div\", {\n class: \"mobile-drawer\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"span\", _hoisted_2, _toDisplayString(_ctx.$t('mobileDirectory.title')), 1), _createVNode(_component_font_awesome_icon, {\n icon: \"times\",\n class: \"mobile-drawer-close\",\n onClick: $options.close\n }, null, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"mobile-drawer-item\", {\n active: !$props.currentPath\n }]),\n onClick: _cache[0] || (_cache[0] = $event => $options.navigate(''))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"mobile-drawer-item-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileDirectory.rootDirectory')), 1)], 2), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.pathParts, (folder, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: _normalizeClass([\"mobile-drawer-item\", {\n active: index === $options.pathParts.length - 1\n }]),\n style: _normalizeStyle({\n paddingLeft: (index + 1) * 16 + 16 + 'px'\n }),\n onClick: $event => $options.navigate($options.pathParts.slice(0, index + 1).join('/'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"mobile-drawer-item-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(folder), 1)], 14, _hoisted_4);\n }), 128)), $props.currentPath ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"mobile-drawer-back\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.goBack && $options.goBack(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"mobile-drawer-item-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileDirectory.goBack')), 1)])) : _createCommentVNode(\"\", true)])])])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nexport default {\n name: 'MobileDirectoryDrawer',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n currentPath: {\n type: String,\n default: ''\n }\n },\n emits: ['update:modelValue', 'navigate', 'goBack'],\n computed: {\n pathParts() {\n return this.currentPath.split('/').filter(Boolean);\n }\n },\n methods: {\n close() {\n this.$emit('update:modelValue', false);\n },\n navigate(path) {\n this.$emit('navigate', path);\n this.close();\n },\n goBack() {\n this.$emit('goBack');\n this.close();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./MobileDirectoryDrawer.vue?vue&type=template&id=768efd1f&scoped=true\"\nimport script from \"./MobileDirectoryDrawer.vue?vue&type=script&lang=js\"\nexport * from \"./MobileDirectoryDrawer.vue?vue&type=script&lang=js\"\n\nimport \"./MobileDirectoryDrawer.vue?vue&type=style&index=0&id=768efd1f&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-768efd1f\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, Transition as _Transition, withCtx as _withCtx, Teleport as _Teleport, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"bottom-sheet-header\"\n};\nconst _hoisted_2 = {\n class: \"bottom-sheet-title\"\n};\nconst _hoisted_3 = {\n class: \"bottom-sheet-content\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Teleport, {\n to: \"body\"\n }, [_createVNode(_Transition, {\n name: \"bottom-sheet\"\n }, {\n default: _withCtx(() => [$props.modelValue ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"bottom-sheet-overlay\",\n onClick: _cache[9] || (_cache[9] = (...args) => $options.close && $options.close(...args))\n }, [_createElementVNode(\"div\", {\n class: \"bottom-sheet\",\n onClick: _cache[8] || (_cache[8] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"div\", _hoisted_1, [_cache[10] || (_cache[10] = _createElementVNode(\"div\", {\n class: \"bottom-sheet-handle\"\n }, null, -1)), _createElementVNode(\"span\", _hoisted_2, _toDisplayString($props.title), 1)]), _createElementVNode(\"div\", _hoisted_3, [!$props.isFolder ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[0] || (_cache[0] = $event => $options.handleAction('detail'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.viewDetail')), 1)]), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[1] || (_cache[1] = $event => $options.handleAction('copy'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.copyLink')), 1)]), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[2] || (_cache[2] = $event => $options.handleAction('download'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"download\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.downloadFile')), 1)]), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[3] || (_cache[3] = $event => $options.handleAction('move'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.moveFile')), 1)]), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[4] || (_cache[4] = $event => $options.handleAction('tag'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"tags\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.tagManagement')), 1)])], 64)) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[5] || (_cache[5] = $event => $options.handleAction('folderCopy'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.copyLink')), 1)]), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item\",\n onClick: _cache[6] || (_cache[6] = $event => $options.handleAction('move'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('mobileAction.moveFolder')), 1)])], 64)), _createElementVNode(\"div\", {\n class: \"bottom-sheet-item bottom-sheet-danger\",\n onClick: _cache[7] || (_cache[7] = $event => $options.handleAction('delete'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n class: \"bottom-sheet-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString($props.isFolder ? _ctx.$t('mobileAction.deleteFolder') : _ctx.$t('mobileAction.deleteFile')), 1)])])])])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]);\n}","export default {\n name: 'MobileActionSheet',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n title: {\n type: String,\n default: ''\n },\n isFolder: {\n type: Boolean,\n default: false\n }\n },\n emits: ['update:modelValue', 'action'],\n methods: {\n close() {\n this.$emit('update:modelValue', false);\n },\n handleAction(action) {\n this.$emit('action', action);\n this.close();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./MobileActionSheet.vue?vue&type=template&id=62bb601c&scoped=true\"\nimport script from \"./MobileActionSheet.vue?vue&type=script&lang=js\"\nexport * from \"./MobileActionSheet.vue?vue&type=script&lang=js\"\n\nimport \"./MobileActionSheet.vue?vue&type=style&index=0&id=62bb601c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-62bb601c\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, withKeys as _withKeys, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"batch-tag-container\"\n};\nconst _hoisted_2 = {\n class: \"tab-content\"\n};\nconst _hoisted_3 = {\n class: \"tab-description\"\n};\nconst _hoisted_4 = {\n class: \"input-section\"\n};\nconst _hoisted_5 = {\n key: 0,\n class: \"suggestions-panel\"\n};\nconst _hoisted_6 = [\"onClick\"];\nconst _hoisted_7 = {\n class: \"tags-to-add-section\"\n};\nconst _hoisted_8 = {\n key: 0,\n class: \"tags-container\"\n};\nconst _hoisted_9 = {\n key: 1,\n class: \"empty-message\"\n};\nconst _hoisted_10 = {\n class: \"action-buttons\"\n};\nconst _hoisted_11 = {\n class: \"tab-content\"\n};\nconst _hoisted_12 = {\n class: \"tab-description\"\n};\nconst _hoisted_13 = {\n key: 0,\n class: \"common-tags-section\"\n};\nconst _hoisted_14 = {\n class: \"tags-container\"\n};\nconst _hoisted_15 = {\n key: 1,\n class: \"empty-message\"\n};\nconst _hoisted_16 = {\n class: \"tab-content\"\n};\nconst _hoisted_17 = {\n class: \"tab-description\"\n};\nconst _hoisted_18 = {\n class: \"action-buttons\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_tab_pane = _resolveComponent(\"el-tab-pane\");\n const _component_el_alert = _resolveComponent(\"el-alert\");\n const _component_el_tabs = _resolveComponent(\"el-tabs\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('batchTag.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $options.visible = $event),\n width: $options.dialogWidth,\n onClose: $options.handleClose\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [_createVNode(_component_el_tabs, {\n modelValue: $data.activeTab,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.activeTab = $event),\n type: \"border-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tab_pane, {\n label: _ctx.$t('batchTag.addTab'),\n name: \"add\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"p\", _hoisted_3, _toDisplayString(_ctx.$t('batchTag.addDescription', {\n count: $options.fileCount\n })), 1), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_input, {\n modelValue: $data.inputTag,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.inputTag = $event),\n placeholder: _ctx.$t('batchTag.inputPlaceholder'),\n onKeyup: _withKeys($options.handleAddInputTag, [\"enter\"]),\n onInput: $options.handleInputChange,\n clearable: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.handleAddInputTag,\n type: \"primary\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onKeyup\", \"onInput\"]), $data.showSuggestions && $data.suggestions.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.suggestions, tag => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: tag,\n class: \"suggestion-item\",\n onClick: $event => $options.selectSuggestion(tag)\n }, _toDisplayString(tag), 9, _hoisted_6);\n }), 128))])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"h4\", null, _toDisplayString(_ctx.$t('batchTag.pendingTags')), 1), $data.tagsToAdd.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.tagsToAdd, tag => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: tag,\n closable: \"\",\n onClose: $event => $options.removeFromToAdd(tag),\n class: \"tag-item\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(tag), 1)]),\n _: 2\n }, 1032, [\"onClose\"]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_9, _toDisplayString(_ctx.$t('batchTag.noPendingTags')), 1))]), _createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.executeAddTags,\n loading: $data.loading,\n disabled: $data.tagsToAdd.length === 0\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('batchTag.addToAllFiles')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"loading\", \"disabled\"])])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_tab_pane, {\n label: _ctx.$t('batchTag.removeTab'),\n name: \"remove\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"p\", _hoisted_12, _toDisplayString(_ctx.$t('batchTag.removeDescription')), 1), $data.commonTags.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_13, [_createElementVNode(\"h4\", null, _toDisplayString(_ctx.$t('batchTag.commonTags')), 1), _createElementVNode(\"div\", _hoisted_14, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.commonTags, tag => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: tag,\n closable: \"\",\n onClose: $event => $options.handleRemoveCommonTag(tag),\n class: \"tag-item\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(tag), 1)]),\n _: 2\n }, 1032, [\"onClose\"]);\n }), 128))])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_15, _toDisplayString(_ctx.$t('batchTag.noCommonTags')), 1))])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_tab_pane, {\n label: _ctx.$t('batchTag.clearTab'),\n name: \"clear\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_16, [_createElementVNode(\"p\", _hoisted_17, _toDisplayString(_ctx.$t('batchTag.clearDescription', {\n count: $options.fileCount\n })), 1), _createVNode(_component_el_alert, {\n title: _ctx.$t('batchTag.clearWarningTitle'),\n type: \"warning\",\n description: _ctx.$t('batchTag.clearWarningDesc'),\n closable: false,\n style: {\n \"margin-bottom\": \"20px\"\n },\n center: \"\"\n }, null, 8, [\"title\", \"description\"]), _createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $options.handleClearAllTags,\n loading: $data.loading\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('batchTag.confirmClearAll')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])])])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\", \"onClose\"]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport { ElMessage, ElMessageBox } from 'element-plus';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'BatchTagDialog',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n selectedFiles: {\n type: Array,\n required: true,\n default: () => []\n }\n },\n emits: ['update:modelValue', 'tagsUpdated'],\n data() {\n return {\n activeTab: 'add',\n inputTag: '',\n tagsToAdd: [],\n commonTags: [],\n suggestions: [],\n showSuggestions: false,\n loading: false,\n debounceTimer: null\n };\n },\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth < 768 ? '90%' : '600px';\n },\n selectedFilesOnly() {\n // 排除文件夹,只保留文件\n return this.selectedFiles.filter(file => !file.isFolder);\n },\n fileCount() {\n return this.selectedFilesOnly.length;\n },\n fileIds() {\n return this.selectedFilesOnly.map(file => file.name);\n }\n },\n watch: {\n visible(newVal) {\n if (newVal) {\n this.loadCommonTags();\n } else {\n this.resetData();\n }\n },\n activeTab(newTab) {\n if (newTab === 'remove') {\n this.loadCommonTags();\n }\n }\n },\n methods: {\n resetData() {\n this.tagsToAdd = [];\n this.inputTag = '';\n this.showSuggestions = false;\n this.activeTab = 'add';\n },\n async loadCommonTags() {\n if (this.selectedFilesOnly.length === 0) {\n this.commonTags = [];\n return;\n }\n try {\n // 获取所有文件的标签\n const tagPromises = this.selectedFilesOnly.map(file => fetchWithAuth(`/api/manage/tags/${encodeURIComponent(file.name)}`, {\n method: 'GET'\n }));\n const responses = await Promise.all(tagPromises);\n const allTags = [];\n for (const response of responses) {\n if (response.ok) {\n const data = await response.json();\n allTags.push(data.tags || []);\n }\n }\n\n // 找出共有标签\n if (allTags.length > 0) {\n this.commonTags = allTags[0].filter(tag => allTags.every(tags => tags.includes(tag)));\n } else {\n this.commonTags = [];\n }\n } catch (error) {\n console.error('Error loading common tags:', error);\n ElMessage.error(this.$t('batchTag.loadCommonTagsFailed'));\n }\n },\n handleInputChange() {\n clearTimeout(this.debounceTimer);\n if (!this.inputTag || this.inputTag.trim().length === 0) {\n this.showSuggestions = false;\n return;\n }\n this.debounceTimer = setTimeout(() => {\n this.fetchSuggestions();\n }, 300);\n },\n async fetchSuggestions() {\n try {\n const prefix = this.inputTag.trim().toLowerCase();\n const response = await fetchWithAuth(`/api/manage/tags/autocomplete?prefix=${encodeURIComponent(prefix)}&limit=10`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.suggestions = (data.tags || []).filter(tag => !this.tagsToAdd.includes(tag));\n this.showSuggestions = this.suggestions.length > 0;\n }\n } catch (error) {\n console.error('Error fetching suggestions:', error);\n }\n },\n selectSuggestion(tag) {\n this.inputTag = tag;\n this.showSuggestions = false;\n this.handleAddInputTag();\n },\n handleAddInputTag() {\n const tag = this.inputTag.trim();\n if (!tag) {\n return;\n }\n if (this.tagsToAdd.includes(tag)) {\n ElMessage.warning(this.$t('batchTag.tagAlreadyInList'));\n this.inputTag = '';\n this.showSuggestions = false;\n return;\n }\n this.tagsToAdd.push(tag);\n this.inputTag = '';\n this.showSuggestions = false;\n },\n removeFromToAdd(tag) {\n const index = this.tagsToAdd.indexOf(tag);\n if (index > -1) {\n this.tagsToAdd.splice(index, 1);\n }\n },\n async executeAddTags() {\n if (this.tagsToAdd.length === 0) {\n ElMessage.warning(this.$t('batchTag.pleaseAddTags'));\n return;\n }\n this.loading = true;\n try {\n const response = await fetchWithAuth('/api/manage/tags/batch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n fileIds: this.fileIds,\n action: 'add',\n tags: this.tagsToAdd\n })\n });\n if (response.ok) {\n const data = await response.json();\n if (data.success || data.updated > 0) {\n ElMessage.success(this.$t('batchTag.addSuccess', {\n count: data.updated\n }));\n this.$emit('tagsUpdated');\n this.tagsToAdd = [];\n } else {\n throw new Error(this.$t('batchTag.addFailed'));\n }\n } else {\n throw new Error(this.$t('batchTag.addFailed'));\n }\n } catch (error) {\n console.error('Error adding tags:', error);\n ElMessage.error(this.$t('batchTag.addFailed'));\n } finally {\n this.loading = false;\n }\n },\n async handleRemoveCommonTag(tag) {\n this.loading = true;\n try {\n const response = await fetchWithAuth('/api/manage/tags/batch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n fileIds: this.fileIds,\n action: 'remove',\n tags: [tag]\n })\n });\n if (response.ok) {\n const data = await response.json();\n if (data.success || data.updated > 0) {\n ElMessage.success(this.$t('batchTag.removeSuccess', {\n count: data.updated\n }));\n this.$emit('tagsUpdated');\n await this.loadCommonTags();\n } else {\n throw new Error(this.$t('batchTag.removeFailed'));\n }\n } else {\n throw new Error(this.$t('batchTag.removeFailed'));\n }\n } catch (error) {\n console.error('Error removing tag:', error);\n ElMessage.error(this.$t('batchTag.removeFailed'));\n } finally {\n this.loading = false;\n }\n },\n handleClearAllTags() {\n ElMessageBox.confirm(this.$t('batchTag.clearConfirmMessage', {\n count: this.fileCount\n }), this.$t('batchTag.clearConfirmTitle'), {\n confirmButtonText: this.$t('batchTag.clearConfirmOk'),\n cancelButtonText: this.$t('batchTag.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n this.executeClearTags();\n }).catch(() => {\n ElMessage.info(this.$t('batchTag.clearCancelled'));\n });\n },\n async executeClearTags() {\n this.loading = true;\n try {\n const response = await fetchWithAuth('/api/manage/tags/batch', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n fileIds: this.fileIds,\n action: 'set',\n tags: []\n })\n });\n if (response.ok) {\n const data = await response.json();\n if (data.success || data.updated > 0) {\n ElMessage.success(this.$t('batchTag.clearSuccess', {\n count: data.updated\n }));\n this.$emit('tagsUpdated');\n this.commonTags = [];\n } else {\n throw new Error(this.$t('batchTag.clearFailed'));\n }\n } else {\n throw new Error(this.$t('batchTag.clearFailed'));\n }\n } catch (error) {\n console.error('Error clearing tags:', error);\n ElMessage.error(this.$t('batchTag.clearFailed'));\n } finally {\n this.loading = false;\n }\n },\n handleClose() {\n this.visible = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./BatchTagDialog.vue?vue&type=template&id=ec3adcfc&scoped=true\"\nimport script from \"./BatchTagDialog.vue?vue&type=script&lang=js\"\nexport * from \"./BatchTagDialog.vue?vue&type=script&lang=js\"\n\nimport \"./BatchTagDialog.vue?vue&type=style&index=0&id=ec3adcfc&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ec3adcfc\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, withKeys as _withKeys, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"tag-management-container\"\n};\nconst _hoisted_2 = {\n class: \"input-section\"\n};\nconst _hoisted_3 = {\n key: 0,\n class: \"suggestions-panel\"\n};\nconst _hoisted_4 = [\"onClick\"];\nconst _hoisted_5 = {\n class: \"current-tags-section\"\n};\nconst _hoisted_6 = {\n key: 0,\n class: \"tags-container\"\n};\nconst _hoisted_7 = {\n key: 1,\n class: \"empty-message\"\n};\nconst _hoisted_8 = {\n class: \"popular-tags-section\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"tags-container\"\n};\nconst _hoisted_10 = {\n key: 1,\n class: \"empty-message\"\n};\nconst _hoisted_11 = {\n key: 2,\n class: \"empty-message\"\n};\nconst _hoisted_12 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_Loading = _resolveComponent(\"Loading\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('tagManagement.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $options.visible = $event),\n width: $options.dialogWidth,\n onClose: $options.handleClose\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_12, [_createVNode(_component_el_button, {\n onClick: $options.handleClose\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('tagManagement.close')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_el_input, {\n modelValue: $data.inputTag,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.inputTag = $event),\n placeholder: _ctx.$t('tagManagement.inputPlaceholder'),\n onKeyup: _withKeys($options.handleAddTag, [\"enter\"]),\n onInput: $options.handleInputChange,\n clearable: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.handleAddTag,\n type: \"primary\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onKeyup\", \"onInput\"]), $data.showSuggestions && $data.suggestions.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.suggestions, tag => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: tag,\n class: \"suggestion-item\",\n onClick: $event => $options.selectSuggestion(tag)\n }, _toDisplayString(tag), 9, _hoisted_4);\n }), 128))])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"h4\", null, _toDisplayString(_ctx.$t('tagManagement.currentTags')), 1), $data.currentTags.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.currentTags, tag => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: tag,\n closable: \"\",\n onClose: $event => $options.handleRemoveTag(tag),\n class: \"tag-item\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(tag), 1)]),\n _: 2\n }, 1032, [\"onClose\"]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_7, _toDisplayString(_ctx.$t('tagManagement.noTags')), 1))]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"h4\", null, _toDisplayString(_ctx.$t('tagManagement.popularTags')), 1), $data.popularTags.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.popularTags, tag => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: tag,\n onClick: $event => $options.handleAddPopularTag(tag),\n class: \"tag-item clickable\",\n type: \"info\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(tag), 1)]),\n _: 2\n }, 1032, [\"onClick\"]);\n }), 128))])) : $data.loadingPopularTags ? (_openBlock(), _createElementBlock(\"div\", _hoisted_10, [_createVNode(_component_el_icon, {\n class: \"is-loading\"\n }, {\n default: _withCtx(() => [_createVNode(_component_Loading)]),\n _: 1\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('tagManagement.loading')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, _toDisplayString(_ctx.$t('tagManagement.noPopularTags')), 1))])])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\", \"onClose\"]);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport { ElMessage } from 'element-plus';\nimport { Loading } from '@element-plus/icons-vue';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'TagManagementDialog',\n components: {\n Loading\n },\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n fileId: {\n type: String,\n required: true\n }\n },\n emits: ['update:modelValue', 'tagsUpdated'],\n data() {\n return {\n currentTags: [],\n inputTag: '',\n suggestions: [],\n popularTags: [],\n showSuggestions: false,\n loading: false,\n loadingPopularTags: false,\n debounceTimer: null\n };\n },\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth < 768 ? '90%' : '500px';\n }\n },\n watch: {\n visible(newVal) {\n if (newVal) {\n this.loadFileTags();\n this.loadPopularTags();\n }\n }\n },\n methods: {\n async loadFileTags() {\n try {\n const response = await fetchWithAuth(`/api/manage/tags/${encodeURIComponent(this.fileId)}`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.currentTags = data.tags || [];\n } else {\n throw new Error('Failed to load tags');\n }\n } catch (error) {\n console.error('Error loading file tags:', error);\n ElMessage.error(this.$t('tagManagement.loadFailed'));\n }\n },\n async loadPopularTags() {\n this.loadingPopularTags = true;\n try {\n const response = await fetchWithAuth('/api/manage/tags/autocomplete?limit=20', {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.popularTags = (data.tags || []).filter(tag => !this.currentTags.includes(tag));\n }\n } catch (error) {\n console.error('Error loading popular tags:', error);\n } finally {\n this.loadingPopularTags = false;\n }\n },\n handleInputChange() {\n clearTimeout(this.debounceTimer);\n if (!this.inputTag || this.inputTag.trim().length === 0) {\n this.showSuggestions = false;\n return;\n }\n this.debounceTimer = setTimeout(() => {\n this.fetchSuggestions();\n }, 300);\n },\n async fetchSuggestions() {\n try {\n const prefix = this.inputTag.trim().toLowerCase();\n const response = await fetchWithAuth(`/api/manage/tags/autocomplete?prefix=${encodeURIComponent(prefix)}&limit=10`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.suggestions = (data.tags || []).filter(tag => !this.currentTags.includes(tag));\n this.showSuggestions = this.suggestions.length > 0;\n }\n } catch (error) {\n console.error('Error fetching suggestions:', error);\n }\n },\n selectSuggestion(tag) {\n this.inputTag = tag;\n this.showSuggestions = false;\n this.handleAddTag();\n },\n async handleAddTag() {\n const tag = this.inputTag.trim();\n if (!tag) {\n return;\n }\n if (this.currentTags.includes(tag)) {\n ElMessage.warning(this.$t('tagManagement.tagExists'));\n this.inputTag = '';\n this.showSuggestions = false;\n return;\n }\n try {\n const response = await fetchWithAuth(`/api/manage/tags/${encodeURIComponent(this.fileId)}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n action: 'add',\n tags: [tag]\n })\n });\n if (response.ok) {\n const data = await response.json();\n this.currentTags = data.tags || [];\n this.inputTag = '';\n this.showSuggestions = false;\n ElMessage.success(this.$t('tagManagement.addSuccess'));\n this.$emit('tagsUpdated', this.currentTags);\n\n // 重新加载常用标签\n this.loadPopularTags();\n } else {\n const error = await response.json();\n throw new Error(error.message || this.$t('tagManagement.addFailed'));\n }\n } catch (error) {\n console.error('Error adding tag:', error);\n ElMessage.error(error.message || this.$t('tagManagement.addFailed'));\n }\n },\n async handleRemoveTag(tag) {\n try {\n const response = await fetchWithAuth(`/api/manage/tags/${encodeURIComponent(this.fileId)}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n action: 'remove',\n tags: [tag]\n })\n });\n if (response.ok) {\n const data = await response.json();\n this.currentTags = data.tags || [];\n ElMessage.success(this.$t('tagManagement.removeSuccess'));\n this.$emit('tagsUpdated', this.currentTags);\n\n // 重新加载常用标签\n this.loadPopularTags();\n } else {\n throw new Error(this.$t('tagManagement.removeFailed'));\n }\n } catch (error) {\n console.error('Error removing tag:', error);\n ElMessage.error(this.$t('tagManagement.removeFailed'));\n }\n },\n handleAddPopularTag(tag) {\n this.inputTag = tag;\n this.handleAddTag();\n },\n handleClose() {\n this.visible = false;\n this.inputTag = '';\n this.showSuggestions = false;\n this.currentTags = [];\n this.popularTags = [];\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./TagManagementDialog.vue?vue&type=template&id=689f94e2&scoped=true\"\nimport script from \"./TagManagementDialog.vue?vue&type=script&lang=js\"\nexport * from \"./TagManagementDialog.vue?vue&type=script&lang=js\"\n\nimport \"./TagManagementDialog.vue?vue&type=style&index=0&id=689f94e2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-689f94e2\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock, renderList as _renderList, Fragment as _Fragment, withModifiers as _withModifiers } from \"vue\";\nconst _hoisted_1 = {\n class: \"detail-actions\"\n};\nconst _hoisted_2 = {\n class: \"preview-section\"\n};\nconst _hoisted_3 = {\n class: \"preview-content\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = [\"src\"];\nconst _hoisted_6 = {\n key: 1\n};\nconst _hoisted_7 = {\n key: 1\n};\nconst _hoisted_8 = {\n key: 0,\n style: {\n \"display\": \"flex\",\n \"align-items\": \"center\",\n \"gap\": \"6px\"\n }\n};\nconst _hoisted_9 = {\n key: 1,\n style: {\n \"color\": \"#909399\"\n }\n};\nconst _hoisted_10 = {\n key: 0,\n style: {\n \"display\": \"flex\",\n \"flex-wrap\": \"wrap\",\n \"gap\": \"5px\"\n }\n};\nconst _hoisted_11 = {\n key: 1,\n style: {\n \"color\": \"#909399\"\n }\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_tab_pane = _resolveComponent(\"el-tab-pane\");\n const _component_el_tabs = _resolveComponent(\"el-tabs\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('fileDetail.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $options.visible = $event),\n width: $options.dialogWidth\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [!$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('download')),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.download')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 1,\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => _ctx.$emit('tagManagement')),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"tags\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.tags')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 2,\n type: \"primary\",\n onClick: _cache[2] || (_cache[2] = $event => _ctx.$emit('block')),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ban\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.blacklist')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 3,\n type: \"primary\",\n onClick: _cache[3] || (_cache[3] = $event => _ctx.$emit('white')),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"shield-alt\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.whitelist')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 4,\n type: \"danger\",\n onClick: _cache[4] || (_cache[4] = $event => _ctx.$emit('delete')),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.deleteBtn')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 5,\n type: \"warning\",\n onClick: _cache[5] || (_cache[5] = $event => $options.startEdit()),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.edit')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), !$data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 6,\n type: \"info\",\n onClick: _cache[6] || (_cache[6] = $event => $options.openRenameDialog()),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"i-cursor\",\n style: {\n \"margin-right\": \"3px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.rename')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), $data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 7,\n type: \"success\",\n onClick: _cache[7] || (_cache[7] = $event => $options.saveMetadata()),\n round: \"\",\n size: \"small\",\n class: \"detail-action\",\n loading: $data.editSaving\n }, {\n default: _withCtx(() => [!$data.editSaving ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"save\",\n style: {\n \"margin-right\": \"3px\"\n }\n })) : _createCommentVNode(\"\", true), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('fileDetail.save')), 1)]),\n _: 1\n }, 8, [\"loading\"])) : _createCommentVNode(\"\", true), $data.isEditing ? (_openBlock(), _createBlock(_component_el_button, {\n key: 8,\n onClick: _cache[8] || (_cache[8] = $event => $options.cancelEdit()),\n round: \"\",\n size: \"small\",\n class: \"detail-action\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('fileDetail.cancel')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_tabs, {\n modelValue: $data.activeTab,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.activeTab = $event),\n onTabClick: $options.handleTabClick,\n style: {\n \"margin-bottom\": \"10px\"\n }\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tab_pane, {\n label: _ctx.$t('fileDetail.originUrl'),\n name: \"originUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.originUrl,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $props.urls.originUrl = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_tab_pane, {\n label: \"Markdown\",\n name: \"mdUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.mdUrl,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $props.urls.mdUrl = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tab_pane, {\n label: \"HTML\",\n name: \"htmlUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.htmlUrl,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $props.urls.htmlUrl = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tab_pane, {\n label: \"BBCode\",\n name: \"bbUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.bbUrl,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $props.urls.bbUrl = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n }), $props.file?.metadata?.TgFileId ? (_openBlock(), _createBlock(_component_el_tab_pane, {\n key: 0,\n label: \"TG File ID\",\n name: \"tgId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.tgId,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $props.urls.tgId = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true), $props.file?.metadata?.S3Location ? (_openBlock(), _createBlock(_component_el_tab_pane, {\n key: 1,\n label: \"S3 Location\",\n name: \"s3Location\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.S3Location,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $props.urls.S3Location = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true), $props.file?.metadata?.S3CdnFileUrl ? (_openBlock(), _createBlock(_component_el_tab_pane, {\n key: 2,\n label: \"S3 CDN URL\",\n name: \"s3CdnFileUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $props.urls.S3CdnFileUrl,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $props.urls.S3CdnFileUrl = $event),\n readonly: \"\",\n onClick: $options.handleUrlClick\n }, null, 8, [\"modelValue\", \"onClick\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"modelValue\", \"onTabClick\"]), _createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [$options.isVideo ? (_openBlock(), _createElementBlock(\"video\", {\n key: 0,\n src: $props.fileLink,\n autoplay: \"\",\n muted: \"\",\n loop: \"\",\n class: \"video-preview\",\n onClick: _cache[17] || (_cache[17] = (...args) => $options.openImageLink && $options.openImageLink(...args))\n }, null, 8, _hoisted_4)) : $options.isAudio ? (_openBlock(), _createElementBlock(\"audio\", {\n key: 1,\n src: $props.fileLink,\n controls: \"\",\n autoplay: \"\",\n class: \"audio-preview\"\n }, null, 8, _hoisted_5)) : $options.isImage ? (_openBlock(), _createBlock(_component_el_image, {\n key: 2,\n src: $props.fileLink,\n \"preview-src-list\": [$props.fileLink],\n \"preview-teleported\": true,\n fit: \"contain\",\n lazy: \"\",\n class: \"image-preview\"\n }, null, 8, [\"src\", \"preview-src-list\"])) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 3,\n icon: \"file\",\n class: \"file-icon-detail\"\n }))])]), _createVNode(_component_el_descriptions, {\n border: \"\",\n column: $options.descColumn\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.fileNameLabel')\n }, {\n default: _withCtx(() => [$data.isEditing ? (_openBlock(), _createBlock(_component_el_input, {\n key: 0,\n modelValue: $data.editForm.FileName,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.editForm.FileName = $event),\n size: \"small\",\n placeholder: _ctx.$t('fileDetail.fileNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])) : (_openBlock(), _createElementBlock(\"span\", _hoisted_6, _toDisplayString($props.file?.metadata?.FileName || $props.file?.name), 1))]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.fileType')\n }, {\n default: _withCtx(() => [$data.isEditing ? (_openBlock(), _createBlock(_component_el_input, {\n key: 0,\n modelValue: $data.editForm.FileType,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.editForm.FileType = $event),\n size: \"small\",\n placeholder: _ctx.$t('fileDetail.fileTypePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])) : (_openBlock(), _createElementBlock(\"span\", _hoisted_7, _toDisplayString($props.file?.metadata?.FileType || _ctx.$t('fileDetail.unknown')), 1))]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.fileSizeLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.fileSizeDisplay), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.imageDimensions')\n }, {\n default: _withCtx(() => [$options.imageDimensions ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [_createElementVNode(\"span\", null, _toDisplayString($props.file?.metadata?.Width) + \" × \" + _toDisplayString($props.file?.metadata?.Height), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n style: {\n \"display\": \"inline-flex\",\n \"align-items\": \"center\",\n \"justify-content\": \"center\"\n }\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.orientationIcon), 1)]),\n _: 1\n })])) : (_openBlock(), _createElementBlock(\"span\", _hoisted_9, _toDisplayString(_ctx.$t('fileDetail.noDimensions')), 1))]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.uploadTimeLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.uploadTime), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.channelTypeAndName')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n style: {\n \"margin-right\": \"6px\"\n }\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($props.file?.metadata?.Channel || _ctx.$t('fileDetail.unknown')), 1)]),\n _: 1\n }), _createElementVNode(\"span\", null, _toDisplayString($props.file?.metadata?.ChannelName || '-'), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.accessStatusAndReview')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n size: \"small\",\n type: $options.accessTagType,\n style: {\n \"margin-right\": \"6px\"\n }\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.accessType), 1)]),\n _: 1\n }, 8, [\"type\"]), _createElementVNode(\"span\", null, _toDisplayString($props.file?.metadata?.Label || _ctx.$t('fileDetail.noTags')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.uploadIP')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($props.file?.metadata?.UploadIP || _ctx.$t('fileDetail.unknown')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.uploadAddressLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($props.file?.metadata?.UploadAddress || _ctx.$t('fileDetail.unknown')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('fileDetail.fileTags')\n }, {\n default: _withCtx(() => [$props.file?.metadata?.Tags && $props.file?.metadata?.Tags.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_10, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.file?.metadata?.Tags, tag => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: tag,\n size: \"small\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(tag), 1)]),\n _: 2\n }, 1024);\n }), 128))])) : (_openBlock(), _createElementBlock(\"span\", _hoisted_11, _toDisplayString(_ctx.$t('fileDetail.noTags')), 1))]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"column\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showRenameDialog,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.showRenameDialog = $event),\n title: _ctx.$t('fileDetail.renameTitle'),\n width: $options.dialogWidth,\n \"append-to-body\": \"\"\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[21] || (_cache[21] = $event => $options.closeRenameDialog())\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('fileDetail.renameCancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[22] || (_cache[22] = $event => $options.submitRename()),\n loading: $data.renameSaving,\n disabled: !$data.renameValidation.valid\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('fileDetail.renameConfirm')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n onSubmit: _withModifiers($options.submitRename, [\"prevent\"])\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('fileDetail.renameLabel'),\n error: $data.renameValidation.error\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.renameForm.newFileId,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.renameForm.newFileId = $event),\n placeholder: _ctx.$t('fileDetail.renamePlaceholder'),\n onInput: $options.validateRenameInput,\n clearable: \"\"\n }, null, 8, [\"modelValue\", \"placeholder\", \"onInput\"])]),\n _: 1\n }, 8, [\"label\", \"error\"])]),\n _: 1\n }, 8, [\"onSubmit\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]);\n}","/**\r\n * File_ID 验证器模块\r\n * 提供 File_ID 格式验证功能,用于重命名操作的前端校验\r\n * 非法字符规则复用 pathValidator 的字符集\r\n */\r\n\r\n/**\r\n * 非法字符正则表达式\r\n * 非法字符包括: \\ : * ? \" ' < > | 空格 ( ) [ ] { } # % ^ ` ~ ; @ & = + $ ,\r\n * 与 pathValidator.js 保持一致\r\n */\r\nconst INVALID_CHARS = /[\\\\:\\*\\?\"'<>\\| \\(\\)\\[\\]\\{\\}#%\\^`~;@&=\\+\\$,]/;\r\n\r\n/**\r\n * 验证 File_ID 格式\r\n * @param {string} newFileId - 新的 File_ID\r\n * @param {string} currentFileId - 当前 File_ID\r\n * @returns {{ valid: boolean, error?: string }}\r\n */\r\nexport function validateFileId(newFileId, currentFileId) {\r\n // 1. 空值/纯空白检测\r\n if (!newFileId || newFileId.trim() === '') {\r\n return {\r\n valid: false,\r\n error: '文件名不能为空'\r\n };\r\n }\r\n\r\n // 2. 与当前 File_ID 相同检测\r\n if (newFileId === currentFileId) {\r\n return {\r\n valid: false,\r\n error: '文件名未发生变化'\r\n };\r\n }\r\n\r\n // 3. 路径穿越检测\r\n if (newFileId.includes('..')) {\r\n return {\r\n valid: false,\r\n error: '文件名不能包含路径穿越字符 \"..\"'\r\n };\r\n }\r\n\r\n // 3.5 单独的 . 路径段检测(仅检查 /./ 或开头 ./,不检查末尾以允许继续输入如 .123)\r\n if (/\\/\\.\\//.test(newFileId) || /^\\.\\//.test(newFileId)) {\r\n return {\r\n valid: false,\r\n error: '文件名不能包含单独的 \".\" 路径段'\r\n };\r\n }\r\n\r\n // 4. 非法字符检测(复用 pathValidator 的字符规则)\r\n if (INVALID_CHARS.test(newFileId)) {\r\n return {\r\n valid: false,\r\n error: '文件名包含非法字符,请使用合法的文件名格式'\r\n };\r\n }\r\n\r\n // 5. 连续斜杠检测\r\n if (newFileId.includes('//')) {\r\n return {\r\n valid: false,\r\n error: '文件名不能包含连续的斜杠'\r\n };\r\n }\r\n\r\n return { valid: true };\r\n}\r\n","import \"core-js/modules/es.json.stringify.js\";\nimport { ElMessage } from 'element-plus';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport { validateFileId } from '@/utils/fileIdValidator';\nexport default {\n name: 'FileDetailDialog',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n file: {\n type: Object,\n default: null\n },\n fileLink: {\n type: String,\n default: ''\n },\n urls: {\n type: Object,\n default: () => ({\n originUrl: '',\n mdUrl: '',\n htmlUrl: '',\n bbUrl: '',\n tgId: '',\n S3Location: '',\n S3CdnFileUrl: ''\n })\n }\n },\n emits: ['update:modelValue', 'download', 'tagManagement', 'block', 'white', 'delete', 'metadataUpdated', 'fileRenamed'],\n watch: {\n visible(val) {\n if (!val) {\n // 关闭弹窗时退出编辑状态\n this.isEditing = false;\n this.editSaving = false;\n }\n }\n },\n data() {\n return {\n activeTab: 'originUrl',\n isEditing: false,\n editForm: {\n FileName: '',\n FileType: ''\n },\n editSaving: false,\n showRenameDialog: false,\n renameForm: {\n newFileId: ''\n },\n renameValidation: {\n valid: true,\n error: ''\n },\n renameSaving: false\n };\n },\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth < 768 ? '95%' : '900px';\n },\n descColumn() {\n return window.innerWidth < 768 ? 1 : 2;\n },\n isVideo() {\n // 先通过 content-type 判断\n const fileType = this.file?.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('video')) return true;\n // 再通过文件后缀判断\n const name = this.file?.name?.toLowerCase() || '';\n return name.endsWith('.mp4') || name.endsWith('.webm') || name.endsWith('.mov') || name.endsWith('.avi');\n },\n isAudio() {\n // 先通过 content-type 判断\n const fileType = this.file?.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('audio')) return true;\n // 再通过文件后缀判断\n const name = this.file?.name?.toLowerCase() || '';\n return name.endsWith('.mp3') || name.endsWith('.wav') || name.endsWith('.ogg') || name.endsWith('.flac');\n },\n isImage() {\n // 先通过 content-type 判断\n const fileType = this.file?.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('image')) return true;\n // 再通过文件后缀判断\n const name = this.file?.name?.toLowerCase() || '';\n return name.endsWith('.jpg') || name.endsWith('.jpeg') || name.endsWith('.png') || name.endsWith('.gif') || name.endsWith('.webp') || name.endsWith('.svg') || name.endsWith('.bmp') || name.endsWith('.avif') || name.endsWith('.heic') || name.endsWith('.heif');\n },\n uploadTime() {\n if (this.file?.metadata?.TimeStamp) {\n return new Date(this.file.metadata.TimeStamp).toLocaleString();\n }\n return this.$t('fileDetail.unknown');\n },\n accessType() {\n const listType = this.file?.metadata?.ListType;\n const label = this.file?.metadata?.Label;\n if (listType === 'White') return this.$t('fileDetail.accessNormalWhitelist');\n if (listType === 'Block') return this.$t('fileDetail.accessBlockedBlacklist');\n if (label === 'adult') return this.$t('fileDetail.accessBlockedReview');\n return this.$t('fileDetail.accessNormal');\n },\n accessTagType() {\n const listType = this.file?.metadata?.ListType;\n const label = this.file?.metadata?.Label;\n if (listType === 'White') return 'success';\n if (listType === 'Block') return 'danger';\n if (label === 'adult') return 'danger';\n return 'success';\n },\n imageDimensions() {\n const width = this.file?.metadata?.Width;\n const height = this.file?.metadata?.Height;\n if (width && height) return true;\n return null;\n },\n orientationIcon() {\n const width = this.file?.metadata?.Width;\n const height = this.file?.metadata?.Height;\n if (!width || !height) return '';\n const ratio = width / height;\n if (ratio > 1.1) return this.$t('fileDetail.orientationLandscape');\n if (ratio < 0.9) return this.$t('fileDetail.orientationPortrait');\n return this.$t('fileDetail.orientationSquare');\n },\n fileSizeDisplay() {\n const sizeBytes = this.file?.metadata?.FileSizeBytes;\n const sizeMB = this.file?.metadata?.FileSize;\n if (sizeBytes) {\n // 根据大小选择合适的单位\n if (sizeBytes < 1024) {\n return `${sizeBytes} B`;\n } else if (sizeBytes < 1024 * 1024) {\n return `${(sizeBytes / 1024).toFixed(2)} KB`;\n } else {\n return `${(sizeBytes / 1024 / 1024).toFixed(2)} MB`;\n }\n } else if (sizeMB) {\n return `${sizeMB} MB`;\n }\n return this.$t('fileDetail.unknown');\n }\n },\n methods: {\n handleVideoClick(e) {\n const video = e.target;\n if (video.paused) video.play();else video.pause();\n },\n handleTabClick() {},\n handleUrlClick(e) {\n const input = e.target;\n input.select();\n navigator.clipboard.writeText(input.value).then(() => {\n ElMessage.success(this.$t('fileDetail.linkCopied'));\n });\n },\n openImageLink() {\n if (this.fileLink) {\n window.open(this.fileLink, '_blank');\n }\n },\n startEdit() {\n this.editForm.FileName = this.file?.metadata?.FileName || '';\n this.editForm.FileType = this.file?.metadata?.FileType || '';\n this.isEditing = true;\n },\n cancelEdit() {\n this.isEditing = false;\n this.editForm.FileName = this.file?.metadata?.FileName || '';\n this.editForm.FileType = this.file?.metadata?.FileType || '';\n this.editSaving = false;\n },\n async saveMetadata() {\n this.editSaving = true;\n try {\n const fileId = this.file.name;\n const response = await fetchWithAuth(`/api/manage/metadata/${fileId}`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n FileName: this.editForm.FileName,\n FileType: this.editForm.FileType\n })\n });\n if (response.ok) {\n const data = await response.json();\n ElMessage.success(this.$t('fileDetail.metadataSaved'));\n this.isEditing = false;\n this.$emit('metadataUpdated', fileId, data.metadata);\n } else {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.message || this.$t('fileDetail.metadataSaveFailed'));\n }\n } catch (error) {\n console.error('Error saving metadata:', error);\n ElMessage.error(error.message || this.$t('fileDetail.metadataSaveFailed'));\n } finally {\n this.editSaving = false;\n }\n },\n openRenameDialog() {\n this.renameForm.newFileId = this.file?.name || '';\n this.renameValidation = {\n valid: true,\n error: ''\n };\n this.showRenameDialog = true;\n },\n closeRenameDialog() {\n this.showRenameDialog = false;\n this.renameForm.newFileId = '';\n this.renameValidation = {\n valid: true,\n error: ''\n };\n },\n validateRenameInput() {\n const result = validateFileId(this.renameForm.newFileId, this.file?.name || '');\n this.renameValidation = {\n valid: result.valid,\n error: result.error || ''\n };\n },\n async submitRename() {\n if (this.renameSaving) return;\n\n // Validate input first\n this.validateRenameInput();\n if (!this.renameValidation.valid) {\n return;\n }\n this.renameSaving = true;\n try {\n const oldFileId = this.file.name;\n const response = await fetchWithAuth(`/api/manage/rename/${oldFileId}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n newFileId: this.renameForm.newFileId\n })\n });\n if (response.ok) {\n const data = await response.json();\n ElMessage.success(this.$t('fileDetail.renameSuccess'));\n this.showRenameDialog = false;\n this.$emit('fileRenamed', oldFileId, this.renameForm.newFileId, data.metadata);\n } else if (response.status === 409) {\n // Conflict — target File_ID already exists\n this.renameValidation = {\n valid: false,\n error: this.$t('fileDetail.renameConflict')\n };\n } else {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.message || this.$t('fileDetail.renameFailed'));\n }\n } catch (error) {\n console.error('Error renaming file:', error);\n ElMessage.error(error.message || this.$t('fileDetail.renameFailed'));\n } finally {\n this.renameSaving = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FileDetailDialog.vue?vue&type=template&id=3f80812c&scoped=true\"\nimport script from \"./FileDetailDialog.vue?vue&type=script&lang=js\"\nexport * from \"./FileDetailDialog.vue?vue&type=script&lang=js\"\n\nimport \"./FileDetailDialog.vue?vue&type=style&index=0&id=3f80812c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3f80812c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"batch-floating-bar\"\n};\nconst _hoisted_2 = {\n class: \"batch-selection-summary\"\n};\nconst _hoisted_3 = {\n class: \"batch-selection-count\"\n};\nconst _hoisted_4 = {\n class: \"batch-floating-actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n return _openBlock(), _createBlock(_Transition, {\n name: \"batch-toolbar\"\n }, {\n default: _withCtx(() => [$props.selectedCount > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('dashboard.clearSelection'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"batch-floating-btn ghost\",\n \"aria-label\": _ctx.$t('dashboard.clearSelection'),\n onClick: $options.handleClear\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\",\n class: \"batch-floating-icon\"\n })]),\n _: 1\n }, 8, [\"aria-label\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: `${$props.selectedCount} ${_ctx.$t('dashboard.selectedItems')}`,\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", _hoisted_3, _toDisplayString($props.selectedCount), 1)])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _cache[0] || (_cache[0] = _createElementVNode(\"span\", {\n class: \"batch-toolbar-divider\"\n }, null, -1)), _createElementVNode(\"div\", _hoisted_4, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.actions, action => {\n return _openBlock(), _createBlock(_component_el_tooltip, {\n key: action.command,\n disabled: $options.disableTooltip,\n content: _ctx.$t(action.label),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"batch-floating-btn\", action.className]),\n \"aria-label\": _ctx.$t(action.label),\n onClick: $event => $options.handleAction(action.command)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: action.icon,\n class: \"batch-floating-icon\"\n }, null, 8, [\"icon\"])]),\n _: 2\n }, 1032, [\"class\", \"aria-label\", \"onClick\"])]),\n _: 2\n }, 1032, [\"disabled\", \"content\"]);\n }), 128))])])) : _createCommentVNode(\"\", true)]),\n _: 1\n });\n}","export default {\n name: 'BatchActionBar',\n props: {\n selectedCount: {\n type: Number,\n required: true\n }\n },\n emits: ['action', 'clear'],\n data() {\n return {\n actions: [{\n command: 'copy',\n label: 'dashboard.copy',\n icon: 'copy',\n className: 'copy'\n }, {\n command: 'download',\n label: 'dashboard.download',\n icon: 'download',\n className: 'download'\n }, {\n command: 'move',\n label: 'dashboard.move',\n icon: 'file-export',\n className: 'move'\n }, {\n command: 'tagManagement',\n label: 'dashboard.tagManagement',\n icon: 'tags',\n className: 'tag'\n }, {\n command: 'ban',\n label: 'dashboard.addToBlacklist',\n icon: 'ban',\n className: 'ban'\n }, {\n command: 'white',\n label: 'dashboard.addToWhitelist',\n icon: 'shield-alt',\n className: 'white'\n }, {\n command: 'delete',\n label: 'dashboard.delete',\n icon: 'trash-alt',\n className: 'danger'\n }]\n };\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n }\n },\n methods: {\n handleAction(command) {\n this.$emit('action', command);\n },\n handleClear() {\n this.$emit('clear');\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./BatchActionBar.vue?vue&type=template&id=4937e2f0&scoped=true\"\nimport script from \"./BatchActionBar.vue?vue&type=script&lang=js\"\nexport * from \"./BatchActionBar.vue?vue&type=script&lang=js\"\n\nimport \"./BatchActionBar.vue?vue&type=style&index=0&id=4937e2f0&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4937e2f0\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createVNode as _createVNode, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"list-col list-col-checkbox\"\n};\nconst _hoisted_2 = [\"src\"];\nconst _hoisted_3 = [\"src\"];\nconst _hoisted_4 = [\"title\"];\nconst _hoisted_5 = {\n class: \"filename-start\"\n};\nconst _hoisted_6 = {\n class: \"filename-end\"\n};\nconst _hoisted_7 = {\n class: \"list-col list-col-tags\"\n};\nconst _hoisted_8 = {\n key: 1,\n class: \"list-empty\"\n};\nconst _hoisted_9 = {\n class: \"list-col list-col-channel\"\n};\nconst _hoisted_10 = {\n class: \"list-col list-col-channel-name\"\n};\nconst _hoisted_11 = {\n key: 0,\n class: \"channel-name-box\"\n};\nconst _hoisted_12 = {\n key: 1,\n class: \"list-empty\"\n};\nconst _hoisted_13 = {\n class: \"list-col list-col-address\"\n};\nconst _hoisted_14 = {\n key: 0,\n class: \"address-box\"\n};\nconst _hoisted_15 = {\n key: 1,\n class: \"list-empty\"\n};\nconst _hoisted_16 = {\n class: \"list-col list-col-size\"\n};\nconst _hoisted_17 = {\n class: \"list-col list-col-date\"\n};\nconst _hoisted_18 = {\n class: \"list-col list-col-actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: \"list-item\",\n onTouchstart: _cache[9] || (_cache[9] = $event => _ctx.$emit('touchstart', $event)),\n onTouchend: _cache[10] || (_cache[10] = $event => _ctx.$emit('touchend', $event)),\n onTouchmove: _cache[11] || (_cache[11] = $event => _ctx.$emit('touchmove', $event))\n }, [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-checkbox\", {\n 'checked': $data.localSelected\n }]),\n onClick: _cache[0] || (_cache[0] = _withModifiers((...args) => $options.toggleSelect && $options.toggleSelect(...args), [\"stop\"]))\n }, [$data.localSelected ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"check\",\n class: \"check-icon\"\n })) : _createCommentVNode(\"\", true)], 2)]), _createElementVNode(\"div\", {\n class: \"list-col list-col-preview\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.handlePreviewClick && $options.handlePreviewClick(...args))\n }, [$options.isFolder ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"folder-open\",\n class: \"list-folder-icon\"\n })) : $options.isVideo ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: $props.fileLink,\n class: \"list-preview-img\",\n muted: \"\",\n preload: \"metadata\"\n }, null, 8, _hoisted_2)) : $options.isImage ? (_openBlock(), _createElementBlock(\"img\", {\n key: 2,\n src: $props.fileLink,\n class: \"list-preview-img\",\n loading: \"lazy\",\n decoding: \"async\"\n }, null, 8, _hoisted_3)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 3,\n icon: \"file\",\n class: \"list-file-icon\"\n }))]), _createElementVNode(\"div\", {\n class: \"list-col list-col-name\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.handlePreviewClick && $options.handlePreviewClick(...args))\n }, [_createElementVNode(\"span\", {\n class: \"filename-ellipsis\",\n title: $options.displayName\n }, [_createElementVNode(\"span\", _hoisted_5, _toDisplayString($options.fileNameStart), 1), _createElementVNode(\"span\", _hoisted_6, _toDisplayString($options.fileNameEnd), 1)], 8, _hoisted_4)]), _createElementVNode(\"div\", _hoisted_7, [!$options.isFolder && $props.item.metadata?.Tags && $props.item.metadata.Tags.length > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.item.metadata.Tags.slice(0, 3), (tag, tagIndex) => {\n return _openBlock(), _createElementBlock(\"span\", {\n key: tagIndex,\n class: \"color-tag\",\n style: _normalizeStyle({\n background: $options.getTagColor(tagIndex)\n })\n }, _toDisplayString(tag), 5);\n }), 128)), $props.item.metadata.Tags.length > 3 ? (_openBlock(), _createElementBlock(\"span\", {\n key: 0,\n class: \"color-tag color-tag-more\",\n style: _normalizeStyle({\n background: $options.getTagColor(3)\n })\n }, \"+\" + _toDisplayString($props.item.metadata.Tags.length - 3), 5)) : _createCommentVNode(\"\", true)], 64)) : (_openBlock(), _createElementBlock(\"span\", _hoisted_8, \"-\"))]), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.isFolder ? '-' : $props.item.metadata?.Channel || $props.item.channelTag || '-'), 1), _createElementVNode(\"div\", _hoisted_10, [!$options.isFolder && $props.item.metadata?.ChannelName ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, _toDisplayString($props.item.metadata.ChannelName), 1)) : (_openBlock(), _createElementBlock(\"span\", _hoisted_12, \"-\"))]), _createElementVNode(\"div\", _hoisted_13, [!$options.isFolder && $props.item.metadata?.UploadIP ? (_openBlock(), _createElementBlock(\"div\", _hoisted_14, _toDisplayString($props.item.metadata.UploadIP), 1)) : (_openBlock(), _createElementBlock(\"span\", _hoisted_15, \"-\"))]), _createElementVNode(\"div\", _hoisted_16, _toDisplayString($options.isFolder ? '-' : $options.fileSizeDisplay), 1), _createElementVNode(\"div\", _hoisted_17, _toDisplayString($options.uploadDate), 1), _createElementVNode(\"div\", _hoisted_18, [!$options.isFolder ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.copyLink'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn\",\n onClick: _cache[3] || (_cache[3] = _withModifiers($event => _ctx.$emit('copy'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.downloadFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn\",\n onClick: _cache[4] || (_cache[4] = _withModifiers($event => _ctx.$emit('download'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n })])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.moveFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn\",\n onClick: _cache[5] || (_cache[5] = _withModifiers($event => _ctx.$emit('move'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\"\n })])]),\n _: 1\n }, 8, [\"content\"])], 64)) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.copyLink'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn\",\n onClick: _cache[6] || (_cache[6] = _withModifiers($event => _ctx.$emit('folderCopy'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.moveFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn\",\n onClick: _cache[7] || (_cache[7] = _withModifiers($event => _ctx.$emit('move'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\"\n })])]),\n _: 1\n }, 8, [\"content\"])], 64)), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('dashboard.delete'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"list-action-btn list-action-danger\",\n onClick: _cache[8] || (_cache[8] = _withModifiers($event => _ctx.$emit('delete'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n }, 8, [\"content\"])])], 32);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nexport default {\n name: 'FileListItem',\n props: {\n item: {\n type: Object,\n required: true\n },\n selected: {\n type: Boolean,\n default: false\n },\n fileLink: {\n type: String,\n default: ''\n }\n },\n emits: ['update:selected', 'enter', 'detail', 'copy', 'folderCopy', 'move', 'delete', 'download', 'touchstart', 'touchend', 'touchmove'],\n data() {\n return {\n localSelected: this.selected,\n tagColors: ['#f472b6', '#a78bfa', '#60a5fa', '#34d399']\n };\n },\n computed: {\n isFolder() {\n // 检查 isFolder 属性或名称以 / 结尾\n return this.item.isFolder || this.item.name?.endsWith('/');\n },\n isVideo() {\n const name = this.item.name?.toLowerCase() || '';\n return name.endsWith('.mp4') || name.endsWith('.webm') || name.endsWith('.mov') || name.endsWith('.avi');\n },\n isImage() {\n const name = this.item.name?.toLowerCase() || '';\n return name.endsWith('.jpg') || name.endsWith('.jpeg') || name.endsWith('.png') || name.endsWith('.gif') || name.endsWith('.webp') || name.endsWith('.svg') || name.endsWith('.bmp');\n },\n displayName() {\n if (this.isFolder) {\n const parts = this.item.name.split('/').filter(Boolean);\n return parts[parts.length - 1] || this.item.name;\n }\n return this.item.metadata?.FileName || this.getFileName(this.item.name);\n },\n fileNameStart() {\n const name = this.displayName;\n if (name.length <= 20) return name;\n return name.slice(0, -8);\n },\n fileNameEnd() {\n const name = this.displayName;\n if (name.length <= 20) return '';\n return name.slice(-8);\n },\n uploadDate() {\n if (this.item.uploaded) {\n return new Date(this.item.uploaded).toLocaleDateString();\n }\n if (this.item.metadata?.TimeStamp) {\n return new Date(this.item.metadata.TimeStamp).toLocaleDateString();\n }\n return '-';\n },\n fileSizeDisplay() {\n const sizeBytes = this.item.metadata?.FileSizeBytes;\n const sizeMB = this.item.metadata?.FileSize;\n if (sizeBytes) {\n if (sizeBytes < 1024) {\n return `${sizeBytes} B`;\n } else if (sizeBytes < 1024 * 1024) {\n return `${(sizeBytes / 1024).toFixed(1)} KB`;\n } else {\n return `${(sizeBytes / 1024 / 1024).toFixed(2)} MB`;\n }\n } else if (sizeMB) {\n return `${sizeMB} MB`;\n }\n return '-';\n }\n },\n watch: {\n selected(val) {\n this.localSelected = val;\n }\n },\n methods: {\n toggleSelect() {\n this.localSelected = !this.localSelected;\n this.$emit('update:selected', this.localSelected);\n },\n handlePreviewClick() {\n if (this.isFolder) {\n this.$emit('enter');\n } else {\n this.$emit('detail');\n }\n },\n getFileName(name) {\n const parts = (name || '').split('/');\n return parts[parts.length - 1];\n },\n getTagColor(index) {\n return this.tagColors[index % this.tagColors.length];\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FileListItem.vue?vue&type=template&id=78d34f50&scoped=true\"\nimport script from \"./FileListItem.vue?vue&type=script&lang=js\"\nexport * from \"./FileListItem.vue?vue&type=script&lang=js\"\n\nimport \"./FileListItem.vue?vue&type=style&index=0&id=78d34f50&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-78d34f50\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, vShow as _vShow, withDirectives as _withDirectives, Fragment as _Fragment, withModifiers as _withModifiers, withCtx as _withCtx, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"file-short-info\"\n};\nconst _hoisted_2 = {\n key: 0,\n class: \"success-tag\"\n};\nconst _hoisted_3 = {\n key: 1,\n class: \"fail-tag\"\n};\nconst _hoisted_4 = {\n key: 2,\n class: \"success-tag\"\n};\nconst _hoisted_5 = {\n key: 3,\n class: \"primary-tag\"\n};\nconst _hoisted_6 = {\n key: 0,\n style: {\n \"margin-left\": \"2px\"\n }\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"skeleton-wrapper\"\n};\nconst _hoisted_8 = {\n class: \"error-text\"\n};\nconst _hoisted_9 = [\"src\"];\nconst _hoisted_10 = {\n class: \"error-text\"\n};\nconst _hoisted_11 = {\n key: 3,\n class: \"file-preview\"\n};\nconst _hoisted_12 = {\n class: \"card-bottom-overlay\"\n};\nconst _hoisted_13 = {\n class: \"file-name-row\"\n};\nconst _hoisted_14 = {\n class: \"file-name\"\n};\nconst _hoisted_15 = {\n class: \"action-bar\"\n};\nconst _hoisted_16 = {\n class: \"action-bar-left\"\n};\nconst _hoisted_17 = {\n class: \"action-bar-right\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_card = _resolveComponent(\"el-card\");\n return _openBlock(), _createBlock(_component_el_card, {\n class: \"img-card\",\n onTouchstart: _cache[17] || (_cache[17] = $event => _ctx.$emit('touchstart', $event)),\n onTouchend: _cache[18] || (_cache[18] = $event => _ctx.$emit('touchend', $event)),\n onTouchmove: _cache[19] || (_cache[19] = $event => _ctx.$emit('touchmove', $event))\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n modelValue: $data.localSelected,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.localSelected = $event),\n onChange: _cache[1] || (_cache[1] = $event => _ctx.$emit('update:selected', $data.localSelected))\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"div\", _hoisted_1, [$props.item.metadata?.ListType === 'White' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, _toDisplayString($options.channelTag), 1)) : $props.item.metadata?.ListType === 'Block' || $props.item.metadata?.Label === 'adult' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, _toDisplayString($options.channelTag), 1)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_4, _toDisplayString($options.channelTag), 1)), $props.item.metadata?.Tags && $props.item.metadata?.Tags.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [_createVNode(_component_font_awesome_icon, {\n icon: \"tag\",\n style: {\n \"margin-right\": \"3px\",\n \"font-size\": \"12px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString($props.item.metadata.Tags[0]) + \" \", 1), $props.item.metadata.Tags.length > 1 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_6, \" (+\" + _toDisplayString($props.item.metadata.Tags.length - 1) + \") \", 1)) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)]), $options.isVideo ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [$data.videoLoading ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7)) : $data.videoError ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"error-wrapper\",\n onClick: _cache[2] || (_cache[2] = $event => _ctx.$emit('detail'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_8, _toDisplayString(_ctx.$t('dashboard.loadFailed')), 1)])) : _createCommentVNode(\"\", true), _withDirectives(_createElementVNode(\"video\", {\n src: $props.fileLink,\n muted: \"\",\n loop: \"\",\n preload: \"metadata\",\n class: \"video-preview\",\n onClick: _cache[3] || (_cache[3] = (...args) => $options.handleVideoClick && $options.handleVideoClick(...args)),\n onMouseenter: _cache[4] || (_cache[4] = $event => $options.handleVideoHover($event, true)),\n onMouseleave: _cache[5] || (_cache[5] = $event => $options.handleVideoHover($event, false)),\n onFullscreenchange: _cache[6] || (_cache[6] = (...args) => $options.handleFullscreenChange && $options.handleFullscreenChange(...args)),\n onWebkitfullscreenchange: _cache[7] || (_cache[7] = (...args) => $options.handleFullscreenChange && $options.handleFullscreenChange(...args)),\n onLoadeddata: _cache[8] || (_cache[8] = $event => $data.videoLoading = false),\n onError: _cache[9] || (_cache[9] = (...args) => $options.handleVideoError && $options.handleVideoError(...args))\n }, null, 40, _hoisted_9), [[_vShow, !$data.videoLoading && !$data.videoError]])], 64)) : $options.isAudio ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-preview audio-card-preview\",\n onClick: _cache[10] || (_cache[10] = $event => _ctx.$emit('detail'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"music\",\n class: \"file-icon audio-icon\"\n })])) : $options.isImage ? (_openBlock(), _createBlock(_component_el_image, {\n key: 2,\n \"preview-teleported\": true,\n src: $props.fileLink,\n \"preview-src-list\": $props.previewSrcList,\n fit: \"cover\",\n lazy: \"\",\n decoding: \"async\",\n class: \"image-preview\"\n }, {\n placeholder: _withCtx(() => [...(_cache[20] || (_cache[20] = [_createElementVNode(\"div\", {\n class: \"skeleton-wrapper\"\n }, null, -1)]))]),\n error: _withCtx(() => [_createElementVNode(\"div\", {\n class: \"error-wrapper\",\n onClick: _cache[11] || (_cache[11] = _withModifiers($event => _ctx.$emit('detail'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"image\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('dashboard.loadFailed')), 1)])]),\n _: 1\n }, 8, [\"src\", \"preview-src-list\"])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })])), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"span\", _hoisted_14, _toDisplayString($options.displayName), 1)]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.detail'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[12] || (_cache[12] = _withModifiers($event => _ctx.$emit('detail'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])]), _createElementVNode(\"div\", _hoisted_17, [_createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.moveFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[13] || (_cache[13] = _withModifiers($event => _ctx.$emit('move'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.delete'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn action-btn-danger\",\n onClick: _cache[14] || (_cache[14] = _withModifiers($event => _ctx.$emit('delete'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.downloadFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[15] || (_cache[15] = _withModifiers($event => _ctx.$emit('download'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.copyLink'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[16] || (_cache[16] = _withModifiers($event => _ctx.$emit('copy'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])])]),\n _: 1\n });\n}","export default {\n name: 'FileCard',\n props: {\n item: {\n type: Object,\n required: true\n },\n selected: {\n type: Boolean,\n default: false\n },\n fileLink: {\n type: String,\n required: true\n },\n previewSrcList: {\n type: Array,\n default: () => []\n },\n disableTooltip: {\n type: Boolean,\n default: false\n }\n },\n emits: ['update:selected', 'detail', 'copy', 'move', 'delete', 'download', 'touchstart', 'touchend', 'touchmove'],\n data() {\n return {\n localSelected: this.selected,\n videoLoading: true,\n videoError: false\n };\n },\n computed: {\n channelTag() {\n return this.item.channelTag || '';\n },\n isVideo() {\n // 先通过 content-type 判断\n const fileType = this.item.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('video')) return true;\n // 再通过文件后缀判断\n const name = this.item.name?.toLowerCase() || '';\n return name.endsWith('.mp4') || name.endsWith('.webm') || name.endsWith('.mov') || name.endsWith('.avi');\n },\n isAudio() {\n // 先通过 content-type 判断\n const fileType = this.item.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('audio')) return true;\n // 再通过文件后缀判断\n const name = this.item.name?.toLowerCase() || '';\n return name.endsWith('.mp3') || name.endsWith('.wav') || name.endsWith('.ogg') || name.endsWith('.flac');\n },\n isImage() {\n // 先通过 content-type 判断\n const fileType = this.item.metadata?.FileType?.toLowerCase() || '';\n if (fileType.includes('image')) return true;\n // 再通过文件后缀判断\n const name = this.item.name?.toLowerCase() || '';\n return name.endsWith('.jpg') || name.endsWith('.jpeg') || name.endsWith('.png') || name.endsWith('.gif') || name.endsWith('.webp') || name.endsWith('.svg') || name.endsWith('.bmp') || name.endsWith('.avif') || name.endsWith('.heic') || name.endsWith('.heif');\n },\n displayName() {\n const fileName = this.item.metadata?.FileName || this.item.name || '';\n const parts = fileName.split('/');\n return parts[parts.length - 1];\n }\n },\n watch: {\n selected(val) {\n this.localSelected = val;\n },\n fileLink() {\n // 链接变化时重置加载状态\n this.videoLoading = true;\n this.videoError = false;\n }\n },\n methods: {\n handleVideoError() {\n this.videoLoading = false;\n this.videoError = true;\n },\n handleVideoClick(e) {\n const video = e.target;\n if (video.requestFullscreen) {\n video.requestFullscreen();\n } else if (video.webkitRequestFullscreen) {\n video.webkitRequestFullscreen();\n } else if (video.mozRequestFullScreen) {\n video.mozRequestFullScreen();\n } else if (video.msRequestFullscreen) {\n video.msRequestFullscreen();\n }\n },\n handleFullscreenChange(e) {\n const video = e.target;\n const isFullscreen = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;\n if (isFullscreen) {\n // 进入全屏:取消静音和循环\n video.muted = false;\n video.loop = false;\n } else {\n // 退出全屏:恢复静音和循环,暂停并重置\n video.muted = true;\n video.loop = true;\n video.pause();\n video.currentTime = 0;\n }\n },\n handleVideoHover(e, isEnter) {\n const video = e.target;\n if (isEnter) {\n video.play().catch(() => {});\n } else {\n video.pause();\n video.currentTime = 0;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FileCard.vue?vue&type=template&id=e367e94e&scoped=true\"\nimport script from \"./FileCard.vue?vue&type=script&lang=js\"\nexport * from \"./FileCard.vue?vue&type=script&lang=js\"\n\nimport \"./FileCard.vue?vue&type=style&index=0&id=e367e94e&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e367e94e\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withModifiers as _withModifiers, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"card-bottom-overlay\"\n};\nconst _hoisted_2 = {\n class: \"file-name-row\"\n};\nconst _hoisted_3 = {\n class: \"file-name\"\n};\nconst _hoisted_4 = {\n key: 0,\n class: \"action-bar\"\n};\nconst _hoisted_5 = {\n class: \"action-bar-right\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_card = _resolveComponent(\"el-card\");\n return _openBlock(), _createBlock(_component_el_card, {\n class: \"img-card folder-card\",\n onTouchstart: _cache[6] || (_cache[6] = $event => _ctx.$emit('touchstart', $event)),\n onTouchend: _cache[7] || (_cache[7] = $event => _ctx.$emit('touchend', $event)),\n onTouchmove: _cache[8] || (_cache[8] = $event => _ctx.$emit('touchmove', $event))\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n modelValue: $data.localSelected,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.localSelected = $event),\n onChange: _cache[1] || (_cache[1] = $event => _ctx.$emit('update:selected', $data.localSelected))\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"div\", {\n class: \"folder-icon\",\n onClick: _cache[2] || (_cache[2] = $event => _ctx.$emit('enter'))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-open\",\n class: \"folder-icon-svg\"\n })]), _createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", _hoisted_3, _toDisplayString($options.folderName), 1)]), $props.showActions ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [_cache[9] || (_cache[9] = _createElementVNode(\"div\", {\n class: \"action-bar-left\"\n }, null, -1)), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.copyLink'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[3] || (_cache[3] = _withModifiers($event => _ctx.$emit('copy'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.moveFile'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _cache[4] || (_cache[4] = _withModifiers($event => _ctx.$emit('move'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-export\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $props.disableTooltip,\n content: _ctx.$t('dashboard.delete'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"action-btn action-btn-danger\",\n onClick: _cache[5] || (_cache[5] = _withModifiers($event => _ctx.$emit('delete'), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])) : _createCommentVNode(\"\", true)])]),\n _: 1\n });\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nexport default {\n name: 'FolderCard',\n props: {\n name: {\n type: String,\n required: true\n },\n selected: {\n type: Boolean,\n default: false\n },\n showActions: {\n type: Boolean,\n default: true\n },\n disableTooltip: {\n type: Boolean,\n default: false\n }\n },\n emits: ['update:selected', 'enter', 'copy', 'move', 'delete', 'touchstart', 'touchend', 'touchmove'],\n data() {\n return {\n localSelected: this.selected\n };\n },\n computed: {\n folderName() {\n const parts = this.name.split('/').filter(Boolean);\n return parts[parts.length - 1] || this.name;\n }\n },\n watch: {\n selected(val) {\n this.localSelected = val;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FolderCard.vue?vue&type=template&id=5f22ef48&scoped=true\"\nimport script from \"./FolderCard.vue?vue&type=script&lang=js\"\nexport * from \"./FolderCard.vue?vue&type=script&lang=js\"\n\nimport \"./FolderCard.vue?vue&type=style&index=0&id=5f22ef48&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5f22ef48\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, createCommentVNode as _createCommentVNode, createStaticVNode as _createStaticVNode } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return $props.type === 'card' ? (_openBlock(true), _createElementBlock(_Fragment, {\n key: 0\n }, _renderList($props.count, i => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: 'skeleton-' + i,\n class: \"skeleton-card\"\n }, [...(_cache[0] || (_cache[0] = [_createElementVNode(\"div\", {\n class: \"skeleton-image\"\n }, null, -1), _createElementVNode(\"div\", {\n class: \"skeleton-info\"\n }, [_createElementVNode(\"div\", {\n class: \"skeleton-text\"\n })], -1)]))]);\n }), 128)) : $props.type === 'list' ? (_openBlock(true), _createElementBlock(_Fragment, {\n key: 1\n }, _renderList($props.count, i => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: 'list-skeleton-' + i,\n class: \"list-item skeleton-list-item\"\n }, [...(_cache[1] || (_cache[1] = [_createStaticVNode(\"

    \", 10)]))]);\n }), 128)) : _createCommentVNode(\"\", true);\n}","export default {\n name: 'SkeletonLoader',\n props: {\n type: {\n type: String,\n default: 'card',\n validator: value => ['card', 'list'].includes(value)\n },\n count: {\n type: Number,\n default: 15\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SkeletonLoader.vue?vue&type=template&id=5060702c&scoped=true\"\nimport script from \"./SkeletonLoader.vue?vue&type=script&lang=js\"\nexport * from \"./SkeletonLoader.vue?vue&type=script&lang=js\"\n\nimport \"./SkeletonLoader.vue?vue&type=style&index=0&id=5060702c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5060702c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createTextVNode as _createTextVNode, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n class: \"el-dropdown-link filter-trigger\"\n};\nconst _hoisted_2 = {\n class: \"filter-section\"\n};\nconst _hoisted_3 = {\n class: \"filter-title\"\n};\nconst _hoisted_4 = {\n class: \"filter-options\"\n};\nconst _hoisted_5 = {\n class: \"filter-section\"\n};\nconst _hoisted_6 = {\n class: \"filter-title\"\n};\nconst _hoisted_7 = {\n class: \"filter-options\"\n};\nconst _hoisted_8 = {\n class: \"filter-section\"\n};\nconst _hoisted_9 = {\n class: \"filter-title\"\n};\nconst _hoisted_10 = {\n class: \"filter-options\"\n};\nconst _hoisted_11 = {\n class: \"filter-section\"\n};\nconst _hoisted_12 = {\n class: \"filter-title\"\n};\nconst _hoisted_13 = {\n class: \"filter-options\"\n};\nconst _hoisted_14 = {\n class: \"filter-section\"\n};\nconst _hoisted_15 = {\n class: \"filter-title\"\n};\nconst _hoisted_16 = {\n class: \"filter-options\"\n};\nconst _hoisted_17 = {\n key: 0,\n class: \"filter-section\"\n};\nconst _hoisted_18 = {\n class: \"filter-title\"\n};\nconst _hoisted_19 = {\n class: \"filter-options\"\n};\nconst _hoisted_20 = {\n key: 0,\n class: \"channel-divider\"\n};\nconst _hoisted_21 = {\n class: \"channel-group-title\"\n};\nconst _hoisted_22 = {\n class: \"filter-actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_badge = _resolveComponent(\"el-badge\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n return _openBlock(), _createBlock(_component_el_dropdown, {\n \"hide-on-click\": false,\n trigger: \"click\",\n class: \"filter-dropdown\",\n ref: \"dropdownRef\"\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"filter-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, _toDisplayString(_ctx.$t('filter.accessStatus')), 1), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.accessStatus,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.localFilters.accessStatus = $event),\n onChange: _cache[1] || (_cache[1] = $event => $options.handleFilterChange('accessStatus'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.accessStatusOptions, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'accessStatus-' + option.value,\n label: option.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, _toDisplayString(_ctx.$t('filter.blackWhiteList')), 1), _createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.listType,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.localFilters.listType = $event),\n onChange: _cache[3] || (_cache[3] = $event => $options.handleFilterChange('listType'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.listTypeOptions, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'listType-' + option.value,\n label: option.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, _toDisplayString(_ctx.$t('filter.reviewResult')), 1), _createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.label,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.localFilters.label = $event),\n onChange: _cache[5] || (_cache[5] = $event => $options.handleFilterChange('label'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.labelOptions, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'label-' + option.value,\n label: option.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, _toDisplayString(_ctx.$t('filter.fileType')), 1), _createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.fileType,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.localFilters.fileType = $event),\n onChange: _cache[7] || (_cache[7] = $event => $options.handleFilterChange('fileType'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.fileTypeOptions, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'fileType-' + option.value,\n label: option.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, _toDisplayString(_ctx.$t('filter.channelType')), 1), _createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.channel,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.localFilters.channel = $event),\n onChange: _cache[9] || (_cache[9] = $event => $options.handleFilterChange('channel'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.channelOptions, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'channel-' + option.value,\n label: option.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]), $props.channelNameOptions.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [_createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('filter.channelName')), 1), _createElementVNode(\"div\", _hoisted_19, [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.localFilters.channelName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.localFilters.channelName = $event),\n onChange: _cache[11] || (_cache[11] = $event => $options.handleFilterChange('channelName'))\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedChannelNames, (group, index) => {\n return _openBlock(), _createElementBlock(_Fragment, {\n key: 'group-' + group.type\n }, [index > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_20)) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_21, _toDisplayString(group.typeLabel), 1), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.channels, option => {\n return _openBlock(), _createBlock(_component_el_checkbox, {\n key: 'channelName-' + option.type + '-' + option.name,\n label: option.type + ':' + option.name\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(option.name), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))], 64);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_el_button, {\n size: \"small\",\n onClick: $options.clearFilters,\n disabled: $options.activeFilterCount === 0\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('filter.clearFilters')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_1, [_createVNode(_component_el_badge, {\n value: $options.activeFilterCount,\n hidden: $options.activeFilterCount === 0,\n class: \"filter-badge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"filter\",\n class: \"header-icon\"\n })]),\n _: 1\n }, 8, [\"value\", \"hidden\"])])]),\n _: 1\n }, 512);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nexport default {\n name: 'FilterDropdown',\n props: {\n filters: {\n type: Object,\n default: () => ({\n accessStatus: [],\n // 访问状态: 'normal'(正常), 'blocked'(已屏蔽)\n listType: [],\n // 黑白名单: 'White', 'Block', 'none'\n label: [],\n fileType: [],\n channel: [],\n channelName: []\n })\n },\n channelNameOptions: {\n type: Array,\n default: () => []\n }\n },\n emits: ['update:filters', 'change'],\n data() {\n return {\n localFilters: {\n accessStatus: [],\n listType: [],\n label: [],\n fileType: [],\n channel: [],\n channelName: []\n }\n };\n },\n computed: {\n // 访问状态选项(综合判断 ListType 和 Label)\n // 正常: ListType !== 'Block' && Label !== 'adult'\n // 已屏蔽: ListType === 'Block' || Label === 'adult'\n accessStatusOptions() {\n return [{\n label: this.$t('filter.normal'),\n value: 'normal'\n }, {\n label: this.$t('filter.blocked'),\n value: 'blocked'\n }];\n },\n // 黑白名单选项(直接使用 ListType 字段值)\n listTypeOptions() {\n return [{\n label: this.$t('filter.whiteList'),\n value: 'White'\n }, {\n label: this.$t('filter.blackList'),\n value: 'Block'\n }, {\n label: this.$t('filter.notSet'),\n value: 'None'\n }];\n },\n // 审查结果选项\n labelOptions() {\n return [{\n label: this.$t('filter.normal'),\n value: 'normal'\n }, {\n label: this.$t('filter.teenContent'),\n value: 'teen'\n }, {\n label: this.$t('filter.adultContent'),\n value: 'adult'\n }];\n },\n fileTypeOptions() {\n return [{\n label: this.$t('filter.image'),\n value: 'image'\n }, {\n label: this.$t('filter.video'),\n value: 'video'\n }, {\n label: this.$t('filter.audio'),\n value: 'audio'\n }, {\n label: this.$t('filter.other'),\n value: 'other'\n }];\n },\n channelOptions() {\n return [{\n label: 'Telegram',\n value: 'TelegramNew'\n }, {\n label: 'Cloudflare R2',\n value: 'CloudflareR2'\n }, {\n label: 'S3',\n value: 'S3'\n }, {\n label: 'Discord',\n value: 'Discord'\n }, {\n label: 'HuggingFace',\n value: 'HuggingFace'\n }, {\n label: 'WebDAV',\n value: 'WebDAV'\n }, {\n label: this.$t('filter.externalLink'),\n value: 'External'\n }];\n },\n activeFilterCount() {\n return Object.values(this.localFilters).reduce((count, arr) => count + arr.length, 0);\n },\n // 按类型分组渠道名称\n groupedChannelNames() {\n const groups = {};\n this.channelNameOptions.forEach(option => {\n if (!groups[option.type]) {\n groups[option.type] = {\n type: option.type,\n typeLabel: option.typeLabel,\n channels: []\n };\n }\n groups[option.type].channels.push(option);\n });\n return Object.values(groups);\n }\n },\n watch: {\n filters: {\n handler(newFilters) {\n this.localFilters = {\n accessStatus: Array.isArray(newFilters.accessStatus) ? [...newFilters.accessStatus] : [],\n listType: Array.isArray(newFilters.listType) ? [...newFilters.listType] : [],\n label: Array.isArray(newFilters.label) ? [...newFilters.label] : [],\n fileType: Array.isArray(newFilters.fileType) ? [...newFilters.fileType] : [],\n channel: Array.isArray(newFilters.channel) ? [...newFilters.channel] : [],\n channelName: Array.isArray(newFilters.channelName) ? [...newFilters.channelName] : []\n };\n },\n immediate: true,\n deep: true\n }\n },\n methods: {\n handleFilterChange(type) {\n this.$emit('update:filters', {\n ...this.localFilters\n });\n this.$emit('change', {\n type,\n filters: {\n ...this.localFilters\n }\n });\n },\n clearFilters() {\n this.localFilters = {\n accessStatus: [],\n listType: [],\n label: [],\n fileType: [],\n channel: [],\n channelName: []\n };\n this.$emit('update:filters', {\n ...this.localFilters\n });\n this.$emit('change', {\n type: 'clear',\n filters: {\n ...this.localFilters\n }\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FilterDropdown.vue?vue&type=template&id=c3aeeea0&scoped=true\"\nimport script from \"./FilterDropdown.vue?vue&type=script&lang=js\"\nexport * from \"./FilterDropdown.vue?vue&type=script&lang=js\"\n\nimport \"./FilterDropdown.vue?vue&type=style&index=0&id=c3aeeea0&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c3aeeea0\"]])\n\nexport default __exports__","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport { resolveComponent as _resolveComponent, createVNode as _createVNode, withKeys as _withKeys, withCtx as _withCtx, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"search-area\"\n};\nconst _hoisted_4 = {\n class: \"search-card\"\n};\nconst _hoisted_5 = {\n class: \"actions\"\n};\nconst _hoisted_6 = {\n class: \"el-dropdown-link\"\n};\nconst _hoisted_7 = {\n class: \"el-dropdown-link\"\n};\nconst _hoisted_8 = {\n class: \"breadcrumb-container\"\n};\nconst _hoisted_9 = {\n class: \"mobile-directory-path\"\n};\nconst _hoisted_10 = {\n class: \"breadcrumb desktop-only\"\n};\nconst _hoisted_11 = [\"title\"];\nconst _hoisted_12 = {\n key: 1,\n class: \"empty-state\"\n};\nconst _hoisted_13 = {\n class: \"empty-text\"\n};\nconst _hoisted_14 = {\n class: \"empty-hint\"\n};\nconst _hoisted_15 = {\n class: \"list-header\"\n};\nconst _hoisted_16 = {\n class: \"list-col list-col-checkbox\"\n};\nconst _hoisted_17 = {\n class: \"list-col list-col-preview\"\n};\nconst _hoisted_18 = {\n class: \"list-col list-col-name\"\n};\nconst _hoisted_19 = {\n class: \"list-col list-col-tags\"\n};\nconst _hoisted_20 = {\n class: \"list-col list-col-channel\"\n};\nconst _hoisted_21 = {\n class: \"list-col list-col-channel-name\"\n};\nconst _hoisted_22 = {\n class: \"list-col list-col-address\"\n};\nconst _hoisted_23 = {\n class: \"list-col list-col-size\"\n};\nconst _hoisted_24 = {\n class: \"list-col list-col-date\"\n};\nconst _hoisted_25 = {\n class: \"list-col list-col-actions\"\n};\nconst _hoisted_26 = {\n key: 1,\n class: \"empty-state list-empty\"\n};\nconst _hoisted_27 = {\n class: \"empty-text\"\n};\nconst _hoisted_28 = {\n class: \"empty-hint\"\n};\nconst _hoisted_29 = {\n class: \"pagination-container\"\n};\nconst _hoisted_30 = {\n class: \"pagination-center\"\n};\nconst _hoisted_31 = {\n class: \"pagination-right\"\n};\nconst _hoisted_32 = {\n class: \"page-total\"\n};\nconst _hoisted_33 = {\n class: \"page-jump\"\n};\nconst _hoisted_34 = {\n class: \"dialog-section\"\n};\nconst _hoisted_35 = {\n class: \"section-header\"\n};\nconst _hoisted_36 = {\n class: \"section-title\"\n};\nconst _hoisted_37 = {\n class: \"section-content\"\n};\nconst _hoisted_38 = {\n class: \"dialog-section\"\n};\nconst _hoisted_39 = {\n class: \"section-header\"\n};\nconst _hoisted_40 = {\n class: \"section-title\"\n};\nconst _hoisted_41 = {\n class: \"section-content\"\n};\nconst _hoisted_42 = {\n class: \"setting-item\"\n};\nconst _hoisted_43 = {\n class: \"setting-label\"\n};\nconst _hoisted_44 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_45 = {\n class: \"setting-label\"\n};\nconst _hoisted_46 = {\n class: \"dialog-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_FilterDropdown = _resolveComponent(\"FilterDropdown\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_el_breadcrumb_item = _resolveComponent(\"el-breadcrumb-item\");\n const _component_el_breadcrumb = _resolveComponent(\"el-breadcrumb\");\n const _component_SkeletonLoader = _resolveComponent(\"SkeletonLoader\");\n const _component_FolderCard = _resolveComponent(\"FolderCard\");\n const _component_FileCard = _resolveComponent(\"FileCard\");\n const _component_FileListItem = _resolveComponent(\"FileListItem\");\n const _component_el_pagination = _resolveComponent(\"el-pagination\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_main = _resolveComponent(\"el-main\");\n const _component_el_container = _resolveComponent(\"el-container\");\n const _component_BatchActionBar = _resolveComponent(\"BatchActionBar\");\n const _component_FileDetailDialog = _resolveComponent(\"FileDetailDialog\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_TagManagementDialog = _resolveComponent(\"TagManagementDialog\");\n const _component_BatchTagDialog = _resolveComponent(\"BatchTagDialog\");\n const _component_MobileActionSheet = _resolveComponent(\"MobileActionSheet\");\n const _component_MobileDirectoryDrawer = _resolveComponent(\"MobileDirectoryDrawer\");\n const _component_MoveFileDialog = _resolveComponent(\"MoveFileDialog\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_container, null, {\n default: _withCtx(() => [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"dashboard\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_input, {\n modelValue: $data.tempSearch,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.tempSearch = $event),\n size: \"small\",\n placeholder: _ctx.$t('dashboard.searchPlaceholder'),\n onKeyup: _withKeys($options.handleSearch, [\"enter\"])\n }, {\n suffix: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"search\",\n class: \"search-icon\",\n onClick: $options.handleSearch\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onKeyup\"])]), _createVNode(_component_FilterDropdown, {\n filters: $data.filters,\n \"onUpdate:filters\": _cache[1] || (_cache[1] = $event => $data.filters = $event),\n channelNameOptions: $data.channelNameOptions,\n onChange: $options.handleFilterChange\n }, null, 8, [\"filters\", \"channelNameOptions\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_dropdown, {\n onCommand: $options.sort,\n \"hide-on-click\": false\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"dateDesc\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('dashboard.sortByDateDesc')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"nameAsc\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('dashboard.sortByNameAsc')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: $options.sortIcon,\n class: \"header-icon\"\n }, null, 8, [\"icon\"])])]),\n _: 1\n }, 8, [\"onCommand\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('dashboard.linkFormat'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"header-icon\",\n onClick: _cache[2] || (_cache[2] = $event => $data.showUrlDialog = true)\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: $data.viewMode === 'card' ? _ctx.$t('dashboard.listView') : _ctx.$t('dashboard.cardView'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.viewMode === 'card' ? 'list' : 'th-large',\n class: \"header-icon\",\n onClick: $options.toggleViewMode\n }, null, 8, [\"icon\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('dashboard.logout'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])]),\n _: 1\n }), _createVNode(_component_el_main, {\n class: _normalizeClass([\"main-container\", {\n 'has-batch-toolbar': $data.selectedFiles.length > 0\n }])\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"button\", {\n class: \"breadcrumb-select-button\",\n type: \"button\",\n onClick: _cache[3] || (_cache[3] = (...args) => $options.handleSelectPage && $options.handleSelectPage(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $options.selectPageIcon,\n class: \"breadcrumb-select-icon\"\n }, null, 8, [\"icon\"])]), _createElementVNode(\"div\", {\n class: \"mobile-directory-trigger\",\n onClick: _cache[4] || (_cache[4] = $event => $data.showMobileDirectoryDrawer = true)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-open\",\n class: \"mobile-directory-icon\"\n }), _createElementVNode(\"span\", _hoisted_9, _toDisplayString($data.currentPath && $data.currentPath.split('/').filter(Boolean).length > 0 ? $data.currentPath.split('/').filter(Boolean).pop() : _ctx.$t('dashboard.rootDirectory')), 1), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"mobile-directory-arrow\"\n })]), _createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_breadcrumb, {\n separator: \"/\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_breadcrumb_item, {\n onClick: _cache[5] || (_cache[5] = $event => $options.navigateToFolder(''))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"breadcrumb-home-icon\"\n })]),\n _: 1\n }), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.currentPath.split('/').filter(Boolean), (folder, index) => {\n return _openBlock(), _createBlock(_component_el_breadcrumb_item, {\n key: index,\n onClick: $event => $options.navigateToFolder($data.currentPath.split('/').filter(Boolean).slice(0, index + 1).join('/'))\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(folder), 1)]),\n _: 2\n }, 1032, [\"onClick\"]);\n }), 128))]),\n _: 1\n })]), _createElementVNode(\"span\", {\n class: \"stats-badge\",\n title: _ctx.$t('dashboard.totalFiles', {\n count: _ctx.$data.Number\n })\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"stats-badge-icon\"\n }), _createTextVNode(\" \" + _toDisplayString($data.Number), 1)], 8, _hoisted_11)]), $data.viewMode === 'card' ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: _normalizeClass([\"content\", {\n 'is-drag-selecting': $setup.isDragging\n }]),\n ref: \"cardContainerRef\"\n }, [$data.loading ? (_openBlock(), _createBlock(_component_SkeletonLoader, {\n key: 0,\n type: \"card\",\n count: 15\n })) : $options.paginatedTableData.length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_12, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-open\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", _hoisted_13, _toDisplayString($options.hasSearchOrFilter ? _ctx.$t('dashboard.noMatchingFiles') : _ctx.$t('dashboard.currentDirEmpty')), 1), _createElementVNode(\"p\", _hoisted_14, _toDisplayString($options.hasSearchOrFilter ? _ctx.$t('dashboard.adjustSearchHint') : _ctx.$t('dashboard.uploadHint')), 1)])) : (_openBlock(true), _createElementBlock(_Fragment, {\n key: 2\n }, _renderList($options.paginatedTableData, (item, index) => {\n return _openBlock(), _createElementBlock(_Fragment, {\n key: index\n }, [$options.isFolder(item) ? (_openBlock(), _createBlock(_component_FolderCard, {\n key: 0,\n name: item.name,\n selected: item.selected,\n \"onUpdate:selected\": $event => item.selected = $event,\n showActions: !$data.isSearchMode,\n disableTooltip: $options.disableTooltip,\n onEnter: $event => $options.enterFolder(item.name),\n onCopy: $event => $options.handleFolderCopy(item.name),\n onMove: $event => $options.handleMove(index, item.name),\n onDelete: $event => $options.handleDelete(index, item.name),\n onTouchstart: $event => $options.handleFolderTouchStart(item, index),\n onTouchend: $options.handleTouchEnd,\n onTouchmove: $options.handleTouchEnd\n }, null, 8, [\"name\", \"selected\", \"onUpdate:selected\", \"showActions\", \"disableTooltip\", \"onEnter\", \"onCopy\", \"onMove\", \"onDelete\", \"onTouchstart\", \"onTouchend\", \"onTouchmove\"])) : (_openBlock(), _createBlock(_component_FileCard, {\n key: 1,\n item: item,\n selected: item.selected,\n \"onUpdate:selected\": $event => item.selected = $event,\n fileLink: $options.getFileLink(item.name),\n previewSrcList: item.previewSrcList,\n disableTooltip: $options.disableTooltip,\n onDetail: $event => $options.openDetailDialog(index, item.name),\n onCopy: $event => $options.handleCopy(index, item.name),\n onMove: $event => $options.handleMove(index, item.name),\n onDelete: $event => $options.handleDelete(index, item.name),\n onDownload: $event => $options.handleDownload(item.name),\n onTouchstart: $event => $options.handleTouchStart(item, index),\n onTouchend: $options.handleTouchEnd,\n onTouchmove: $options.handleTouchEnd\n }, null, 8, [\"item\", \"selected\", \"onUpdate:selected\", \"fileLink\", \"previewSrcList\", \"disableTooltip\", \"onDetail\", \"onCopy\", \"onMove\", \"onDelete\", \"onDownload\", \"onTouchstart\", \"onTouchend\", \"onTouchmove\"]))], 64);\n }), 128))], 2)) : (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: _normalizeClass([\"list-view\", {\n 'is-drag-selecting': $setup.isDragging\n }]),\n ref: \"listContainerRef\"\n }, [_createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-checkbox\", {\n 'checked': $options.isSelectAll,\n 'indeterminate': $options.isIndeterminate\n }]),\n onClick: _cache[6] || (_cache[6] = $event => $options.handleSelectAllPage(!$options.isSelectAll))\n }, [$options.isSelectAll ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"check\",\n class: \"check-icon\"\n })) : $options.isIndeterminate ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"minus\",\n class: \"check-icon\"\n })) : _createCommentVNode(\"\", true)], 2)]), _createElementVNode(\"div\", _hoisted_17, _toDisplayString(_ctx.$t('dashboard.preview')), 1), _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('dashboard.fileName')), 1), _createElementVNode(\"div\", _hoisted_19, _toDisplayString(_ctx.$t('dashboard.tags')), 1), _createElementVNode(\"div\", _hoisted_20, _toDisplayString(_ctx.$t('dashboard.channelType')), 1), _createElementVNode(\"div\", _hoisted_21, _toDisplayString(_ctx.$t('dashboard.channelNameCol')), 1), _createElementVNode(\"div\", _hoisted_22, _toDisplayString(_ctx.$t('dashboard.uploadAddress')), 1), _createElementVNode(\"div\", _hoisted_23, _toDisplayString(_ctx.$t('dashboard.fileSize')), 1), _createElementVNode(\"div\", _hoisted_24, _toDisplayString(_ctx.$t('dashboard.uploadTime')), 1), _createElementVNode(\"div\", _hoisted_25, _toDisplayString(_ctx.$t('dashboard.actions')), 1)]), $data.loading ? (_openBlock(), _createBlock(_component_SkeletonLoader, {\n key: 0,\n type: \"list\",\n count: 15\n })) : $options.paginatedTableData.length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-open\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", _hoisted_27, _toDisplayString($options.hasSearchOrFilter ? _ctx.$t('dashboard.noMatchingFiles') : _ctx.$t('dashboard.currentDirEmpty')), 1), _createElementVNode(\"p\", _hoisted_28, _toDisplayString($options.hasSearchOrFilter ? _ctx.$t('dashboard.adjustSearchHint') : _ctx.$t('dashboard.uploadHint')), 1)])) : (_openBlock(true), _createElementBlock(_Fragment, {\n key: 2\n }, _renderList($options.paginatedTableData, (item, index) => {\n return _openBlock(), _createBlock(_component_FileListItem, {\n key: index,\n item: item,\n selected: item.selected,\n \"onUpdate:selected\": $event => item.selected = $event,\n fileLink: $options.getFileLink(item.name),\n onEnter: $event => $options.enterFolder(item.name),\n onDetail: $event => $options.openDetailDialog(index, item.name),\n onCopy: $event => $options.handleCopy(index, item.name),\n onFolderCopy: $event => $options.handleFolderCopy(item.name),\n onMove: $event => $options.handleMove(index, item.name),\n onDelete: $event => $options.handleDelete(index, item.name),\n onDownload: $event => $options.handleDownload(item.name),\n onTouchstart: $event => $options.isFolder(item) ? $options.handleFolderTouchStart(item, index) : $options.handleTouchStart(item, index),\n onTouchend: $options.handleTouchEnd,\n onTouchmove: $options.handleTouchEnd\n }, null, 8, [\"item\", \"selected\", \"onUpdate:selected\", \"fileLink\", \"onEnter\", \"onDetail\", \"onCopy\", \"onFolderCopy\", \"onMove\", \"onDelete\", \"onDownload\", \"onTouchstart\", \"onTouchend\", \"onTouchmove\"]);\n }), 128))], 2)), $setup.isDragging ? (_openBlock(), _createElementBlock(\"div\", {\n key: 2,\n class: \"drag-select-overlay\",\n style: _normalizeStyle({\n position: 'fixed',\n left: $setup.selectionRect.left + 'px',\n top: $setup.selectionRect.top + 'px',\n width: $setup.selectionRect.width + 'px',\n height: $setup.selectionRect.height + 'px'\n })\n }, null, 4)) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_29, [_createElementVNode(\"div\", _hoisted_30, [_createVNode(_component_el_pagination, {\n background: \"\",\n layout: \"prev, pager, next\",\n total: $options.filteredTableData.length,\n \"page-size\": $data.pageSize,\n \"current-page\": $data.currentPage,\n \"pager-count\": $options.pagerCount,\n onCurrentChange: $options.handlePageChange\n }, null, 8, [\"total\", \"page-size\", \"current-page\", \"pager-count\", \"onCurrentChange\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.refreshFileList,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync\",\n class: _normalizeClass({\n 'fa-spin': $data.refreshLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"]), $data.currentPage === Math.ceil($options.filteredTableData.length / $data.pageSize) ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.loadMoreData,\n loading: $data.loading,\n class: \"load-more\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('dashboard.loadMore')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_31, [_createElementVNode(\"span\", _hoisted_32, _toDisplayString(_ctx.$t('dashboard.totalPages', {\n count: $options.realTotalPages\n })), 1), _createElementVNode(\"div\", _hoisted_33, [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('dashboard.jumpTo')), 1), _createVNode(_component_el_input, {\n modelValue: $data.jumpPage,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.jumpPage = $event),\n size: \"small\",\n class: \"jump-input\",\n onKeyup: _withKeys($options.handleJumpPage, [\"enter\"])\n }, null, 8, [\"modelValue\", \"onKeyup\"]), _createVNode(_component_el_button, {\n size: \"small\",\n type: \"primary\",\n onClick: $options.handleJumpPage,\n class: \"jump-btn\"\n }, {\n default: _withCtx(() => [...(_cache[24] || (_cache[24] = [_createTextVNode(\"GO\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])])]),\n _: 1\n }, 8, [\"class\"])]),\n _: 1\n }), _createVNode(_component_BatchActionBar, {\n \"selected-count\": $data.selectedFiles.length,\n onAction: $options.handleBatchAction,\n onClear: $options.clearSelection\n }, null, 8, [\"selected-count\", \"onAction\", \"onClear\"]), _createVNode(_component_FileDetailDialog, {\n modelValue: $data.showdetailDialog,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.showdetailDialog = $event),\n file: $data.detailFile,\n fileLink: $options.getFileLink($data.detailFile?.name),\n urls: $options.allUrl,\n onDownload: _cache[9] || (_cache[9] = $event => $options.handleDownload($data.detailFile?.name)),\n onTagManagement: _cache[10] || (_cache[10] = $event => $options.handleTagManagement($data.detailFile?.name)),\n onBlock: _cache[11] || (_cache[11] = $event => $options.handleBlock($data.detailFile?.name)),\n onWhite: _cache[12] || (_cache[12] = $event => $options.handleWhite($data.detailFile?.name)),\n onDelete: _cache[13] || (_cache[13] = $event => $options.handleDetailDelete($data.detailFile?.name)),\n onMetadataUpdated: $options.handleMetadataUpdated,\n onFileRenamed: $options.handleFileRenamed\n }, null, 8, [\"modelValue\", \"file\", \"fileLink\", \"urls\", \"onMetadataUpdated\", \"onFileRenamed\"]), _createVNode(_component_el_dialog, {\n title: _ctx.$t('dashboard.linkFormat'),\n modelValue: $data.showUrlDialog,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.showUrlDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"div\", _hoisted_35, [_createElementVNode(\"span\", _hoisted_36, _toDisplayString(_ctx.$t('settings.defaultCopyLink')), 1)]), _createElementVNode(\"div\", _hoisted_37, [_createVNode(_component_el_radio_group, {\n modelValue: $data.defaultUrlFormat,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.defaultUrlFormat = $event),\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"originUrl\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('settings.rawLink')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"mdUrl\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code\",\n class: \"radio-icon\"\n }), _cache[25] || (_cache[25] = _createElementVNode(\"span\", null, \"Markdown\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"htmlUrl\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\",\n class: \"radio-icon\"\n }), _cache[26] || (_cache[26] = _createElementVNode(\"span\", null, \"HTML\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"bbUrl\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"quote-right\",\n class: \"radio-icon\"\n }), _cache[27] || (_cache[27] = _createElementVNode(\"span\", null, \"BBCode\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"tgId\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"radio-icon\"\n }), _cache[28] || (_cache[28] = _createElementVNode(\"span\", null, \"TG File ID\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"s3Location\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('settings.s3Link')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])])]), _createElementVNode(\"div\", _hoisted_38, [_createElementVNode(\"div\", _hoisted_39, [_createElementVNode(\"span\", _hoisted_40, _toDisplayString(_ctx.$t('settings.customLink')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('settings.customLinkTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_41, [_createElementVNode(\"div\", _hoisted_42, [_createElementVNode(\"span\", _hoisted_43, _toDisplayString(_ctx.$t('settings.enableCustom')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.useCustomUrl,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.useCustomUrl = $event),\n \"active-value\": \"true\",\n \"inactive-value\": \"false\"\n }, null, 8, [\"modelValue\"])]), $data.useCustomUrl === 'true' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_44, [_createElementVNode(\"span\", _hoisted_45, _toDisplayString(_ctx.$t('settings.customPrefix')), 1), _createVNode(_component_el_input, {\n modelValue: $data.customUrlPrefix,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.customUrlPrefix = $event),\n placeholder: _ctx.$t('settings.customPrefixPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"modelValue\", \"placeholder\"])])) : _createCommentVNode(\"\", true)])]), _createElementVNode(\"div\", _hoisted_46, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[17] || (_cache[17] = $event => $data.showUrlDialog = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('settings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_TagManagementDialog, {\n modelValue: $data.showTagDialog,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.showTagDialog = $event),\n fileId: $data.currentTagFile,\n onTagsUpdated: $options.handleTagsUpdated\n }, null, 8, [\"modelValue\", \"fileId\", \"onTagsUpdated\"]), _createVNode(_component_BatchTagDialog, {\n modelValue: $data.showBatchTagDialog,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.showBatchTagDialog = $event),\n selectedFiles: $data.selectedFiles,\n onTagsUpdated: $options.handleBatchTagsUpdated\n }, null, 8, [\"modelValue\", \"selectedFiles\", \"onTagsUpdated\"]), _createVNode(_component_MobileActionSheet, {\n modelValue: $data.showMobileActionModal,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.showMobileActionModal = $event),\n title: $data.mobileActionIsFolder ? $options.getFolderName($data.mobileActionFile?.name || '') : $data.mobileActionFile?.metadata?.FileName || $options.getFileName($data.mobileActionFile?.name || ''),\n isFolder: $data.mobileActionIsFolder,\n onAction: $options.handleMobileAction\n }, null, 8, [\"modelValue\", \"title\", \"isFolder\", \"onAction\"]), _createVNode(_component_MobileDirectoryDrawer, {\n modelValue: $data.showMobileDirectoryDrawer,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.showMobileDirectoryDrawer = $event),\n currentPath: $data.currentPath,\n onNavigate: $options.navigateToFolder,\n onGoBack: $options.handleGoBack\n }, null, 8, [\"modelValue\", \"currentPath\", \"onNavigate\", \"onGoBack\"]), _createVNode(_component_MoveFileDialog, {\n modelValue: $data.showMoveDialog,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.showMoveDialog = $event),\n \"current-directory\": $data.currentPath,\n \"is-batch-move\": $data.isBatchMove,\n \"initial-path\": $data.moveTargetPath,\n onConfirm: $options.confirmMove\n }, null, 8, [\"modelValue\", \"current-directory\", \"is-batch-move\", \"initial-path\", \"onConfirm\"])]);\n}","// 文件管理器工具类\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { ElMessage } from 'element-plus';\r\nimport i18n from '@/locales';\r\n\r\nclass FileManager {\r\n constructor() {\r\n this.FILE_LIST_PATH = 'data/fileList.json';\r\n this.fileListCache = null;\r\n this.storageWarningShown = false;\r\n }\r\n\r\n // 从本地存储读取文件列表\r\n getLocalFileList() {\r\n const fileList = this.getMutableFileList();\r\n return {\r\n ...fileList,\r\n files: [...(fileList.files || [])],\r\n directories: [...(fileList.directories || [])],\r\n };\r\n }\r\n\r\n getMutableFileList() {\r\n if (this.fileListCache) {\r\n return this.fileListCache;\r\n }\r\n\r\n try {\r\n const fileList = localStorage.getItem(this.FILE_LIST_PATH);\r\n this.fileListCache = fileList ? JSON.parse(fileList) : this.createEmptyFileList();\r\n return this.fileListCache;\r\n } catch (error) {\r\n console.error('Error reading local file list:', error);\r\n this.fileListCache = this.createEmptyFileList();\r\n return this.fileListCache;\r\n }\r\n }\r\n\r\n // 更新内存缓存,并尽量持久化到 localStorage\r\n updateFileListCache(fileList) {\r\n this.fileListCache = fileList || this.createEmptyFileList();\r\n const persisted = this.persistFileListCache();\r\n\r\n return {\r\n cacheUpdated: true,\r\n persisted,\r\n };\r\n }\r\n\r\n persistFileListCache() {\r\n try {\r\n localStorage.setItem(this.FILE_LIST_PATH, JSON.stringify(this.fileListCache));\r\n return true;\r\n } catch (error) {\r\n this.handleStoragePersistError(error);\r\n return false;\r\n }\r\n }\r\n\r\n createEmptyFileList() {\r\n return { files: [], directories: [] };\r\n }\r\n\r\n handleStoragePersistError(error) {\r\n console.warn('File list is kept in memory because localStorage persistence failed:', error);\r\n\r\n try {\r\n localStorage.removeItem(this.FILE_LIST_PATH);\r\n } catch (removeError) {\r\n console.warn('Failed to remove stale file list cache:', removeError);\r\n }\r\n\r\n if (!this.storageWarningShown) {\r\n this.storageWarningShown = true;\r\n ElMessage.warning(i18n.global.t('dashboard.fileListMemoryCacheWarning'));\r\n }\r\n }\r\n\r\n // 添加新文件到列表\r\n addFile(newFile) {\r\n try {\r\n const fileList = this.getMutableFileList();\r\n fileList.files.push(newFile);\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error adding file:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 添加新文件夹\r\n addFolder(folderName) {\r\n try {\r\n const fileList = this.getMutableFileList();\r\n if (!fileList.directories.includes(folderName)) {\r\n fileList.directories.push(folderName);\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n }\r\n return false; // 文件夹已存在\r\n } catch (error) {\r\n console.error('Error adding folder:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 移动文件或文件夹\r\n moveFile(oldPath, newPath, isFolder = false, currentPath = '') {\r\n try {\r\n let fileList = this.getMutableFileList();\r\n \r\n if (isFolder) {\r\n // 更新目录列表\r\n const oldFolderIndex = fileList.directories.indexOf(oldPath);\r\n if (oldFolderIndex !== -1) {\r\n fileList.directories.splice(oldFolderIndex, 1);\r\n }\r\n\r\n } else {\r\n // 移动单个文件\r\n const fileIndex = fileList.files.findIndex(file => file.name === oldPath);\r\n if (fileIndex !== -1) {\r\n // 从旧位置移除\r\n fileList.files.splice(fileIndex, 1);\r\n }\r\n\r\n }\r\n\r\n // 如果新路径包含当前目录的直接子目录,则添加直接子目录\r\n if (newPath.startsWith(currentPath)) {\r\n const pathArray = newPath.substring(currentPath.length).split('/');\r\n if (pathArray.length > 1) {\r\n const newFolder = currentPath + pathArray[0];\r\n if (!fileList.directories.includes(newFolder)) {\r\n fileList.directories.push(newFolder);\r\n }\r\n }\r\n }\r\n\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error moving file:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 从列表中删除文件\r\n removeFile(fileName) {\r\n try {\r\n let fileList = this.getMutableFileList();\r\n fileList.files = fileList.files.filter(file => file.name !== fileName);\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error removing file:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 从列表中删除文件夹(同时删除该文件夹下的所有文件)\r\n removeFolder(folderName) {\r\n try {\r\n let fileList = this.getMutableFileList();\r\n fileList.files = fileList.files.filter(file => !file.name.startsWith(folderName + '/'));\r\n fileList.directories = fileList.directories.filter(dir => dir !== folderName);\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error removing folder:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 获取指定目录下的文件和子目录\r\n getFilesInFolder(folderName) {\r\n try {\r\n const fileList = this.getMutableFileList();\r\n const files = fileList.files.filter(file => file.name.startsWith(folderName + '/'));\r\n const subdirectories = fileList.directories.filter(dir => dir.startsWith(folderName + '/'));\r\n return { files, directories: subdirectories };\r\n } catch (error) {\r\n console.error('Error getting files in folder:', error);\r\n return { files: [], directories: [] };\r\n }\r\n }\r\n\r\n // 构建筛选参数URL\r\n buildFilterParams(filters) {\r\n let params = '';\r\n // 访问状态筛选(综合判断)\r\n if (filters.accessStatus && filters.accessStatus.length > 0) {\r\n params += `&accessStatus=${encodeURIComponent(filters.accessStatus.join(','))}`;\r\n }\r\n // 黑白名单筛选(直接使用 ListType 字段)\r\n if (filters.listType && filters.listType.length > 0) {\r\n params += `&listType=${encodeURIComponent(filters.listType.join(','))}`;\r\n }\r\n if (filters.label && filters.label.length > 0) {\r\n params += `&label=${encodeURIComponent(filters.label.join(','))}`;\r\n }\r\n if (filters.fileType && filters.fileType.length > 0) {\r\n params += `&fileType=${encodeURIComponent(filters.fileType.join(','))}`;\r\n }\r\n if (filters.channel && filters.channel.length > 0) {\r\n params += `&channel=${encodeURIComponent(filters.channel.join(','))}`;\r\n }\r\n if (filters.channelName && filters.channelName.length > 0) {\r\n params += `&channelName=${encodeURIComponent(filters.channelName.join(','))}`;\r\n }\r\n return params;\r\n }\r\n\r\n // 更新文件列表\r\n async refreshFileList(dir, search = '', includeTags = '', excludeTags = '', filters = {}) {\r\n search = search.trim();\r\n try {\r\n let url = `/api/manage/list?count=60&dir=${dir}&search=${encodeURIComponent(search)}`;\r\n if (includeTags) {\r\n url += `&includeTags=${encodeURIComponent(includeTags)}`;\r\n }\r\n if (excludeTags) {\r\n url += `&excludeTags=${encodeURIComponent(excludeTags)}`;\r\n }\r\n // 添加筛选参数(支持多选)\r\n url += this.buildFilterParams(filters);\r\n \r\n const response = await fetchWithAuth(url, {\r\n method: 'GET',\r\n });\r\n const newFileList = await response.json();\r\n if (!newFileList.isIndexedResponse) {\r\n ElMessage.warning(i18n.global.t('dashboard.indexingWarning'));\r\n }\r\n // 保存包含新字段的完整数据\r\n return this.updateFileListCache(newFileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error refreshing file list:', error);\r\n return false;\r\n }\r\n }\r\n\r\n // 读取更多数据\r\n async loadMoreFiles(dir, search = '', includeTags = '', excludeTags = '', count = 60, filters = {}) {\r\n search = search.trim();\r\n try {\r\n const fileList = this.getMutableFileList();\r\n const start = fileList.files.length;\r\n\r\n let url = `/api/manage/list?dir=${dir}&start=${start}&count=${count}&search=${encodeURIComponent(search)}`;\r\n if (includeTags) {\r\n url += `&includeTags=${encodeURIComponent(includeTags)}`;\r\n }\r\n if (excludeTags) {\r\n url += `&excludeTags=${encodeURIComponent(excludeTags)}`;\r\n }\r\n // 添加筛选参数(支持多选)\r\n url += this.buildFilterParams(filters);\r\n\r\n const response = await fetchWithAuth(url, {\r\n method: 'GET',\r\n });\r\n \r\n const moreFiles = await response.json();\r\n fileList.files.push(...moreFiles.files);\r\n return this.updateFileListCache(fileList).cacheUpdated;\r\n } catch (error) {\r\n console.error('Error loading more files:', error);\r\n return { files: [], directories: [] };\r\n }\r\n }\r\n}\r\n\r\nexport const fileManager = new FileManager();\r\n","/**\r\n * 矩形工具函数\r\n * 用于框选(rubber-band selection)功能中的矩形计算和相交检测\r\n */\r\n\r\n/**\r\n * 判断两个矩形是否相交\r\n * @param {Object} rectA - { left, top, right, bottom }\r\n * @param {Object} rectB - { left, top, right, bottom }\r\n * @returns {boolean} 是否存在重叠区域\r\n */\r\nexport function rectIntersects(rectA, rectB) {\r\n return !(\r\n rectA.right <= rectB.left ||\r\n rectA.left >= rectB.right ||\r\n rectA.bottom <= rectB.top ||\r\n rectA.top >= rectB.bottom\r\n );\r\n}\r\n\r\n/**\r\n * 根据起始点和当前点计算选区矩形\r\n * @param {Object} start - { x, y } 起始鼠标坐标\r\n * @param {Object} current - { x, y } 当前鼠标坐标\r\n * @returns {Object} { left, top, width, height, right, bottom }\r\n */\r\nexport function calcSelectionRect(start, current) {\r\n const left = Math.min(start.x, current.x);\r\n const top = Math.min(start.y, current.y);\r\n const width = Math.abs(current.x - start.x);\r\n const height = Math.abs(current.y - start.y);\r\n return { left, top, width, height, right: left + width, bottom: top + height };\r\n}\r\n","import { ref, watch, onMounted, onBeforeUnmount, toValue } from 'vue';\r\nimport { rectIntersects, calcSelectionRect } from './rectIntersects.js';\r\n\r\n/**\r\n * Vue 3 Composable:框选(rubber-band selection)核心逻辑,支持多视图模式\r\n *\r\n * @param {Object} options\r\n * @param {Object} options.modes - Per-view-mode configuration\r\n * @param {Object} options.modes.card - Card view config\r\n * @param {import('vue').Ref} options.modes.card.containerRef\r\n * @param {string} options.modes.card.itemSelector - e.g. '.img-card'\r\n * @param {Object} options.modes.list - List view config\r\n * @param {import('vue').Ref} options.modes.list.containerRef\r\n * @param {string} options.modes.list.itemSelector - e.g. '.list-item'\r\n * @param {string} [options.mainSelector='.main-container'] - 主内容区域的 CSS 选择器,框选只能从该区域内开始\r\n * @param {import('vue').Ref} options.viewMode - 当前视图模式\r\n * @param {import('vue').Ref} options.items - 当前页的数据项(paginatedTableData)\r\n * @returns {{ isDragging: import('vue').Ref, selectionRect: import('vue').Ref }}\r\n */\r\nexport function useDragSelect(options) {\r\n const {\r\n modes,\r\n mainSelector = '.main-container',\r\n viewMode,\r\n items,\r\n } = options;\r\n\r\n // --- Reactive state ---\r\n const isDragging = ref(false);\r\n const selectionRect = ref({ left: 0, top: 0, width: 0, height: 0, right: 0, bottom: 0 });\r\n\r\n // --- Internal (non-reactive) state ---\r\n let startPoint = null; // { x, y } viewport coordinates at mousedown\r\n let preSelectSnapshot = []; // boolean[] snapshot of items[i].selected before drag\r\n let isAppendMode = false; // whether Shift/Ctrl/Cmd was held at mousedown\r\n\r\n // --- Enable/disable state ---\r\n const MOBILE_BREAKPOINT = 768; // px – at or below this width, drag-select is disabled\r\n let listenerAttached = false; // tracks whether the container mousedown listener is active\r\n\r\n // --- Auto-scroll state ---\r\n const EDGE_THRESHOLD = 50; // px from viewport edge to trigger auto-scroll\r\n const SCROLL_SPEED = 10; // px per frame to scroll\r\n let autoScrollTimer = null; // requestAnimationFrame ID for auto-scroll\r\n\r\n // --- Text selection prevention state ---\r\n let savedUserSelect = ''; // saved document.body.style.userSelect before drag\r\n\r\n // ------------------------------------------------------------------\r\n // Mode resolution helper\r\n // ------------------------------------------------------------------\r\n\r\n /**\r\n * Returns the configuration for the current viewMode.\r\n * @returns {{ containerRef: import('vue').Ref, itemSelector: string } | undefined}\r\n */\r\n function getActiveConfig() {\r\n const mode = toValue(viewMode);\r\n return modes[mode] || undefined;\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Enable / disable helpers\r\n // ------------------------------------------------------------------\r\n\r\n /**\r\n * Determine whether drag-select should be enabled.\r\n * Returns true when viewMode is 'card' or 'list' AND window width > 768px.\r\n */\r\n function shouldEnable() {\r\n const mode = toValue(viewMode);\r\n return (mode === 'card' || mode === 'list') && window.innerWidth > MOBILE_BREAKPOINT;\r\n }\r\n\r\n /**\r\n * Conditionally attach or detach the container listener based on shouldEnable().\r\n * Also cancels any active drag when detaching.\r\n */\r\n function syncListenerState() {\r\n if (shouldEnable()) {\r\n if (!listenerAttached) {\r\n attachContainerListener();\r\n }\r\n } else {\r\n if (listenerAttached) {\r\n cancelDrag();\r\n detachContainerListener();\r\n }\r\n }\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Helpers\r\n // ------------------------------------------------------------------\r\n\r\n /**\r\n * 判断 mousedown 目标是否为可启动框选的空白区域。\r\n * 必须在主内容区域内,且不在卡片、交互元素上。\r\n */\r\n function isBlankArea(event) {\r\n const target = event.target;\r\n // 必须在主内容区域(el-main)内\r\n const mainArea = target.closest(mainSelector);\r\n if (!mainArea) return false;\r\n // 排除当前模式的可选元素\r\n const config = getActiveConfig();\r\n if (config) {\r\n const itemEl = target.closest(config.itemSelector);\r\n if (itemEl) {\r\n const container = toValue(config.containerRef);\r\n if (container && container.contains(itemEl)) {\r\n return false;\r\n }\r\n }\r\n }\r\n // 排除交互元素(按钮、输入框、链接、下拉菜单、分页等)\r\n const interactive = target.closest('button, a, input, .el-input, .el-dropdown, .el-checkbox, .el-breadcrumb, .el-pagination, .el-pager, .header-content, .breadcrumb-container');\r\n if (interactive) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Determine whether a modifier key for append-select is pressed.\r\n */\r\n function hasAppendModifier(event) {\r\n return event.shiftKey || event.ctrlKey || event.metaKey;\r\n }\r\n\r\n /**\r\n * Save a snapshot of the current selected state for all items.\r\n */\r\n function saveSnapshot() {\r\n const currentItems = toValue(items);\r\n preSelectSnapshot = currentItems.map((item) => !!item.selected);\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Auto-scroll helpers\r\n // ------------------------------------------------------------------\r\n\r\n /** The last known clientY during a drag – updated by onMouseMove. */\r\n let lastClientY = 0;\r\n\r\n /**\r\n * Start the auto-scroll loop. On each animation frame we check whether the\r\n * mouse is within EDGE_THRESHOLD of the top or bottom of the viewport and\r\n * scroll accordingly. The selection rectangle and card hit-testing are also\r\n * updated after each scroll step so the visual feedback stays in sync.\r\n */\r\n function startAutoScroll() {\r\n if (autoScrollTimer !== null) return; // already running\r\n\r\n function scrollStep() {\r\n const viewportHeight = window.innerHeight;\r\n let scrollDelta = 0;\r\n\r\n if (lastClientY >= viewportHeight - EDGE_THRESHOLD) {\r\n // Near bottom edge → scroll down\r\n scrollDelta = SCROLL_SPEED;\r\n } else if (lastClientY <= EDGE_THRESHOLD) {\r\n // Near top edge → scroll up\r\n scrollDelta = -SCROLL_SPEED;\r\n }\r\n\r\n if (scrollDelta !== 0) {\r\n window.scrollBy(0, scrollDelta);\r\n\r\n // After scrolling, the viewport-relative positions of cards change,\r\n // but the mouse hasn't moved. We need to adjust the start point so\r\n // the selection rectangle accounts for the scroll offset, then\r\n // re-run hit-testing.\r\n if (startPoint) {\r\n startPoint.y -= scrollDelta;\r\n selectionRect.value = calcSelectionRect(startPoint, { x: selectionRect.value.right >= startPoint.x ? selectionRect.value.right : selectionRect.value.left, y: lastClientY });\r\n updateSelection();\r\n }\r\n }\r\n\r\n // Continue the loop\r\n autoScrollTimer = requestAnimationFrame(scrollStep);\r\n }\r\n\r\n autoScrollTimer = requestAnimationFrame(scrollStep);\r\n }\r\n\r\n /**\r\n * Stop the auto-scroll loop and clean up the timer.\r\n */\r\n function stopAutoScroll() {\r\n if (autoScrollTimer !== null) {\r\n cancelAnimationFrame(autoScrollTimer);\r\n autoScrollTimer = null;\r\n }\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Text selection prevention helpers\r\n // ------------------------------------------------------------------\r\n\r\n /**\r\n * Disable text selection on the document body during drag.\r\n */\r\n function disableTextSelection() {\r\n savedUserSelect = document.body.style.userSelect;\r\n document.body.style.userSelect = 'none';\r\n }\r\n\r\n /**\r\n * Restore the original text selection behavior on the document body.\r\n */\r\n function restoreTextSelection() {\r\n document.body.style.userSelect = savedUserSelect;\r\n }\r\n\r\n /**\r\n * Update the selected state of every item based on the current selection rectangle.\r\n */\r\n function updateSelection() {\r\n const config = getActiveConfig();\r\n if (!config) return;\r\n\r\n const container = toValue(config.containerRef);\r\n if (!container) return;\r\n\r\n const currentItems = toValue(items);\r\n const rect = selectionRect.value;\r\n\r\n // Build the selection rect in {left, top, right, bottom} format for intersection test\r\n const selRect = {\r\n left: rect.left,\r\n top: rect.top,\r\n right: rect.right,\r\n bottom: rect.bottom,\r\n };\r\n\r\n // Query all item DOM elements inside the container using the active mode's selector\r\n const itemElements = container.querySelectorAll(config.itemSelector);\r\n\r\n // Iterate over items and corresponding DOM elements\r\n currentItems.forEach((item, index) => {\r\n const itemEl = itemElements[index];\r\n if (!itemEl) return;\r\n\r\n const itemRect = itemEl.getBoundingClientRect();\r\n const itemBounds = {\r\n left: itemRect.left,\r\n top: itemRect.top,\r\n right: itemRect.right,\r\n bottom: itemRect.bottom,\r\n };\r\n\r\n const intersects = rectIntersects(selRect, itemBounds);\r\n\r\n if (isAppendMode) {\r\n // Append mode: keep original state, toggle on if intersects\r\n // If originally selected, stay selected regardless\r\n // If not originally selected, select if intersects\r\n if (preSelectSnapshot[index]) {\r\n item.selected = true;\r\n } else {\r\n item.selected = intersects;\r\n }\r\n } else {\r\n // Non-append mode: selected = intersects only\r\n item.selected = intersects;\r\n }\r\n });\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Mouse event handlers\r\n // ------------------------------------------------------------------\r\n\r\n function onMouseDown(event) {\r\n // 仅响应鼠标左键\r\n if (event.button !== 0) return;\r\n\r\n // 点击在卡片上时不启动框选\r\n if (!isBlankArea(event)) return;\r\n\r\n // Record start point (viewport coordinates)\r\n startPoint = { x: event.clientX, y: event.clientY };\r\n\r\n // Determine append mode from modifier keys at the moment of mousedown\r\n isAppendMode = hasAppendModifier(event);\r\n\r\n // 保存选中状态快照\r\n saveSnapshot();\r\n\r\n // 非追加模式下先清除所有选中\r\n if (!isAppendMode) {\r\n const currentItems = toValue(items);\r\n currentItems.forEach((item) => {\r\n item.selected = false;\r\n });\r\n }\r\n\r\n // Start dragging\r\n isDragging.value = true;\r\n selectionRect.value = calcSelectionRect(startPoint, startPoint);\r\n\r\n // 防止文本选中\r\n disableTextSelection();\r\n\r\n // Attach document-level listeners for move and up\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n }\r\n\r\n function onMouseMove(event) {\r\n if (!isDragging.value || !startPoint) return;\r\n\r\n const currentPoint = { x: event.clientX, y: event.clientY };\r\n\r\n // Track last clientY for auto-scroll\r\n lastClientY = event.clientY;\r\n\r\n // Update selection rectangle\r\n selectionRect.value = calcSelectionRect(startPoint, currentPoint);\r\n\r\n // Update card selection based on intersection\r\n updateSelection();\r\n\r\n // Start or continue auto-scroll if near viewport edges\r\n const viewportHeight = window.innerHeight;\r\n if (lastClientY <= EDGE_THRESHOLD || lastClientY >= viewportHeight - EDGE_THRESHOLD) {\r\n startAutoScroll();\r\n } else {\r\n stopAutoScroll();\r\n }\r\n }\r\n\r\n function onMouseUp(_event) {\r\n if (!isDragging.value) return;\r\n\r\n // 停止自动滚动\r\n stopAutoScroll();\r\n\r\n // 恢复文本选中\r\n restoreTextSelection();\r\n\r\n // End dragging\r\n isDragging.value = false;\r\n selectionRect.value = { left: 0, top: 0, width: 0, height: 0, right: 0, bottom: 0 };\r\n startPoint = null;\r\n\r\n // Clean up document-level listeners\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n }\r\n\r\n // ------------------------------------------------------------------\r\n // Lifecycle: attach / detach container listener\r\n // ------------------------------------------------------------------\r\n\r\n function attachContainerListener() {\r\n if (!listenerAttached) {\r\n document.addEventListener('mousedown', onMouseDown);\r\n listenerAttached = true;\r\n }\r\n }\r\n\r\n function detachContainerListener() {\r\n if (listenerAttached) {\r\n document.removeEventListener('mousedown', onMouseDown);\r\n listenerAttached = false;\r\n }\r\n }\r\n\r\n /**\r\n * Force-stop any in-progress drag (e.g. when viewMode changes).\r\n */\r\n function cancelDrag() {\r\n if (isDragging.value) {\r\n stopAutoScroll();\r\n restoreTextSelection();\r\n isDragging.value = false;\r\n selectionRect.value = { left: 0, top: 0, width: 0, height: 0, right: 0, bottom: 0 };\r\n startPoint = null;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n }\r\n }\r\n\r\n // 监听 viewMode 变化,启用/禁用框选\r\n // Always cancel any in-progress drag when viewMode changes (Requirement 2.3),\r\n // then re-evaluate whether listeners should be attached for the new mode.\r\n watch(\r\n () => toValue(viewMode),\r\n () => {\r\n cancelDrag();\r\n syncListenerState();\r\n }\r\n );\r\n\r\n // --- Window resize handler ---\r\n function onWindowResize() {\r\n syncListenerState();\r\n }\r\n\r\n onMounted(() => {\r\n // 仅在满足条件时启用\r\n if (shouldEnable()) {\r\n attachContainerListener();\r\n }\r\n // Always listen for resize to dynamically enable/disable\r\n window.addEventListener('resize', onWindowResize);\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n cancelDrag();\r\n restoreTextSelection();\r\n stopAutoScroll();\r\n detachContainerListener();\r\n window.removeEventListener('resize', onWindowResize);\r\n });\r\n\r\n return {\r\n isDragging,\r\n selectionRect,\r\n };\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/es.set.difference.v2.js\";\nimport \"core-js/modules/es.set.intersection.v2.js\";\nimport \"core-js/modules/es.set.is-disjoint-from.v2.js\";\nimport \"core-js/modules/es.set.is-subset-of.v2.js\";\nimport \"core-js/modules/es.set.is-superset-of.v2.js\";\nimport \"core-js/modules/es.set.symmetric-difference.v2.js\";\nimport \"core-js/modules/es.set.union.v2.js\";\nimport \"core-js/modules/web.url-search-params.delete.js\";\nimport \"core-js/modules/web.url-search-params.has.js\";\nimport \"core-js/modules/web.url-search-params.size.js\";\nimport { mapGetters } from 'vuex';\nimport JSZip from 'jszip';\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport TagManagementDialog from '@/components/dashboard/TagManagementDialog.vue';\nimport BatchTagDialog from '@/components/dashboard/BatchTagDialog.vue';\nimport SkeletonLoader from '@/components/dashboard/SkeletonLoader.vue';\nimport FileCard from '@/components/dashboard/FileCard.vue';\nimport FolderCard from '@/components/dashboard/FolderCard.vue';\nimport MoveFileDialog from '@/components/dashboard/MoveFileDialog.vue';\nimport FileListItem from '@/components/dashboard/FileListItem.vue';\nimport FileDetailDialog from '@/components/dashboard/FileDetailDialog.vue';\nimport BatchActionBar from '@/components/dashboard/BatchActionBar.vue';\nimport MobileActionSheet from '@/components/dashboard/MobileActionSheet.vue';\nimport MobileDirectoryDrawer from '@/components/dashboard/MobileDirectoryDrawer.vue';\nimport FilterDropdown from '@/components/dashboard/FilterDropdown.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nimport { fileManager } from '@/utils/fileManager';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport { validateFolderPath } from '@/utils/pathValidator';\nimport backgroundManager from '@/mixins/backgroundManager';\nimport { ref } from 'vue';\nimport { useDragSelect } from '@/utils/dashboard/useDragSelect.js';\nexport default {\n name: 'AdminDashBoard',\n mixins: [backgroundManager],\n data() {\n return {\n Number: 0,\n directFileCount: 0,\n // 当前目录直接子文件数量\n directFolderCount: 0,\n // 当前目录直接子文件夹数量\n showLogoutButton: false,\n tableData: [],\n tempSearch: '',\n search: '',\n searchKeywords: '',\n // Keywords only (without tag filters) for backend search\n searchIncludeTags: '',\n // 包含的标签,逗号分隔\n searchExcludeTags: '',\n // 排除的标签,逗号分隔\n isSearchMode: false,\n currentPage: 1,\n pageSize: 15,\n selectedFiles: [],\n sortOption: 'dateDesc',\n isUploading: false,\n showdetailDialog: false,\n detailFile: null,\n activeUrlTab: 'originUrl',\n defaultUrlFormat: 'originUrl',\n showUrlDialog: false,\n useCustomUrl: 'false',\n // 是否启用自定义链接\n customUrlPrefix: '',\n // 自定义链接前缀\n loading: false,\n // 加载状态\n currentPath: '',\n // 当前文件夹路径\n refreshLoading: false,\n showTagDialog: false,\n // 标签管理对话框\n showBatchTagDialog: false,\n // 批量标签管理对话框\n currentTagFile: '',\n // 当前标签管理的文件\n viewMode: 'card',\n // 视图模式:card 或 list\n showMobileActionModal: false,\n // 移动端操作模态框\n mobileActionFile: null,\n // 当前移动端操作的文件\n mobileActionIndex: -1,\n // 当前移动端操作的文件索引\n mobileActionIsFolder: false,\n // 是否为文件夹操作\n longPressTimer: null,\n // 长按计时器\n showMobileDirectoryDrawer: false,\n // 移动端目录抽屉\n jumpPage: '',\n // 跳转页码输入\n // 筛选相关状态(数组形式支持多选)\n filters: {\n accessStatus: [],\n // 访问状态: 'normal'(正常), 'blocked'(已屏蔽)\n listType: [],\n // 黑白名单: 'White', 'Block', 'None'\n label: [],\n // 审查结果: 'normal', 'teen', 'adult'\n fileType: [],\n // 文件类型: 'image', 'video', 'audio', 'other'\n channel: [],\n // 渠道类型: 'TelegramNew', 'CloudflareR2', 'S3', 'Discord', 'HuggingFace', 'WebDAV', 'External'\n channelName: [] // 渠道名称: 动态获取\n },\n channelNameOptions: [],\n // 动态从文件列表中提取\n // 移动文件对话框相关状态\n showMoveDialog: false,\n // 移动文件对话框\n moveTargetPath: '/',\n // 移动目标路径\n moveFileKey: '',\n // 当前移动的文件key\n moveFileIndex: -1,\n // 当前移动的文件索引\n isBatchMove: false // 是否为批量移动\n };\n },\n components: {\n DashboardTabs,\n TagManagementDialog,\n BatchTagDialog,\n SkeletonLoader,\n FileCard,\n FolderCard,\n FileListItem,\n FileDetailDialog,\n BatchActionBar,\n MobileActionSheet,\n MobileDirectoryDrawer,\n FilterDropdown,\n MoveFileDialog,\n LanguageSwitcher\n },\n setup() {\n const cardContainerRef = ref(null);\n const listContainerRef = ref(null);\n const viewModeRef = ref('card');\n const itemsRef = ref([]);\n const {\n isDragging,\n selectionRect\n } = useDragSelect({\n modes: {\n card: {\n containerRef: cardContainerRef,\n itemSelector: '.img-card'\n },\n list: {\n containerRef: listContainerRef,\n itemSelector: '.list-item'\n }\n },\n viewMode: viewModeRef,\n items: itemsRef\n });\n return {\n cardContainerRef,\n listContainerRef,\n viewModeRef,\n itemsRef,\n isDragging,\n selectionRect\n };\n },\n computed: {\n ...mapGetters(['adminUrlSettings', 'userConfig']),\n filteredTableData() {\n return this.tableData;\n },\n totalPages() {\n return Math.ceil(this.filteredTableData.length / this.pageSize) || 1;\n },\n // 基于当前文件夹直接子文件和子文件夹数量计算的真实总页数\n realTotalPages() {\n const total = this.directFolderCount + this.directFileCount;\n return Math.ceil(total / this.pageSize) || 1;\n },\n // 计算当前激活的筛选条件数量(数组形式)\n activeFilterCount() {\n return Object.values(this.filters).reduce((count, arr) => count + (Array.isArray(arr) ? arr.length : 0), 0);\n },\n // 判断是否处于搜索或筛选模式\n hasSearchOrFilter() {\n return this.isSearchMode || this.activeFilterCount > 0;\n },\n paginatedTableData() {\n const sortedData = this.sortData(this.filteredTableData);\n const start = (this.currentPage - 1) * this.pageSize;\n const end = start + this.pageSize;\n let data = sortedData.slice(start, end);\n // 增加previewSrcList属性,用于预览图片\n const fullList = data.filter(file => this.isImage(file)).map(file => this.getFileLink(file.name));\n data.forEach(file => {\n if (this.isImage(file)) {\n // 重新排序,索引大于等于当前索引的元素在前,否则在后\n file.previewSrcList = fullList.slice(fullList.indexOf(this.getFileLink(file.name))).concat(fullList.slice(0, fullList.indexOf(this.getFileLink(file.name))));\n }\n });\n // 增加channelTag属性,用于显示渠道信息\n data.forEach(file => {\n if (file.metadata?.Channel === 'TelegramNew' || file.metadata?.Channel === 'Telegram') {\n file.channelTag = 'TG';\n } else if (file.metadata?.Channel === 'CloudflareR2') {\n file.channelTag = 'R2';\n } else if (file.metadata?.Channel === 'S3') {\n file.channelTag = 'S3';\n } else if (file.metadata?.Channel === 'Discord') {\n file.channelTag = 'DC';\n } else if (file.metadata?.Channel === 'HuggingFace') {\n file.channelTag = 'HF';\n } else if (file.metadata?.Channel === 'WebDAV') {\n file.channelTag = 'WD';\n } else if (file.metadata?.Channel === 'External') {\n file.channelTag = this.$t('dashboard.externalTag');\n } else {\n file.channelTag = this.$t('dashboard.unknownTag');\n }\n });\n return data;\n },\n sortIcon() {\n return this.sortOption === 'dateDesc' ? 'sort-amount-down' : 'sort-alpha-up';\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n detailDialogWidth() {\n return window.innerWidth > 768 ? '70%' : '90%';\n },\n accessType() {\n if (this.detailFile?.metadata?.ListType === 'White') {\n return this.$t('filter.normal');\n } else if (this.detailFile?.metadata?.ListType === 'Block' || this.detailFile?.metadata?.Label === 'adult') {\n return this.$t('filter.blocked');\n } else {\n return this.$t('filter.normal');\n }\n },\n allUrl() {\n // 外链图片均采用外链\n if (this.detailFile?.metadata?.Channel === 'External') {\n return {\n 'originUrl': `${this.detailFile?.metadata?.ExternalLink}`,\n 'mdUrl': `![${this.detailFile?.metadata?.FileName || this.detailFile?.name}](${this.detailFile?.metadata?.ExternalLink})`,\n 'htmlUrl': `\"${this.detailFile?.metadata?.FileName`,\n 'bbUrl': `[img]${this.detailFile?.metadata?.ExternalLink}[/img]`,\n 'tgId': this.detailFile?.metadata?.TgFileId || this.$t('fileDetail.unknown'),\n 'S3Location': this.detailFile?.metadata?.S3Location || this.$t('fileDetail.unknown'),\n 'S3CdnFileUrl': this.detailFile?.metadata?.S3CdnFileUrl || this.$t('fileDetail.unknown')\n };\n } else {\n return {\n 'originUrl': `${this.rootUrl}${this.detailFile?.name}`,\n 'mdUrl': `![${this.detailFile?.metadata?.FileName || this.detailFile?.name}](${this.rootUrl}${this.detailFile?.name})`,\n 'htmlUrl': `\"${this.detailFile?.metadata?.FileName`,\n 'bbUrl': `[img]${this.rootUrl}${this.detailFile?.name}[/img]`,\n 'tgId': this.detailFile?.metadata?.TgFileId || this.$t('fileDetail.unknown'),\n 'S3Location': this.detailFile?.metadata?.S3Location || this.$t('fileDetail.unknown'),\n 'S3CdnFileUrl': this.detailFile?.metadata?.S3CdnFileUrl || this.$t('fileDetail.unknown')\n };\n }\n },\n tableColumnNum() {\n return window.innerWidth > 768 ? 3 : 1;\n },\n tablePreviewSpan() {\n return window.innerWidth > 768 ? 2 : 1;\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n selectPage() {\n // 如果当前页所有文件都被选中,则返回 true,否则返回 false\n return this.paginatedTableData.every(file => file.selected);\n },\n selectedPageFiles() {\n // 如果当前页有文件被选中,则返回 true,否则返回 false\n return this.paginatedTableData.some(file => file.selected);\n },\n selectPageIcon() {\n // 全选为 true 时,返回 check-square;部分选中为 minus-square;全不选为 square\n return this.selectPage ? 'check-square' : this.selectedPageFiles ? 'minus-square' : 'square';\n },\n rootUrl() {\n // 链接前缀,优先级:用户自定义 > urlPrefix > 默认\n return this.useCustomUrl === 'true' ? this.customUrlPrefix : this.userConfig?.urlPrefix || `${document.location.origin}/file/`;\n },\n isSelectAll: {\n get() {\n return this.paginatedTableData.length > 0 && this.paginatedTableData.every(file => file.selected);\n },\n set(val) {\n this.paginatedTableData.forEach(file => file.selected = val);\n }\n },\n isIndeterminate() {\n const selectedCount = this.paginatedTableData.filter(file => file.selected).length;\n return selectedCount > 0 && selectedCount < this.paginatedTableData.length;\n },\n pagerCount() {\n return window.innerWidth < 768 ? 5 : 7;\n }\n },\n watch: {\n // Sync viewMode data property to the ref used by useDragSelect\n viewMode: {\n handler(newVal) {\n this.viewModeRef = newVal;\n },\n immediate: true\n },\n // Sync paginatedTableData computed property to the ref used by useDragSelect\n paginatedTableData: {\n handler(newVal) {\n this.itemsRef = newVal;\n },\n immediate: true\n },\n tableData: {\n handler(newData) {\n // selectedFiles 增加 newData中新选中,不包含在 selectedFiles 中的文件\n this.selectedFiles = this.selectedFiles.concat(newData.filter(file => file.selected && !this.selectedFiles.includes(file)));\n // selectedFiles 删掉 newData 中已取消选中的文件\n this.selectedFiles = this.selectedFiles.filter(file => file.selected);\n // selectedFiles 删掉 tableData 中已删除的文件\n this.selectedFiles = this.selectedFiles.filter(file => newData.includes(file));\n },\n deep: true\n },\n sortOption(newOption) {\n localStorage.setItem('sortOption', newOption);\n },\n defaultUrlFormat(newFormat) {\n localStorage.setItem('defaultUrlFormat', newFormat);\n },\n showdetailDialog(newVal) {\n if (newVal) {\n this.activeUrlTab = this.defaultUrlFormat || 'originUrl';\n }\n },\n customUrlPrefix(val) {\n this.$store.commit('setAdminUrlSettings', {\n key: 'customUrlPrefix',\n value: val\n });\n },\n useCustomUrl(val) {\n this.$store.commit('setAdminUrlSettings', {\n key: 'useCustomUrl',\n value: val\n });\n },\n currentPath(val) {\n // 页面切换时,取消选择的内容\n this.tableData.forEach(file => file.selected = false);\n }\n },\n methods: {\n // 切换视图模式\n toggleViewMode() {\n this.viewMode = this.viewMode === 'card' ? 'list' : 'card';\n localStorage.setItem('viewMode', this.viewMode);\n },\n // 列表视图全选当前页\n handleSelectAllPage(val) {\n this.paginatedTableData.forEach(file => file.selected = val);\n },\n // 移动端长按开始\n handleTouchStart(item, index) {\n this.longPressTimer = setTimeout(() => {\n this.mobileActionFile = item;\n this.mobileActionIndex = index;\n this.mobileActionIsFolder = false;\n this.showMobileActionModal = true;\n }, 500); // 500ms 长按触发\n },\n // 移动端长按结束/取消\n handleTouchEnd() {\n if (this.longPressTimer) {\n clearTimeout(this.longPressTimer);\n this.longPressTimer = null;\n }\n },\n // 文件夹长按开始\n handleFolderTouchStart(item, index) {\n this.longPressTimer = setTimeout(() => {\n this.mobileActionFile = item;\n this.mobileActionIndex = index;\n this.mobileActionIsFolder = true;\n this.showMobileActionModal = true;\n }, 500);\n },\n // 处理移动端操作\n handleMobileAction(action) {\n const file = this.mobileActionFile;\n const index = this.mobileActionIndex;\n this.showMobileActionModal = false;\n if (!file) return;\n switch (action) {\n case 'detail':\n this.openDetailDialog(index, file.name);\n break;\n case 'copy':\n this.handleCopy(index, file.name);\n break;\n case 'folderCopy':\n this.handleFolderCopy(file.name);\n break;\n case 'download':\n this.handleDownload(file.name);\n break;\n case 'move':\n this.handleMove(index, file.name);\n break;\n case 'delete':\n this.handleDelete(index, file.name);\n break;\n case 'tag':\n this.handleTagManagement(file.name);\n break;\n }\n },\n // 返回上一级目录\n handleGoBack() {\n const pathParts = this.currentPath.split('/').filter(Boolean);\n if (pathParts.length > 0) {\n pathParts.pop();\n const parentPath = pathParts.join('/');\n this.navigateToFolder(parentPath);\n }\n this.showMobileDirectoryDrawer = false;\n },\n // 获取标签颜色\n getTagColor(index) {\n const colors = ['linear-gradient(135deg, #667eea 0%, #764ba2 100%)', 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)', 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)', 'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)', 'linear-gradient(135deg, #fa709a 0%, #fee140 100%)', 'linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)'];\n return colors[index % colors.length];\n },\n // 视频hover播放控制\n handleVideoHover(event, isEnter) {\n const video = event.target;\n if (isEnter) {\n video.play().catch(() => {});\n } else {\n video.pause();\n video.currentTime = 0;\n }\n },\n // 格式化文件大小\n formatFileSize(bytes) {\n if (!bytes || bytes === 0) return '-';\n bytes = Number(bytes);\n if (isNaN(bytes)) return '-';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (bytes >= 1024 && i < units.length - 1) {\n bytes /= 1024;\n i++;\n }\n return bytes.toFixed(i > 0 ? 1 : 0) + ' ' + units[i];\n },\n handleSearch() {\n this.search = this.tempSearch;\n this.isSearchMode = this.search.trim() !== '';\n this.currentPage = 1; // 重置到第一页\n\n // 解析搜索字符串,提取标签和关键字\n // 支持 #tag 表示包含标签,-#tag 表示排除标签\n if (this.search && this.search.trim()) {\n const includeTags = [];\n const excludeTags = [];\n\n // 匹配 -#tag 和 #tag\n let searchText = this.search;\n\n // 先匹配排除标签 -#tag\n const excludeTagRegex = /-#([\\w\\u4e00-\\u9fa5\\u3040-\\u309f\\u30a0-\\u30ff\\uac00-\\ud7af\\.\\+\\-]+)/g;\n searchText = searchText.replace(excludeTagRegex, (match, tag) => {\n excludeTags.push(tag.toLowerCase());\n return ' ';\n });\n\n // 再匹配包含标签 #tag\n const includeTagRegex = /#([\\w\\u4e00-\\u9fa5\\u3040-\\u309f\\u30a0-\\u30ff\\uac00-\\ud7af\\.\\+\\-]+)/g;\n searchText = searchText.replace(includeTagRegex, (match, tag) => {\n includeTags.push(tag.toLowerCase());\n return ' ';\n });\n\n // 清理剩余的关键字(去除多余空格)\n this.searchKeywords = searchText.replace(/\\s+/g, ' ').trim();\n\n // 构建标签查询字符串\n this.searchIncludeTags = includeTags.join(',');\n this.searchExcludeTags = excludeTags.join(',');\n console.log('Search keywords:', this.searchKeywords);\n console.log('Include tags:', this.searchIncludeTags);\n console.log('Exclude tags:', this.searchExcludeTags);\n } else {\n this.searchKeywords = '';\n this.searchIncludeTags = '';\n this.searchExcludeTags = '';\n }\n this.refreshFileList();\n },\n // 处理筛选变化(来自 FilterDropdown 组件)\n handleFilterChange({\n type,\n filters\n }) {\n this.filters = filters;\n this.currentPage = 1; // 重置到第一页\n this.refreshFileList();\n },\n // 清除所有筛选条件\n clearFilters() {\n this.filters = {\n listType: [],\n label: [],\n fileType: [],\n channel: [],\n channelName: []\n };\n this.currentPage = 1;\n this.refreshFileList();\n },\n // 从 API 获取所有渠道名称\n async extractChannelNames() {\n try {\n const response = await fetchWithAuth('/api/channels?includeDisabled=true', {\n method: 'GET'\n });\n if (response.ok) {\n const channels = await response.json();\n const channelOptions = [];\n\n // 类型映射(显示名称)\n const typeLabels = {\n telegram: 'Telegram',\n cfr2: 'Cloudflare R2',\n s3: 'S3',\n discord: 'Discord',\n huggingface: 'HuggingFace',\n webdav: 'WebDAV'\n };\n\n // 按类型提取渠道名称,channel.type是类型内部存储名称(可能根据版本有变化),type是类型对外名称\n Object.entries(channels).forEach(([type, channelList]) => {\n if (Array.isArray(channelList) && channelList.length > 0) {\n channelList.forEach(channel => {\n if (channel.name) {\n channelOptions.push({\n name: channel.name,\n type: channel.type,\n typeLabel: typeLabels[type] || type,\n // 使用 channel.type:channel.name 作为唯一标识\n value: `${channel.type}:${channel.name}`\n });\n }\n });\n }\n });\n\n // 按类型和名称排序\n channelOptions.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type.localeCompare(b.type);\n }\n return a.name.localeCompare(b.name);\n });\n this.channelNameOptions = channelOptions;\n }\n } catch (error) {\n console.error('Failed to fetch channel names:', error);\n }\n },\n handleDownload(key) {\n const link = document.createElement('a');\n link.href = this.getFileLink(key);\n link.download = key;\n link.click();\n },\n openDetailDialog(index, key) {\n this.detailFile = this.paginatedTableData[index];\n this.showdetailDialog = true;\n },\n handleTabClick(tab) {\n this.activeUrlTab = tab.props.name;\n },\n handleUrlClick(event) {\n // 复制到剪贴板\n navigator.clipboard.writeText(event.target.value).then(() => {\n this.$message({\n type: 'success',\n message: this.$t('dashboard.copySuccess')\n });\n }).catch(() => {\n this.$message({\n type: 'error',\n message: this.$t('dashboard.copyFailed')\n });\n });\n },\n handleDetailDelete(key) {\n this.$confirm(this.$t('dashboard.deleteConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n fetchWithAuth(`/api/manage/delete/${key}`, {\n method: 'GET'\n }).then(response => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === key);\n if (fileIndex !== -1) {\n this.tableData.splice(fileIndex, 1);\n }\n } else {\n return Promise.reject('Request failed');\n }\n }).then(() => {\n this.updateStats(-1, false);\n this.$message.success(this.$t('dashboard.deleteSuccess'));\n this.showdetailDialog = false;\n }).catch(() => this.$message.error(this.$t('dashboard.deleteFailed')));\n }).catch(() => console.log('Delete cancelled'));\n },\n handleBlock(key) {\n this.$confirm(this.$t('dashboard.blockConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n fetchWithAuth(`/api/manage/block/${key}`, {\n method: 'GET'\n }).then(response => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === key);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].metadata.ListType = 'Block';\n }\n } else {\n return Promise.reject('Request failed');\n }\n }).then(() => {\n this.$message.success(this.$t('dashboard.blockSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.blockFailed')));\n }).catch(() => console.log('Block cancelled'));\n },\n handleWhite(key) {\n this.$confirm(this.$t('dashboard.whiteConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n fetchWithAuth(`/api/manage/white/${key}`, {\n method: 'GET'\n }).then(response => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === key);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].metadata.ListType = 'White';\n }\n } else {\n return Promise.reject('Request failed');\n }\n }).then(() => {\n this.$message.success(this.$t('dashboard.whiteSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.whiteFailed')));\n }).catch(() => console.log('White cancelled'));\n },\n handleDelete(index, key) {\n // 判断是否为文件夹\n const isFolder = this.tableData.find(file => file.name === key).isFolder;\n this.$confirm(isFolder ? this.$t('dashboard.deleteFolderConfirm') : this.$t('dashboard.deleteFileConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n fetchWithAuth(`/api/manage/delete/${key}?folder=${isFolder}`, {\n method: 'GET'\n }).then(response => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === key);\n if (fileIndex !== -1) {\n this.tableData.splice(fileIndex, 1);\n }\n } else {\n return Promise.reject('Request failed');\n }\n }).then(() => {\n this.updateStats(-1, false);\n fileManager.removeFile(key);\n this.$message.success(this.$t('dashboard.deleteSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.deleteFailed')));\n }).catch(() => console.log('Delete cancelled'));\n },\n handleBatchDelete() {\n this.$confirm(this.$t('dashboard.batchDeleteConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n const promises = this.selectedFiles.map(file => {\n const isFolder = file.isFolder;\n return fetchWithAuth(`/api/manage/delete/${file.name}?folder=${isFolder}`, {\n method: 'GET'\n });\n });\n Promise.all(promises).then(results => {\n let successNum = 0;\n results.forEach((response, index) => {\n if (response.ok) {\n successNum++;\n const fileIndex = this.tableData.findIndex(file => file.name === this.selectedFiles[index].name);\n if (fileIndex !== -1) {\n this.tableData.splice(fileIndex, 1);\n }\n fileManager.removeFile(this.selectedFiles[index].name);\n }\n });\n this.selectedFiles = [];\n this.updateStats(-successNum, false);\n this.$message.success(this.$t('dashboard.batchDeleteSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.batchDeleteFailed')));\n }).catch(() => console.log('Batch delete cancelled'));\n },\n async handleBatchCopy() {\n // 分离文件和文件夹\n const files = this.selectedFiles.filter(item => !item.isFolder);\n const folders = this.selectedFiles.filter(item => item.isFolder);\n\n // 如果有文件夹,显示加载状态\n let loading = null;\n if (folders.length > 0) {\n loading = this.$loading({\n lock: true,\n text: this.$t('dashboard.fetchingFileList')\n });\n }\n try {\n // 收集所有文件(包括文件夹内的文件)\n let allFiles = [...files];\n\n // 递归获取所有文件夹内的文件\n for (const folder of folders) {\n try {\n const response = await fetchWithAuth(`/api/manage/list?dir=${encodeURIComponent(folder.name)}&recursive=true&count=-1`, {\n method: 'GET'\n });\n const data = await response.json();\n if (data.files && data.files.length > 0) {\n allFiles = allFiles.concat(data.files);\n }\n } catch (error) {\n console.error(`获取文件夹 ${folder.name} 内容失败:`, error);\n }\n }\n if (loading) loading.close();\n if (allFiles.length === 0) {\n this.$message.warning(this.$t('dashboard.noLinksAvailable'));\n return;\n }\n\n // 生成所有链接\n const links = allFiles.map(file => {\n return this.generateFileLink(file.name, file.metadata);\n }).filter(link => link);\n if (links.length === 0) {\n this.$message.warning(this.$t('dashboard.noLinksAvailable'));\n return;\n }\n\n // 复制到剪贴板\n const text = links.join('\\n');\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(text);\n this.$message.success(this.$t('dashboard.batchCopySuccess', {\n count: links.length\n }));\n } else {\n this.copyToClipboardFallback(text);\n }\n } catch (error) {\n if (loading) loading.close();\n console.error('Batch copy failed:', error);\n this.$message.error(this.$t('dashboard.batchCopyFailed'));\n }\n },\n copyToClipboardFallback(text) {\n const textarea = document.createElement('textarea');\n document.body.appendChild(textarea);\n textarea.style.position = 'fixed';\n textarea.style.clip = 'rect(0 0 0 0)';\n textarea.style.top = '10px';\n textarea.value = text;\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n this.$message.success(this.$t('dashboard.batchCopyLinksSuccess'));\n },\n handleCopy(index, key) {\n let text = '';\n if (this.paginatedTableData[index].metadata?.Channel === 'External') {\n switch (this.defaultUrlFormat) {\n case 'originUrl':\n text = this.paginatedTableData[index].metadata?.ExternalLink;\n break;\n case 'mdUrl':\n text = `![${this.paginatedTableData[index].metadata?.FileName || key}](${this.paginatedTableData[index].metadata?.ExternalLink})`;\n break;\n case 'htmlUrl':\n text = `\"${this.paginatedTableData[index].metadata?.FileName`;\n break;\n case 'bbUrl':\n text = `[img]${this.paginatedTableData[index].metadata?.ExternalLink}[/img]`;\n break;\n case 'tgId':\n text = this.paginatedTableData[index].metadata?.TgFileId || 'none';\n break;\n case 's3Location':\n text = this.paginatedTableData[index].metadata?.S3Location || 'none';\n break;\n }\n } else {\n switch (this.defaultUrlFormat) {\n case 'originUrl':\n text = `${this.rootUrl}${key}`;\n break;\n case 'mdUrl':\n text = `![${this.paginatedTableData[index].metadata?.FileName || key}](${this.rootUrl}${key})`;\n break;\n case 'htmlUrl':\n text = `\"${this.paginatedTableData[index].metadata?.FileName`;\n break;\n case 'bbUrl':\n text = `[img]${this.rootUrl}${key}[/img]`;\n break;\n case 'tgId':\n text = this.paginatedTableData[index].metadata?.TgFileId || 'none';\n break;\n case 's3Location':\n text = this.paginatedTableData[index].metadata?.S3Location || 'none';\n break;\n }\n }\n navigator.clipboard ? navigator.clipboard.writeText(text).then(() => this.$message.success(this.$t('dashboard.copyFileLinkSuccess'))) : this.copyToClipboardFallback(text);\n },\n async loadMoreData() {\n this.loading = true;\n try {\n // 传递标签参数和筛选参数到后端\n await fileManager.loadMoreFiles(this.currentPath, this.searchKeywords, this.searchIncludeTags, this.searchExcludeTags, 60, this.filters);\n // 获取新的文件列表后\n await this.fetchFileList();\n } catch (error) {\n this.$message.error(this.$t('dashboard.loadMoreFailed'));\n } finally {\n this.loading = false;\n }\n },\n updateStats(num, init = false) {\n if (init) {\n this.Number = num;\n } else {\n this.Number += num;\n }\n },\n sort(command) {\n this.sortOption = command;\n },\n sortData(data) {\n // 文件夹始终在前\n const folders = data.filter(file => file.isFolder);\n const files = data.filter(file => !file.isFolder);\n if (this.sortOption === 'dateDesc') {\n // 按时间降序\n folders.sort((a, b) => new Date(b.metadata?.TimeStamp) - new Date(a.metadata?.TimeStamp));\n files.sort((a, b) => new Date(b.metadata?.TimeStamp) - new Date(a.metadata?.TimeStamp));\n } else {\n // 按文件名升序\n folders.sort((a, b) => a.name.localeCompare(b.name));\n files.sort((a, b) => a.name.localeCompare(b.name));\n }\n return folders.concat(files);\n },\n handleVideoClick(event) {\n const videoElement = event.target;\n if (videoElement.requestFullscreen) {\n videoElement.requestFullscreen();\n } else if (videoElement.webkitRequestFullscreen) {\n // Safari/Old Chrome\n videoElement.webkitRequestFullscreen();\n } else if (videoElement.mozRequestFullScreen) {\n // Firefox\n videoElement.mozRequestFullScreen();\n } else if (videoElement.msRequestFullscreen) {\n // IE/Edge\n videoElement.msRequestFullscreen();\n }\n },\n handleLogout() {\n const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n handleSelectPage() {\n if (this.selectPage) {\n this.paginatedTableData.forEach(file => file.selected = false);\n } else {\n this.paginatedTableData.forEach(file => file.selected = true);\n }\n },\n clearSelection() {\n this.tableData.forEach(file => file.selected = false);\n this.selectedFiles = [];\n },\n handleBatchAction(command) {\n if (command === 'copy') {\n this.handleBatchCopy();\n } else if (command === 'delete') {\n this.handleBatchDelete();\n } else if (command === 'download') {\n this.handleBatchDownload();\n } else if (command === 'move') {\n this.handleBatchMove();\n } else if (command === 'tagManagement') {\n this.handleBatchTagManagement();\n } else if (command === 'ban') {\n this.handleBatchBlock();\n } else if (command === 'white') {\n this.handleBatchWhite();\n }\n },\n handleMove(index, key) {\n // 打开自定义移动对话框\n this.moveFileKey = key;\n this.moveFileIndex = index;\n this.isBatchMove = false;\n this.moveTargetPath = '/';\n this.showMoveDialog = true;\n },\n handleBatchMove() {\n // 打开自定义移动对话框(批量模式)\n this.isBatchMove = true;\n this.moveTargetPath = '/';\n this.showMoveDialog = true;\n },\n // 确认移动操作\n confirmMove(targetPath) {\n const value = targetPath;\n // 使用共享验证器验证路径\n const validation = validateFolderPath(value);\n if (!validation.valid) {\n this.$message.error(validation.error);\n return;\n }\n // 去掉开头的 /,结尾若没有 /,则加上\n const newPath = value.replace(/^\\/+/, '') + (value.endsWith('/') ? '' : value === '' ? '' : '/');\n // 判断目标文件夹是否是当前文件夹\n if (newPath === this.currentPath) {\n this.$message.warning(this.$t('dashboard.moveTargetSameAsCurrent'));\n return;\n }\n\n // 关闭对话框\n this.showMoveDialog = false;\n if (this.isBatchMove) {\n // 批量移动\n this.executeBatchMove(newPath);\n } else {\n // 单个文件移动\n this.executeSingleMove(newPath);\n }\n },\n // 执行单个文件移动\n executeSingleMove(newPath) {\n const key = this.moveFileKey;\n const isFolder = this.tableData.find(file => file.name === key)?.isFolder;\n fetchWithAuth(`/api/manage/move/${key}?folder=${isFolder}&dist=${encodeURIComponent(newPath)}`, {\n method: 'GET'\n }).then(response => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === key);\n if (fileIndex !== -1) {\n // 更新本地文件管理器\n const newKey = newPath + key.split('/').pop();\n fileManager.moveFile(key, newKey, isFolder, this.currentPath);\n // 移除文件\n this.tableData.splice(fileIndex, 1);\n // 强制重新渲染内容\n this.$nextTick(() => {\n const tempData = [...this.tableData];\n this.tableData = [];\n this.$nextTick(() => {\n this.tableData = tempData;\n });\n });\n }\n this.updateStats(-1, false);\n this.$message.success(this.$t('dashboard.moveSuccess'));\n } else {\n return Promise.reject('Request failed');\n }\n }).then(() => {\n this.refreshLocalFileList();\n }).catch(() => this.$message.error(this.$t('dashboard.moveFailed')));\n },\n // 执行批量移动\n executeBatchMove(newPath) {\n const promises = this.selectedFiles.map(file => {\n const isFolder = file.isFolder;\n return fetchWithAuth(`/api/manage/move/${file.name}?folder=${isFolder}&dist=${encodeURIComponent(newPath)}`, {\n method: 'GET'\n });\n });\n Promise.all(promises).then(results => {\n let successNum = 0;\n results.forEach((response, index) => {\n if (response.ok) {\n successNum++;\n const file = this.selectedFiles[index];\n file.selected = false;\n const fileIndex = this.tableData.findIndex(f => f.name === file.name);\n if (fileIndex !== -1) {\n // 更新本地文件管理器\n const newKey = newPath + file.name.split('/').pop();\n fileManager.moveFile(file.name, newKey, file.isFolder, this.currentPath);\n // 移除文件\n this.tableData.splice(fileIndex, 1);\n }\n }\n });\n // 强制重新渲染内容\n this.$nextTick(() => {\n const tempData = [...this.tableData];\n this.tableData = [];\n this.$nextTick(() => {\n this.tableData = tempData;\n });\n });\n this.updateStats(-successNum, false);\n this.$message.success(this.$t('dashboard.moveSuccess'));\n }).then(() => {\n this.refreshLocalFileList();\n }).catch(() => this.$message.error(this.$t('dashboard.moveFailed')));\n },\n handleBatchBlock() {\n this.$confirm(this.$t('dashboard.batchBlockConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n // 跳过文件夹\n const promises = this.selectedFiles.map(file => {\n if (file.isFolder) {\n return Promise.resolve({\n ok: false\n });\n }\n return fetchWithAuth(`/api/manage/block/${file.name}`, {\n method: 'GET'\n });\n });\n Promise.all(promises).then(results => {\n results.forEach((response, index) => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === this.selectedFiles[index].name);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].metadata.ListType = 'Block';\n }\n }\n });\n this.$message.success(this.$t('dashboard.batchBlockSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.batchBlockFailed')));\n }).catch(() => console.log('Batch block cancelled'));\n },\n handleBatchWhite() {\n this.$confirm(this.$t('dashboard.batchWhiteConfirm'), this.$t('dashboard.deleteConfirmTitle'), {\n confirmButtonText: this.$t('dashboard.deleteConfirmOk'),\n cancelButtonText: this.$t('dashboard.deleteConfirmCancel'),\n type: 'warning'\n }).then(() => {\n // 跳过文件夹\n const promises = this.selectedFiles.map(file => {\n if (file.isFolder) {\n return Promise.resolve({\n ok: false\n });\n }\n return fetchWithAuth(`/api/manage/white/${file.name}`, {\n method: 'GET'\n });\n });\n Promise.all(promises).then(results => {\n results.forEach((response, index) => {\n if (response.ok) {\n const fileIndex = this.tableData.findIndex(file => file.name === this.selectedFiles[index].name);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].metadata.ListType = 'White';\n }\n }\n });\n this.$message.success(this.$t('dashboard.batchWhiteSuccess'));\n }).catch(() => this.$message.error(this.$t('dashboard.batchWhiteFailed')));\n }).catch(() => console.log('Batch white cancelled'));\n },\n handleBatchDownload() {\n // 将选中文件打包成 zip 文件下载\n const zip = new JSZip();\n const folder = zip.folder('files');\n // 构造Promise数组,等待所有文件下载完成后再打包\n const fileNameCount = {}; // 用于跟踪文件名出现的次数\n\n const downloadPromises = this.selectedFiles.map(async file => {\n // 跳过文件夹\n if (file.isFolder) {\n return;\n }\n const response = await fetch(this.getFileLink(file.name));\n const blob = await response.blob();\n // 检查文件名是否已经存在\n let fileName = file.metadata?.FileName || file.name;\n if (fileNameCount[fileName]) {\n // 如果已经存在,则在文件名后加上编号\n const extension = fileName.substring(fileName.lastIndexOf('.'));\n const baseName = fileName.substring(0, fileName.lastIndexOf('.'));\n fileName = `${baseName}(${fileNameCount[fileName]})${extension}`;\n fileNameCount[file.name]++;\n } else {\n // 如果不存在,则初始化为1\n fileNameCount[fileName] = 1;\n }\n // 将文件添加到 zip 文件夹中\n folder.file(fileName, blob);\n });\n Promise.all(downloadPromises).then(() => zip.generateAsync({\n type: 'blob'\n })).then(blob => {\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = 'files.zip';\n link.click();\n });\n },\n isVideo(file) {\n // 排除音频文件\n if (this.isAudio(file)) return false;\n let flag = file.metadata?.FileType?.includes('video');\n // 用文件名后缀判断是否为视频文件\n if (!flag) {\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'rmvb', '3gp', 'mpg', 'mpeg', 'm4v', 'f4v', 'rm', 'asf', 'dat', 'ts', 'vob', 'swf', 'divx', 'xvid', 'm2ts', 'mts', 'm2v', '3g2', '3gp2', '3gpp', '3gpp2', 'mpe', 'm1v', 'mpv', 'mpv2', 'mp2v', 'm2t', 'm2ts', 'm2v', 'm4v'];\n const extension = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();\n flag = videoExtensions.includes(extension);\n }\n return flag;\n },\n isAudio(file) {\n let flag = file.metadata?.FileType?.includes('audio');\n // 用文件名后缀判断是否为音频文件\n if (!flag) {\n const audioExtensions = ['mp3', 'wav', 'flac', 'aac', 'ogg', 'wma', 'm4a', 'ape', 'aiff', 'alac', 'opus', 'mid', 'midi', 'm4b', 'm4p', 'm4r', 'amr', 'au', 'ra', 'ram'];\n const extension = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();\n flag = audioExtensions.includes(extension);\n }\n return flag;\n },\n isImage(file) {\n let flag = file.metadata?.FileType?.includes('image');\n // 用文件名后缀判断是否为图片文件\n if (!flag) {\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'psd', 'ai', 'eps', 'raw', 'cr2', 'nef', 'orf', 'sr2', 'dng', 'arw', 'rw2', 'raf', 'pef', 'x3f', 'srf', 'erf', 'mrw', 'nrw', 'kdc', 'dcr', 'mef', 'mos', 'crw', 'raf', 'rwl', 'srw', '3fr', 'fff', 'iiq', 'qtk', 'bay', 'k25', 'kdc', 'dcs', 'drf', 'dng', 'erf', 'kdc', 'mdc', 'mef', 'mos', 'mrw', 'nef', 'nrw', 'orf', 'pef', 'ptx', 'pxn', 'r3d', 'raf', 'raw', 'rwl', 'rw2', 'rwz', 'sr2', 'srf', 'x3f'];\n const extension = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();\n flag = imageExtensions.includes(extension);\n }\n return flag;\n },\n getFileLink(filename) {\n const fileLink = process.env.NODE_ENV === 'production' ? `/file/${filename}?from=admin` : `/api/file/${filename}?from=admin`;\n return fileLink;\n },\n handlePageChange(page) {\n this.currentPage = page;\n // 到最后一页时,加载更多数据\n if (this.currentPage === Math.ceil(this.tableData.length / this.pageSize)) {\n this.loadMoreData();\n }\n },\n // 跳转到指定页码\n handleJumpPage() {\n const page = parseInt(this.jumpPage);\n if (isNaN(page) || page < 1) {\n this.$message.warning(this.$t('dashboard.invalidPageNumber'));\n return;\n }\n if (page > this.realTotalPages) {\n this.$message.warning(this.$t('dashboard.pageExceedsMax', {\n max: this.realTotalPages\n }));\n return;\n }\n // 如果目标页超过当前已加载的页数,需要先加载更多数据\n if (page > this.totalPages) {\n this.$message.info(this.$t('dashboard.loadingData'));\n this.loadMoreDataUntilPage(page);\n } else {\n this.currentPage = page;\n }\n this.jumpPage = '';\n },\n // 加载数据直到指定页\n async loadMoreDataUntilPage(targetPage) {\n this.loading = true;\n try {\n // 计算目标页需要的文件数量(不包含文件夹)\n // 目标页最后一个项目的索引 = targetPage * pageSize\n // 需要的文件数 = 目标索引 - 已有文件夹数量\n const targetIndex = targetPage * this.pageSize;\n const currentFolderCount = this.filteredTableData.filter(item => item.isFolder).length;\n const currentFileCount = this.filteredTableData.filter(item => !item.isFolder).length;\n\n // 需要加载的文件数量 = 目标位置需要的文件数 - 当前已加载的文件数\n const neededFileCount = Math.max(0, targetIndex - currentFolderCount - currentFileCount);\n if (neededFileCount > 0) {\n await fileManager.loadMoreFiles(this.currentPath, this.searchKeywords, this.searchIncludeTags, this.searchExcludeTags, neededFileCount, this.filters);\n await this.fetchFileList();\n }\n this.currentPage = Math.min(targetPage, this.totalPages);\n } catch (error) {\n this.$message.error(this.$t('dashboard.loadDataFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 判断是否为文件夹\n isFolder(item) {\n // 如果是已经标记为文件夹的项目,直接返回true\n if (item.isFolder) {\n return true;\n }\n\n // 获取真实的文件路径(去除URL前缀)\n let path = item.name;\n if (path.startsWith('http')) {\n path = path.split('/file/')[1];\n }\n\n // 如果文件名包含'/',需要判断是否是当前路径下的文件\n if (path && path.includes('/')) {\n // 获取相对于当前路径的部分\n const relativePath = this.currentPath ? path.substring(this.currentPath.length) : path;\n\n // 如果在根目录,第一个斜杠前的部分就是文件夹\n if (this.currentPath === '') {\n return !path.split('/')[0].includes('.');\n }\n\n // 如果在子文件夹中,检查相对路径是否还包含其他文件夹\n return relativePath.includes('/');\n }\n return false;\n },\n // 获取文件夹名称\n getFolderName(path) {\n let folderName = '';\n // 如果是文件夹路径,只返回最后一级文件夹名\n if (path && path.includes('/')) {\n const parts = path.split('/');\n // 如果是根目录下的文件夹\n if (this.currentPath === '') {\n folderName = parts[0];\n } else {\n // 如果是子文件夹\n const relativePath = path.substring(this.currentPath.length);\n folderName = relativePath.split('/')[0];\n }\n } else {\n folderName = path;\n }\n const maxLength = 20; // Adjust max length as needed\n if (folderName.length > maxLength) {\n const startLength = Math.floor((maxLength - 3) / 2);\n const endLength = Math.ceil((maxLength - 3) / 2);\n return `${folderName.substring(0, startLength)}...${folderName.substring(folderName.length - endLength)}`;\n }\n return folderName;\n },\n // 获取文件名称(去除路径和URL前缀)\n getFileName(path) {\n let fileName = path.split('/').pop();\n const maxLength = 20; // Adjust max length as needed, ensure it fits in one line\n if (fileName.length > maxLength) {\n const startLength = Math.floor((maxLength - 3) / 2);\n const endLength = Math.ceil((maxLength - 3) / 2);\n return `${fileName.substring(0, startLength)}...${fileName.substring(fileName.length - endLength)}`;\n }\n return fileName;\n },\n // 获取文件名前半部分(用于中间省略效果)\n getFileNameStart(name) {\n if (!name) return '';\n // 如果文件名较短,返回全部\n if (name.length <= 30) return name;\n // 保留开头部分(约60%的长度用于显示前半部分)\n const dotIndex = name.lastIndexOf('.');\n if (dotIndex > 0) {\n // 有扩展名的情况:返回文件名主体部分\n const baseName = name.substring(0, dotIndex);\n const keepLength = Math.min(baseName.length, Math.floor(name.length * 0.6));\n return baseName.substring(0, keepLength);\n }\n // 无扩展名的情况\n return name.substring(0, Math.floor(name.length * 0.6));\n },\n // 获取文件名后半部分(用于中间省略效果)\n getFileNameEnd(name) {\n if (!name) return '';\n // 如果文件名较短,返回空\n if (name.length <= 30) return '';\n // 保留末尾部分(包含扩展名)\n const dotIndex = name.lastIndexOf('.');\n if (dotIndex > 0) {\n // 有扩展名的情况:返回最后几个字符 + 扩展名\n const ext = name.substring(dotIndex);\n const baseName = name.substring(0, dotIndex);\n const keepLength = Math.min(8, Math.floor(baseName.length * 0.2));\n return '…' + baseName.substring(baseName.length - keepLength) + ext;\n }\n // 无扩展名的情况\n const keepLength = Math.min(10, Math.floor(name.length * 0.3));\n return '…' + name.substring(name.length - keepLength);\n },\n // 进入文件夹\n enterFolder(folderPath) {\n // 确保路径末尾有 '/'\n this.currentPath = folderPath + (folderPath.endsWith('/') ? '' : '/');\n // 刷新文件列表,到指定currentPath下\n this.refreshFileList();\n },\n // 导航到指定文件夹\n navigateToFolder(path) {\n // 确保空路径时不添加 '/'\n this.currentPath = path ? path + (path.endsWith('/') ? '' : '/') : '';\n // 刷新文件列表,到指定currentPath下\n this.refreshFileList();\n },\n // 获取文件列表\n async fetchFileList() {\n this.loading = true;\n try {\n // 从本地存储获取数据\n const data = fileManager.getLocalFileList();\n\n // 解析返回的数据\n const folders = new Set(data.directories || []);\n const files = data.files || [];\n\n // 处理文件夹数据\n const folderItems = Array.from(folders).map(folder => ({\n name: folder,\n isFolder: true,\n selected: false,\n metadata: {\n FileName: folder.split('/').pop()\n }\n }));\n\n // 处理文件数据\n const fileItems = files.map(file => ({\n name: file.name,\n isFolder: false,\n selected: false,\n metadata: file.metadata\n }));\n\n // 更新表格数据\n this.tableData = [...folderItems, ...fileItems];\n\n // 更新统计信息\n this.updateStats(data.totalCount, true);\n\n // 更新直接文件和文件夹数量\n this.directFileCount = data.directFileCount || 0;\n this.directFolderCount = data.directFolderCount || 0;\n } catch (error) {\n console.error('Error fetching file list:', error);\n this.$message.error(this.$t('dashboard.fetchFileListFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 刷新文件列表\n async refreshFileList() {\n this.refreshLoading = true;\n this.loading = true;\n try {\n // 传递标签参数和筛选参数到后端\n const success = await fileManager.refreshFileList(this.currentPath, this.searchKeywords, this.searchIncludeTags, this.searchExcludeTags, this.filters);\n if (success) {\n await this.fetchFileList();\n } else {\n throw new Error('Refresh failed');\n }\n } catch (error) {\n // 认证失败由 fetchWithAuth 统一处理跳转,不重复提示\n if (!error.message?.includes('Unauthorized') && this.$store.state.adminLoggedIn) {\n console.error('Error refreshing file list:', error);\n this.$message.error(this.$t('dashboard.refreshFailed'));\n }\n } finally {\n this.refreshLoading = false;\n this.loading = false;\n }\n },\n // 刷新本地文件列表\n async refreshLocalFileList() {\n this.refreshLoading = true;\n this.loading = true;\n try {\n await this.fetchFileList();\n } catch (error) {\n console.error('Error refreshing local file list:', error);\n this.$message.error(this.$t('dashboard.refreshFailed'));\n } finally {\n this.refreshLoading = false;\n this.loading = false;\n }\n },\n // Tag management methods\n handleTagManagement(fileId) {\n this.currentTagFile = fileId;\n this.showTagDialog = true;\n },\n handleBatchTagManagement() {\n if (this.selectedFiles.length === 0) {\n this.$message.warning(this.$t('dashboard.selectFilesFirst'));\n return;\n }\n this.showBatchTagDialog = true;\n },\n async handleTagsUpdated(tags) {\n // 更新本地文件数据中的标签\n const fileIndex = this.tableData.findIndex(file => file.name === this.currentTagFile);\n if (fileIndex !== -1) {\n // 更新 tableData 中的标签\n if (!this.tableData[fileIndex].metadata) {\n this.tableData[fileIndex].metadata = {};\n }\n this.tableData[fileIndex].metadata.Tags = tags;\n\n // 如果详情对话框正在显示这个文件,也更新详情数据\n if (this.showdetailDialog && this.detailFile?.name === this.currentTagFile) {\n if (!this.detailFile.metadata) {\n this.detailFile.metadata = {};\n }\n this.detailFile.metadata.Tags = tags;\n }\n }\n },\n async handleBatchTagsUpdated() {\n // 刷新文件列表以显示更新后的标签\n await this.refreshLocalFileList();\n },\n handleMetadataUpdated(fileId, updatedMetadata) {\n // 更新 tableData 中对应文件的 metadata\n const fileIndex = this.tableData.findIndex(f => f.name === fileId);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].metadata = {\n ...this.tableData[fileIndex].metadata,\n ...updatedMetadata\n };\n }\n // 如果 detailFile 正在显示该文件,同步更新 detailFile\n if (this.detailFile && this.detailFile.name === fileId) {\n this.detailFile.metadata = {\n ...this.detailFile.metadata,\n ...updatedMetadata\n };\n }\n },\n handleFileRenamed(oldFileId, newFileId, updatedMetadata) {\n // 更新 tableData 中对应文件的 name(File_ID)和 metadata\n const fileIndex = this.tableData.findIndex(f => f.name === oldFileId);\n if (fileIndex !== -1) {\n this.tableData[fileIndex].name = newFileId;\n this.tableData[fileIndex].metadata = {\n ...this.tableData[fileIndex].metadata,\n ...updatedMetadata\n };\n }\n // 更新 detailFile 引用并关闭/重新打开详情弹窗以刷新链接\n if (this.detailFile && this.detailFile.name === oldFileId) {\n this.detailFile.name = newFileId;\n this.detailFile.metadata = {\n ...this.detailFile.metadata,\n ...updatedMetadata\n };\n // 关闭详情弹窗,然后在下一个 tick 重新打开以刷新所有链接\n this.showdetailDialog = false;\n this.$nextTick(() => {\n this.showdetailDialog = true;\n });\n }\n },\n // 生成单个文件链接\n generateFileLink(key, metadata) {\n const isExternal = metadata?.Channel === 'External';\n const baseUrl = isExternal ? metadata?.ExternalLink : `${this.rootUrl}${key}`;\n const fileName = metadata?.FileName || key;\n switch (this.defaultUrlFormat) {\n case 'originUrl':\n return baseUrl;\n case 'mdUrl':\n return `![${fileName}](${baseUrl})`;\n case 'htmlUrl':\n return `\"${fileName}\"`;\n case 'bbUrl':\n return `[img]${baseUrl}[/img]`;\n case 'tgId':\n return metadata?.TgFileId || '';\n case 's3Location':\n return metadata?.S3Location || '';\n default:\n return baseUrl;\n }\n },\n // 复制文件夹中所有文件的链接\n async handleFolderCopy(folderName) {\n // 显示加载状态\n const loading = this.$loading({\n lock: true,\n text: this.$t('dashboard.fetchingFileList')\n });\n try {\n // 调用 list API 递归获取文件夹内所有文件\n const response = await fetchWithAuth(`/api/manage/list?dir=${encodeURIComponent(folderName)}&recursive=true&count=-1`, {\n method: 'GET'\n });\n const data = await response.json();\n loading.close();\n if (!data.files || data.files.length === 0) {\n this.$message.warning(this.$t('dashboard.folderEmptyNoLinks'));\n return;\n }\n\n // 根据当前链接格式生成所有文件链接\n const links = data.files.map(file => {\n return this.generateFileLink(file.name, file.metadata);\n }).filter(link => link);\n if (links.length === 0) {\n this.$message.warning(this.$t('dashboard.noLinksAvailable'));\n return;\n }\n\n // 复制到剪贴板\n const text = links.join('\\n');\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(text);\n this.$message.success(this.$t('dashboard.copiedFileLinks', {\n count: links.length\n }));\n } else {\n this.copyToClipboardFallback(text);\n this.$message.success(this.$t('dashboard.copiedFileLinks', {\n count: links.length\n }));\n }\n } catch (error) {\n loading.close();\n console.error('Copy folder links failed:', error);\n this.$message.error(this.$t('dashboard.copyFolderLinksFailed'));\n }\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n this.loading = true;\n // 路由守卫已通过 /api/auth/sessionCheck 验证认证状态\n this.showLogoutButton = this.$store.state.adminLoggedIn;\n // 首次加载时刷新文件列表\n this.refreshFileList().then(() => {\n // 获取所有渠道名称\n return this.extractChannelNames();\n }).catch(err => {\n if (err.message !== 'Unauthorized') {\n this.$message.error(this.$t('dashboard.syncDataError'));\n }\n }).finally(() => {\n this.loading = false;\n });\n\n // 读取自定义链接设置项\n this.customUrlPrefix = this.adminUrlSettings.customUrlPrefix;\n this.useCustomUrl = this.adminUrlSettings.useCustomUrl;\n\n // 恢复视图模式偏好\n const savedViewMode = localStorage.getItem('viewMode');\n if (savedViewMode === 'card' || savedViewMode === 'list') {\n this.viewMode = savedViewMode;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./AdminDashBoard.vue?vue&type=template&id=437b7a30&scoped=true\"\nimport script from \"./AdminDashBoard.vue?vue&type=script&lang=js\"\nexport * from \"./AdminDashBoard.vue?vue&type=script&lang=js\"\n\nimport \"./AdminDashBoard.vue?vue&type=style&index=0&id=437b7a30&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-437b7a30\"]])\n\nexport default __exports__","import { renderSlot as _renderSlot, withModifiers as _withModifiers, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-tree-picker\"\n};\nconst _hoisted_2 = {\n class: \"tree-container\"\n};\nconst _hoisted_3 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_4 = {\n class: \"error-text\"\n};\nconst _hoisted_5 = {\n class: \"node-label\"\n};\nconst _hoisted_6 = {\n class: \"tree-container\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_8 = {\n class: \"error-text\"\n};\nconst _hoisted_9 = {\n class: \"node-label\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tree = _resolveComponent(\"el-tree\");\n const _component_el_popover = _resolveComponent(\"el-popover\");\n const _component_el_drawer = _resolveComponent(\"el-drawer\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [$options.isDesktop ? (_openBlock(), _createBlock(_component_el_popover, {\n key: 0,\n visible: $data.popoverVisible,\n \"onUpdate:visible\": _cache[1] || (_cache[1] = $event => $data.popoverVisible = $event),\n placement: \"bottom-start\",\n width: 320,\n trigger: \"click\",\n \"popper-class\": \"directory-tree-popover\",\n \"show-arrow\": true,\n \"hide-after\": 0,\n \"show-after\": 50,\n transition: \"el-zoom-in-top\"\n }, {\n reference: _withCtx(() => [_createElementVNode(\"span\", {\n class: \"popover-trigger-wrapper\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"]))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)])]),\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_2, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_4, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRef\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 3\n }, 8, [\"visible\"])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createElementVNode(\"span\", {\n class: \"drawer-trigger-wrapper\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.openDrawer && $options.openDrawer(...args))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)]), _createVNode(_component_el_drawer, {\n modelValue: $data.drawerVisible,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.drawerVisible = $event),\n direction: \"btt\",\n size: \"60%\",\n \"show-close\": true,\n \"with-header\": true,\n \"z-index\": 3000,\n title: _ctx.$t('directoryTree.selectDirectory'),\n class: \"directory-tree-drawer\"\n }, {\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_6, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_8, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRefMobile\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree mobile-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_9, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 1\n }, 8, [\"modelValue\", \"title\"])], 64))]);\n}","import axios from '@/utils/axios';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'DirectoryTreePicker',\n props: {\n currentDirectory: {\n type: String,\n default: ''\n },\n source: {\n type: String,\n default: 'upload',\n validator: value => ['upload', 'admin'].includes(value)\n }\n },\n data() {\n return {\n popoverVisible: false,\n drawerVisible: false,\n treeData: [],\n loading: false,\n error: '',\n treeProps: {\n children: 'children',\n label: 'name'\n },\n windowWidth: window.innerWidth\n };\n },\n computed: {\n isDesktop() {\n return this.windowWidth >= 769;\n }\n },\n watch: {\n popoverVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 弹窗关闭后延迟折叠所有节点,避免下次打开时出现折叠动画\n setTimeout(() => {\n if (!this.popoverVisible && this.$refs.treeRef) {\n const store = this.$refs.treeRef.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 200);\n }\n },\n drawerVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 抽屉关闭后延迟折叠所有节点\n setTimeout(() => {\n if (!this.drawerVisible && this.$refs.treeRefMobile) {\n const store = this.$refs.treeRefMobile.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 300);\n }\n },\n currentDirectory(newVal) {\n this.$nextTick(() => {\n if (this.$refs.treeRef && newVal) {\n this.$refs.treeRef.setCurrentKey(newVal);\n }\n if (this.$refs.treeRefMobile && newVal) {\n this.$refs.treeRefMobile.setCurrentKey(newVal);\n }\n });\n }\n },\n mounted() {\n window.addEventListener('resize', this.handleResize);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.handleResize);\n },\n methods: {\n handleResize() {\n this.windowWidth = window.innerWidth;\n },\n openDrawer() {\n this.drawerVisible = true;\n },\n async fetchDirectoryTree() {\n this.loading = true;\n this.error = '';\n try {\n let data;\n if (this.source === 'admin') {\n const response = await fetchWithAuth('/api/directoryTree', {\n method: 'GET'\n });\n if (!response.ok) {\n if (response.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.serverError');\n }\n return;\n }\n data = await response.json();\n } else {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n data = response.data;\n }\n if (data.tree) {\n this.treeData = [data.tree];\n } else {\n this.treeData = [];\n }\n } catch (err) {\n console.error('Failed to fetch directory tree:', err);\n if (err.response?.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.loadFailed');\n }\n } finally {\n this.loading = false;\n }\n },\n handleNodeClick(data) {\n let path = data.path;\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n } else if (!path) {\n path = '/';\n }\n this.$emit('select', path);\n this.popoverVisible = false;\n this.drawerVisible = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectoryTreePicker.vue?vue&type=template&id=62eab69a&scoped=true\"\nimport script from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\nexport * from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\n\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=0&id=62eab69a&scoped=true&lang=css\"\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=1&id=62eab69a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-62eab69a\"]])\n\nexport default __exports__","/*!\n\nJSZip v3.10.1 - A JavaScript class for generating and reading zip files\n\n\n(c) 2009-2016 Stuart Knightley \nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/main/LICENSE\n*/\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,h){function u(r,e){if(!o[r]){if(!a[r]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(r,!0);if(l)return l(r,!0);var n=new Error(\"Cannot find module '\"+r+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return u(t||e)},i,i.exports,s,a,o,h)}return o[r].exports}for(var l=\"function\"==typeof require&&require,e=0;e>2,s=(3&t)<<4|r>>4,a=1>6:64,o=2>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),l[h++]=t,64!==s&&(l[h++]=r),64!==a&&(l[h++]=n);return l}},{\"./support\":30,\"./utils\":32}],2:[function(e,t,r){\"use strict\";var n=e(\"./external\"),i=e(\"./stream/DataWorker\"),s=e(\"./stream/Crc32Probe\"),a=e(\"./stream/DataLengthProbe\");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a(\"data_length\")),t=this;return e.on(\"end\",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a(\"uncompressedSize\")).pipe(t.compressWorker(r)).pipe(new a(\"compressedSize\")).withStreamInfo(\"compression\",t)},t.exports=o},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(e,t,r){\"use strict\";var n=e(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(){return new n(\"STORE compression\")},uncompressWorker:function(){return new n(\"STORE decompression\")}},r.DEFLATE=e(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(e,t,r){\"use strict\";var n=e(\"./utils\");var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?\"string\"!==n.getTypeOf(e)?function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length,0):0}},{\"./utils\":32}],5:[function(e,t,r){\"use strict\";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){\"use strict\";var n=null;n=\"undefined\"!=typeof Promise?Promise:e(\"lie\"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,i=e(\"pako\"),s=e(\"./utils\"),a=e(\"./stream/GenericWorker\"),o=n?\"uint8array\":\"array\";function h(e,t){a.call(this,\"FlateWorker/\"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic=\"\\b\\0\",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new h(\"Deflate\",e)},r.uncompressWorker=function(){return new h(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(e,t,r){\"use strict\";function A(e,t){var r,n=\"\";for(r=0;r>>=8;return n}function n(e,t,r,n,i,s){var a,o,h=e.file,u=e.compression,l=s!==O.utf8encode,f=I.transformTo(\"string\",s(h.name)),c=I.transformTo(\"string\",O.utf8encode(h.name)),d=h.comment,p=I.transformTo(\"string\",s(d)),m=I.transformTo(\"string\",O.utf8encode(d)),_=c.length!==h.name.length,g=m.length!==d.length,b=\"\",v=\"\",y=\"\",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),\"UNIX\"===i?(C=798,z|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(e){return 63&(e||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+c,b+=\"up\"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+=\"uc\"+A(y.length,2)+y);var E=\"\";return E+=\"\\n\\0\",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+\"\\0\\0\\0\\0\"+A(z,4)+A(n,4)+f+b+p}}var I=e(\"../utils\"),i=e(\"../stream/GenericWorker\"),O=e(\"../utf8\"),B=e(\"../crc32\"),R=e(\"../signature\");function s(e,t,r,n){i.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,i),s.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,i.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},s.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return R.DATA_DESCRIPTOR+A(e.crc32,4)+A(e.compressedSize,4)+A(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo(\"string\",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{\"../utils\":32}],19:[function(e,t,r){\"use strict\";var n=e(\"./Uint8ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],21:[function(e,t,r){\"use strict\";var n=e(\"./ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../support\"),s=e(\"./ArrayReader\"),a=e(\"./StringReader\"),o=e(\"./NodeBufferReader\"),h=e(\"./Uint8ArrayReader\");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),\"string\"!==t||i.uint8array?\"nodebuffer\"===t?new o(e):i.uint8array?new h(n.transformTo(\"uint8array\",e)):new s(n.transformTo(\"array\",e)):new a(e)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(e,t,r){\"use strict\";r.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",r.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",r.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",r.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../utils\");function s(e){n.call(this,\"ConvertWorker to \"+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../crc32\");function s(){n.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}e(\"../utils\").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataLengthProbe for \"+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataWorker\");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":e=this.data.substring(this.index,t);break;case\"uint8array\":e=this.data.subarray(this.index,t);break;case\"array\":case\"nodebuffer\":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(e,t,r){\"use strict\";function n(e){this.name=e||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit(\"data\",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit(\"error\",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit(\"error\",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r \"+e:e}},t.exports=n},{}],29:[function(e,t,r){\"use strict\";var h=e(\"../utils\"),i=e(\"./ConvertWorker\"),s=e(\"./GenericWorker\"),u=e(\"../base64\"),n=e(\"../support\"),a=e(\"../external\"),o=null;if(n.nodestream)try{o=e(\"../nodejs/NodejsStreamOutputAdapter\")}catch(e){}function l(e,o){return new a.Promise(function(t,r){var n=[],i=e._internalType,s=e._outputType,a=e._mimeType;e.on(\"data\",function(e,t){n.push(e),o&&o(t)}).on(\"error\",function(e){n=[],r(e)}).on(\"end\",function(){try{var e=function(e,t,r){switch(e){case\"blob\":return h.newBlob(h.transformTo(\"arraybuffer\",t),r);case\"base64\":return u.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return h.nodebuffer?o.transformTo(\"nodebuffer\",e).toString(\"utf-8\"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(h.uint8array?\"uint8array\":\"array\",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(h.uint8array?\"uint8array\":\"array\",e.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}(t),i=t;n!==t.length&&(h.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,n),l.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=l},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(e,t,a){\"use strict\";var o=e(\"./support\"),h=e(\"./base64\"),r=e(\"./nodejsUtils\"),u=e(\"./external\");function n(e){return e}function l(e,t){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new h.Buf8(e.length),r=0,n=t.length;r>10&1023,o[n++]=56320|1023&i)}return l(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}},{\"./common\":41}],43:[function(e,t,r){\"use strict\";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){\"use strict\";var h,c=e(\"../utils/common\"),u=e(\"./trees\"),d=e(\"./adler32\"),p=e(\"./crc32\"),n=e(\"./messages\"),l=0,f=4,m=0,_=-2,g=-1,b=4,i=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=n[t],t}function T(e){return(e<<1)-(4e.avail_out&&(r=e.avail_out),0!==r&&(c.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){u._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&sh&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,i,s,a,o,h,u,l,f=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=f+(f-z)){for(c.arraySet(e.window,e.window,f,f,0),e.match_start-=f,e.strstart-=f,e.block_start-=f,t=r=e.hash_size;n=e.head[--t],e.head[t]=f<=n?n-f:0,--r;);for(t=r=f;n=e.prev[--t],e.prev[t]=f<=n?n-f:0,--r;);i+=f}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,h=e.strstart+e.lookahead,u=i,l=void 0,l=a.avail_in,u=x)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x)if(n=u._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=u._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===l)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,m):_},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5>8&255),U(n,n.gzhead.time>>16&255),U(n,n.gzhead.time>>24&255),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(U(n,255&n.gzhead.extra.length),U(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(U(n,0),U(n,0),U(n,0),U(n,0),U(n,0),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,3),n.status=E);else{var a=v+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=E,P(n,a),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending!==n.pending_buf_size));)U(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&F(e),n.pending+2<=n.pending_buf_size&&(U(n,255&e.adler),U(n,e.adler>>8&255),e.adler=0,n.status=E)):n.status=E),0!==n.pending){if(F(e),0===e.avail_out)return n.last_flush=-1,m}else if(0===e.avail_in&&T(t)<=T(r)&&t!==f)return R(e,-5);if(666===n.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==l&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===l)return A;break}if(e.match_length=0,r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===l)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=u._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):h[n.level].func(n,t);if(o!==O&&o!==B||(n.status=666),o===A||o===O)return 0===e.avail_out&&(n.last_flush=-1),m;if(o===I&&(1===t?u._tr_align(n):5!==t&&(u._tr_stored_block(n,0,0,!1),3===t&&(D(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),F(e),0===e.avail_out))return n.last_flush=-1,m}return t!==f?m:n.wrap<=0?1:(2===n.wrap?(U(n,255&e.adler),U(n,e.adler>>8&255),U(n,e.adler>>16&255),U(n,e.adler>>24&255),U(n,255&e.total_in),U(n,e.total_in>>8&255),U(n,e.total_in>>16&255),U(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),F(e),0=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new c.Buf8(r.w_size),c.arraySet(u,t,l-r.w_size,r.w_size,0),t=u,l=r.w_size),a=e.avail_in,o=e.next_in,h=e.input,e.avail_in=l,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,i=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<>>=y,p-=y),p<15&&(d+=z[n++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<>>=y,p-=y,(y=s-a)>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function h(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){e.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&u)){e.msg=\"unknown compression method\",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(d=r.length)&&(d=o),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,d,k)),512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,r.length-=d),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&d>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break e;o--,u+=n[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;u>>>=2,l-=2;break e;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,u+=n[s++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(d=r.length){if(o>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l>>=_,l-=_,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=30;break}k=r.lens[r.have-1],d=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l>>=_)),u>>>=3,l-=3}else{for(z=_+7;l>>=_)),u>>>=7,l-=7}if(r.have+d>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=30;break}for(;d--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=h){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,R(e,c),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){e.msg=\"invalid distance code\",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===h)break e;if(d=c-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break}p=d>r.wnext?(d-=r.wnext,r.wsize-d):r.wnext-d,d>r.length&&(d=r.length),m=r.window}else m=i,p=a-r.offset,d=r.length;for(hd?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=t[r+a[v]]}if(k>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>d-r?(e.bi_buf|=t<>d-e.bi_valid,e.bi_valid+=r-d):(e.bi_buf|=t<>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(g+1),a=0;for(n=1;n<=g;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=g;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)p<(s=h[2*h[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),h[2*n+1]=s,u>=7;n>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return o;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return h;for(t=32;t>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?J(e,t,r,n):4===e.strategy||s===i?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,m,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{\"../utils/common\":41}],53:[function(e,t,r){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(r,n){\"use strict\";if(!r.setImmediate){var i,s,t,a,o=1,h={},u=!1,l=r.document,e=Object.getPrototypeOf&&Object.getPrototypeOf(r);e=e&&e.setTimeout?e:r,i=\"[object process]\"==={}.toString.call(r.process)?function(e){process.nextTick(function(){c(e)})}:function(){if(r.postMessage&&!r.importScripts){var e=!0,t=r.onmessage;return r.onmessage=function(){e=!1},r.postMessage(\"\",\"*\"),r.onmessage=t,e}}()?(a=\"setImmediate$\"+Math.random()+\"$\",r.addEventListener?r.addEventListener(\"message\",d,!1):r.attachEvent(\"onmessage\",d),function(e){r.postMessage(a+e,\"*\")}):r.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){t.port2.postMessage(e)}):l&&\"onreadystatechange\"in l.createElement(\"script\")?(s=l.documentElement,function(e){var t=l.createElement(\"script\");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,s.removeChild(t),t=null},s.appendChild(t)}):function(e){setTimeout(c,0,e)},e.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),r=0;r | 空格 ( ) [ ] { } # % ^ ` ~ ; @ & = + $ ,\r\n const invalidChars = /[\\\\:\\*\\?\"'<>\\| \\(\\)\\[\\]\\{\\}#%\\^`~;@&=\\+\\$,]/;\r\n if (invalidChars.test(path)) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.invalidCharacters') \r\n };\r\n }\r\n \r\n return { valid: true };\r\n}\r\n"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","key","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","render","_ctx","_cache","$props","$setup","$data","$options","_component_el_input","_component_font_awesome_icon","_component_el_button","_component_DirectoryTreePicker","_component_el_dialog","_component_el_tree","_component_el_drawer","_directive_loading","isDesktop","modelValue","dialogVisible","$event","title","isBatchMove","$t","width","onClose","handleClose","footer","onClick","default","_","type","loading","handleConfirm","targetPath","placeholder","prepend","currentDirectory","source","onSelect","handleDirectorySelect","trigger","icon","direction","size","showTreePicker","text","treeError","fetchDirectoryTree","ref","data","treeData","props","treeProps","onNodeClick","handleTreeNodeClick","node","path","expanded","name","treeLoading","components","DirectoryTreePicker","Boolean","String","initialPath","emits","windowWidth","window","innerWidth","children","label","computed","get","this","set","val","$emit","watch","newVal","mounted","addEventListener","handleResize","beforeUnmount","removeEventListener","methods","response","fetchWithAuth","method","ok","status","json","tree","err","console","error","startsWith","__exports__","to","args","close","active","currentPath","navigate","pathParts","folder","index","length","style","paddingLeft","slice","join","goBack","split","filter","isFolder","handleAction","action","_component_el_tag","_component_el_tab_pane","_component_el_alert","_component_el_tabs","visible","dialogWidth","activeTab","count","fileCount","inputTag","onKeyup","handleAddInputTag","onInput","handleInputChange","clearable","append","showSuggestions","suggestions","tag","selectSuggestion","tagsToAdd","closable","removeFromToAdd","executeAddTags","disabled","commonTags","handleRemoveCommonTag","description","center","handleClearAllTags","selectedFiles","Array","required","debounceTimer","selectedFilesOnly","file","fileIds","map","loadCommonTags","resetData","newTab","tagPromises","encodeURIComponent","responses","Promise","all","allTags","push","tags","every","includes","clearTimeout","trim","setTimeout","fetchSuggestions","prefix","toLowerCase","warning","indexOf","splice","headers","body","JSON","stringify","Error","success","updated","confirm","confirmButtonText","cancelButtonText","then","executeClearTags","catch","info","_component_Loading","_component_el_icon","handleAddTag","currentTags","handleRemoveTag","popularTags","handleAddPopularTag","loadingPopularTags","Loading","fileId","loadFileTags","loadPopularTags","message","_component_el_image","_component_el_descriptions_item","_component_el_descriptions","_component_el_form_item","_component_el_form","isEditing","round","startEdit","openRenameDialog","saveMetadata","editSaving","cancelEdit","onTabClick","handleTabClick","urls","originUrl","readonly","handleUrlClick","mdUrl","htmlUrl","bbUrl","metadata","TgFileId","tgId","S3Location","S3CdnFileUrl","isVideo","src","fileLink","autoplay","muted","loop","openImageLink","isAudio","controls","isImage","fit","lazy","border","column","descColumn","editForm","FileName","FileType","fileSizeDisplay","imageDimensions","Width","Height","orientationIcon","uploadTime","Channel","ChannelName","accessTagType","accessType","Label","UploadIP","UploadAddress","Tags","showRenameDialog","closeRenameDialog","submitRename","renameSaving","renameValidation","valid","onSubmit","renameForm","newFileId","validateRenameInput","INVALID_CHARS","validateFileId","currentFileId","test","Object","fileType","endsWith","TimeStamp","Date","toLocaleString","listType","ListType","height","ratio","sizeBytes","FileSizeBytes","sizeMB","FileSize","toFixed","handleVideoClick","e","video","target","paused","play","pause","input","select","navigator","clipboard","writeText","value","open","result","oldFileId","_component_el_tooltip","selectedCount","disableTooltip","content","placement","handleClear","actions","command","className","Number","onTouchstart","onTouchend","onTouchmove","localSelected","toggleSelect","handlePreviewClick","preload","decoding","displayName","fileNameStart","fileNameEnd","item","tagIndex","background","getTagColor","channelTag","uploadDate","selected","tagColors","parts","getFileName","uploaded","toLocaleDateString","_component_el_checkbox","_component_el_card","onChange","videoLoading","videoError","onMouseenter","handleVideoHover","onMouseleave","onFullscreenchange","handleFullscreenChange","onWebkitfullscreenchange","onLoadeddata","onError","handleVideoError","previewSrcList","fileName","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","isFullscreen","document","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","currentTime","isEnter","folderName","showActions","i","validator","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_component_el_badge","_component_el_checkbox_group","_component_el_dropdown_menu","_component_el_dropdown","dropdown","localFilters","accessStatus","handleFilterChange","accessStatusOptions","option","listTypeOptions","labelOptions","fileTypeOptions","channel","channelOptions","channelNameOptions","channelName","groupedChannelNames","group","typeLabel","channels","clearFilters","activeFilterCount","hidden","filters","values","reduce","arr","groups","forEach","handler","newFilters","isArray","immediate","deep","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_component_DashboardTabs","_component_FilterDropdown","_component_el_dropdown_item","_component_el_header","_component_el_breadcrumb_item","_component_el_breadcrumb","_component_SkeletonLoader","_component_FolderCard","_component_FileCard","_component_FileListItem","_component_el_pagination","_component_el_main","_component_el_container","_component_BatchActionBar","_component_FileDetailDialog","_component_el_radio","_component_el_radio_group","_component_el_switch","_component_TagManagementDialog","_component_BatchTagDialog","_component_MobileActionSheet","_component_MobileDirectoryDrawer","_component_MoveFileDialog","tempSearch","handleSearch","suffix","onCommand","sort","sortIcon","showUrlDialog","viewMode","toggleViewMode","handleLogout","handleSelectPage","selectPageIcon","showMobileDirectoryDrawer","pop","separator","navigateToFolder","isDragging","paginatedTableData","hasSearchOrFilter","isSearchMode","onEnter","enterFolder","onCopy","handleFolderCopy","onMove","handleMove","onDelete","handleDelete","handleFolderTouchStart","handleTouchEnd","getFileLink","onDetail","openDetailDialog","handleCopy","onDownload","handleDownload","handleTouchStart","isSelectAll","isIndeterminate","handleSelectAllPage","onFolderCopy","position","left","selectionRect","top","layout","total","filteredTableData","pageSize","currentPage","pagerCount","onCurrentChange","handlePageChange","refreshFileList","refreshLoading","Math","ceil","loadMoreData","realTotalPages","jumpPage","handleJumpPage","onAction","handleBatchAction","onClear","clearSelection","showdetailDialog","detailFile","allUrl","onTagManagement","handleTagManagement","onBlock","handleBlock","onWhite","handleWhite","handleDetailDelete","onMetadataUpdated","handleMetadataUpdated","onFileRenamed","handleFileRenamed","defaultUrlFormat","useCustomUrl","customUrlPrefix","showTagDialog","currentTagFile","onTagsUpdated","handleTagsUpdated","showBatchTagDialog","handleBatchTagsUpdated","showMobileActionModal","mobileActionIsFolder","getFolderName","mobileActionFile","handleMobileAction","onNavigate","onGoBack","handleGoBack","showMoveDialog","moveTargetPath","onConfirm","confirmMove","FileManager","constructor","FILE_LIST_PATH","fileListCache","storageWarningShown","getLocalFileList","fileList","getMutableFileList","files","directories","localStorage","getItem","parse","createEmptyFileList","updateFileListCache","persisted","persistFileListCache","cacheUpdated","setItem","handleStoragePersistError","warn","removeItem","removeError","ElMessage","i18n","global","t","addFile","newFile","addFolder","moveFile","oldPath","newPath","oldFolderIndex","fileIndex","findIndex","pathArray","substring","newFolder","removeFile","removeFolder","dir","getFilesInFolder","subdirectories","buildFilterParams","params","search","includeTags","excludeTags","url","newFileList","isIndexedResponse","loadMoreFiles","start","moreFiles","fileManager","rectIntersects","rectA","rectB","right","bottom","calcSelectionRect","current","min","x","y","abs","useDragSelect","options","modes","mainSelector","items","startPoint","preSelectSnapshot","isAppendMode","MOBILE_BREAKPOINT","listenerAttached","EDGE_THRESHOLD","SCROLL_SPEED","autoScrollTimer","savedUserSelect","getActiveConfig","mode","toValue","undefined","shouldEnable","syncListenerState","attachContainerListener","cancelDrag","detachContainerListener","isBlankArea","event","mainArea","closest","config","itemEl","itemSelector","container","containerRef","contains","interactive","hasAppendModifier","shiftKey","ctrlKey","metaKey","saveSnapshot","currentItems","lastClientY","startAutoScroll","scrollStep","viewportHeight","innerHeight","scrollDelta","scrollBy","updateSelection","requestAnimationFrame","stopAutoScroll","cancelAnimationFrame","disableTextSelection","userSelect","restoreTextSelection","rect","selRect","itemElements","querySelectorAll","itemRect","getBoundingClientRect","itemBounds","intersects","onMouseDown","button","clientX","clientY","onMouseMove","onMouseUp","currentPoint","_event","onWindowResize","onMounted","onBeforeUnmount","mixins","backgroundManager","directFileCount","directFolderCount","showLogoutButton","tableData","searchKeywords","searchIncludeTags","searchExcludeTags","sortOption","isUploading","activeUrlTab","mobileActionIndex","longPressTimer","moveFileKey","moveFileIndex","DashboardTabs","TagManagementDialog","BatchTagDialog","SkeletonLoader","FileCard","FolderCard","FileListItem","FileDetailDialog","BatchActionBar","MobileActionSheet","MobileDirectoryDrawer","FilterDropdown","MoveFileDialog","LanguageSwitcher","setup","cardContainerRef","listContainerRef","viewModeRef","itemsRef","card","list","totalPages","sortedData","sortData","end","fullList","concat","detailDialogWidth","ExternalLink","rootUrl","tableColumnNum","tablePreviewSpan","selectPage","selectedPageFiles","some","userConfig","urlPrefix","location","origin","newData","newOption","newFormat","$store","commit","parentPath","colors","formatFileSize","bytes","isNaN","units","searchText","excludeTagRegex","replace","match","includeTagRegex","log","extractChannelNames","typeLabels","telegram","cfr2","s3","discord","huggingface","webdav","entries","channelList","a","b","localeCompare","link","createElement","href","download","click","tab","$message","$confirm","reject","updateStats","find","handleBatchDelete","promises","results","successNum","handleBatchCopy","folders","$loading","lock","allFiles","links","generateFileLink","copyToClipboardFallback","textarea","appendChild","clip","execCommand","removeChild","fetchFileList","num","init","videoElement","fetch","credentials","authType","finally","$router","handleBatchDownload","handleBatchMove","handleBatchTagManagement","handleBatchBlock","handleBatchWhite","validation","executeBatchMove","executeSingleMove","newKey","$nextTick","tempData","refreshLocalFileList","f","resolve","zip","fileNameCount","downloadPromises","async","blob","extension","lastIndexOf","baseName","generateAsync","URL","createObjectURL","flag","videoExtensions","audioExtensions","imageExtensions","filename","page","parseInt","max","loadMoreDataUntilPage","targetPage","targetIndex","currentFolderCount","currentFileCount","neededFileCount","relativePath","maxLength","startLength","floor","endLength","getFileNameStart","dotIndex","keepLength","getFileNameEnd","ext","folderPath","Set","folderItems","from","fileItems","totalCount","state","adminLoggedIn","updatedMetadata","isExternal","baseUrl","initializeBackground","adminUrlSettings","savedViewMode","_component_el_popover","popoverVisible","transition","reference","$slots","handleNodeClick","openDrawer","drawerVisible","$refs","treeRef","store","nodesMap","treeRefMobile","setCurrentKey","axios","withAuthCode","module","exports","s","o","h","u","r","l","n","code","call","d","c","p","encode","getTypeOf","charCodeAt","charAt","decode","substr","uint8array","Uint8Array","compressedSize","uncompressedSize","crc32","compression","compressedContent","prototype","getContentWorker","pipe","uncompressWorker","on","streamInfo","data_length","getCompressedWorker","withStreamInfo","createWorkerFrom","compressWorker","STORE","magic","DEFLATE","base64","binary","createFolders","date","compressionOptions","comment","unixPermissions","dosPermissions","lie","Uint16Array","Uint32Array","_pako","_pakoAction","_pakoOptions","meta","inherits","processChunk","_createPako","transformTo","flush","cleanUp","raw","level","onData","pako","A","fromCharCode","O","utf8encode","I","m","g","v","w","k","S","z","C","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCFullYear","getUTCMonth","getUTCDate","B","E","fileRecord","R","LOCAL_FILE_HEADER","dirRecord","CENTRAL_FILE_HEADER","bytesWritten","zipComment","zipPlatform","encodeFileName","streamFiles","accumulate","contentBuffer","dirRecords","currentSourceOffset","entriesCount","currentFile","_sources","percent","openedSource","closedSource","DATA_DESCRIPTOR","shift","CENTRAL_DIRECTORY_END","prepareNextSource","previous","isPaused","resume","registerPrevious","generatedError","generateWorker","platform","_compressWorker","arguments","create","root","clone","loadAsync","support","defaults","version","external","decompressed","extend","checkCRC32","optimizedBinaryString","decodeFileName","utf8decode","isNode","isStream","prepareContent","load","fileNameStr","fileCommentStr","unsafeOriginalName","_upstreamEnded","_bindStream","_stream","Readable","_helper","emit","_read","Buffer","newBufferFrom","allocBuffer","alloc","fill","isBuffer","toUpperCase","toString","remove","generate","generateInternalStream","mimeType","checkSupport","generateNodeStream","toNodejsStream","stream","byteAt","zero","lastIndexOfSignature","readAndCheckSignature","readData","checkOffset","checkIndex","setIndex","skip","readInt","readString","readDate","UTC","subarray","ZIP64_CENTRAL_DIRECTORY_LOCATOR","ZIP64_CENTRAL_DIRECTORY_END","destType","propName","dataIsReady","_tickScheduled","_tickAndRepeat","delay","isFinished","_tick","extraStreamInfo","isLocked","_listeners","mergeStreamInfo","hasOwnProperty","nodestream","_internalType","_outputType","_mimeType","newBlob","apply","_worker","objectMode","array","string","arraybuffer","ArrayBuffer","nodebuffer","Blob","self","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","getBlob","leftOver","applyFromCharCode","Utf8DecodeWorker","Utf8EncodeWorker","stringifyByChunk","stringifyByChar","applyCanBeUsed","buffer","byteLength","MAX_VALUE_16BITS","MAX_VALUE_32BITS","pretty","setImmediate","FileReader","onload","onerror","readAsArrayBuffer","setimmediate","loadOptions","checkSignature","reader","isSignature","readBlockEndOfCentral","diskNumber","diskWithCentralDirStart","centralDirRecordsOnThisDisk","centralDirRecords","centralDirSize","centralDirOffset","zipCommentLength","readBlockZip64EndOfCentral","zip64EndOfCentralSize","zip64ExtensibleData","id","readBlockZip64EndOfCentralLocator","diskWithZip64CentralDirStart","relativeOffsetEndOfZip64CentralDir","disksCount","readLocalFiles","localHeaderOffset","readLocalPart","handleUTF8","processAttributes","readCentralDir","zip64","readCentralPart","readEndOfCentral","prepareReader","isEncrypted","bitFlag","useUTF8","fileNameLength","compressionMethod","versionMadeBy","extraFieldsLength","fileCommentLength","diskNumberStart","internalFileAttributes","externalFileAttributes","readExtraFields","parseZIP64ExtraField","fileComment","extraFields","findExtraFieldUnicodePath","findExtraFieldUnicodeComment","_data","_dataBinary","internalStream","_decompressWorker","nodeStream","MutationObserver","WebKitMutationObserver","createTextNode","observe","characterData","MessageChannel","onreadystatechange","parentNode","documentElement","port1","onmessage","port2","postMessage","TypeError","queue","outcome","promise","onFulfilled","callFulfilled","otherCallFulfilled","onRejected","callRejected","otherCallRejected","race","assign","chunkSize","windowBits","memLevel","strategy","gzip","msg","ended","chunks","strm","avail_out","deflateInit2","header","deflateSetHeader","dictionary","string2buf","deflateSetDictionary","_dict_set","next_in","avail_in","output","Buf8","next_out","deflate","onEnd","buf2binstring","shrinkBuf","deflateEnd","flattenChunks","Deflate","deflateRaw","inflateInit2","Z_OK","inflateGetHeader","Z_FINISH","Z_NO_FLUSH","binstring2buf","inflate","Z_NEED_DICT","inflateSetDictionary","Z_BUF_ERROR","Z_STREAM_END","Z_SYNC_FLUSH","utf8border","buf2string","arraySet","inflateEnd","Inflate","inflateRaw","ungzip","Int32Array","setTyped","Buf16","Buf32","Z_PARTIAL_FLUSH","Z_FULL_FLUSH","Z_BLOCK","Z_TREES","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","T","D","F","pending","pending_buf","pending_out","total_out","N","_tr_flush_block","block_start","strstart","U","P","L","max_chain_length","prev_length","nice_match","w_size","w_mask","prev","good_match","lookahead","match_start","j","window_size","hash_size","head","wrap","adler","total_in","insert","ins_h","hash_shift","hash_mask","Z","match_length","_tr_tally","max_lazy_match","last_lit","W","prev_match","match_available","M","good_length","max_lazy","nice_length","max_chain","func","H","pending_buf_size","gzhead","gzindex","last_flush","w_bits","hash_bits","dyn_ltree","dyn_dtree","bl_tree","l_desc","d_desc","bl_desc","bl_count","heap","heap_len","heap_max","depth","l_buf","lit_bufsize","d_buf","opt_len","static_len","matches","bi_buf","bi_valid","G","data_type","_tr_init","K","Y","deflateInit","deflateReset","deflateResetKeep","hcrc","extra","time","os","_tr_align","_tr_stored_block","deflateInfo","xflags","extra_len","done","dmax","wsize","whave","wnext","hold","bits","lencode","distcode","lenbits","distbits","sane","last","havedict","flags","check","wbits","offset","ncode","nlen","ndist","have","next","lens","work","lendyn","distdyn","back","was","inflateReset","inflateReset2","inflateResetKeep","inflateInit","inflateInfo","static_tree","extra_bits","extra_base","elems","max_length","has_stree","dyn_tree","max_code","stat_desc","X","V","q","J","getPrototypeOf","process","nextTick","importScripts","random","attachEvent","Function","callback","clearImmediate","validateFolderPath","strict","dotPattern","invalidChars"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/997.7b6c8b5a.js.map.gz b/frontend-dist/js/997.7b6c8b5a.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..de9494e5750a1d5d890b9526ff50bf82cc675737 GIT binary patch literal 145474 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%0DqsF#@0 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

    ND!3=6C09Ju1V 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

      C}h#WqG$aMT*7R|%;vIwN!dHaXT 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.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.adminRequired)return l.A.commit("setAdminLoggedIn",!0),t();if(o.valid&&"admin"===o.authType)return l.A.commit("setAdminLoggedIn",!0),t();const i=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()}).catch(()=>{const a=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()})},d=(e,a,t)=>{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.userRequired)return l.A.commit("setUserLoggedIn",!0),t();if(o.valid)return l.A.commit("setUserLoggedIn",!0),t();const i=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()}).catch(()=>{const a=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()})},c=[{path:"/",name:"home",component:()=>Promise.all([t.e(740),t.e(600),t.e(428),t.e(528)]).then(t.bind(t,74828)),beforeEnter:d},{path:"/login",name:"login",component:()=>Promise.all([t.e(600),t.e(604)]).then(t.bind(t,61880))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([t.e(740),t.e(309),t.e(428),t.e(770)]).then(t.bind(t,15423)),beforeEnter:s},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([t.e(740),t.e(309),t.e(833),t.e(396)]).then(t.bind(t,59396)),beforeEnter:s},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([t.e(740),t.e(309),t.e(833),t.e(529)]).then(t.bind(t,31529)),beforeEnter:s},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([t.e(600),t.e(728)]).then(t.bind(t,16556))},{path:"/blockimg",name:"blockimg",component:()=>t.e(917).then(t.bind(t,74917))},{path:"/whiteliston",name:"whiteliston",component:()=>t.e(51).then(t.bind(t,31051))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>t.e(718).then(t.bind(t,49718))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>t.e(226).then(t.bind(t,68226))}],u=(0,o.aE)({history:(0,o.LA)("/"),routes:c});a.A=u},25507:function(e,a,t){t(18111),t(61701);var o=t(60782),n=t(457),l=t(55131);a.A=(0,o.y$)({state:{userConfig:null,bingWallPapers:[],adminLoggedIn:!1,userLoggedIn:!1,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:void 0,compressQuality:void 0,compressBar:void 0,serverCompress:void 0,convertToWebp:void 0},storeUploadChannel:"",storeChannelName:null,storeAutoRetry:!0,storeUploadNameType:"",uploadFolder:"",customUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},adminUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},autoReUpload:!0,useDarkMode:null,cusDarkMode:!1},getters:{userConfig:e=>e.userConfig,bingWallPapers:e=>e.bingWallPapers,credentials:e=>e.adminLoggedIn?"__session__":null,adminLoggedIn:e=>e.adminLoggedIn,userLoggedIn:e=>e.userLoggedIn,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeChannelName:e=>e.storeChannelName,storeUploadNameType:e=>e.storeUploadNameType,customUrlSettings:e=>e.customUrlSettings,storeAutoRetry:e=>e.storeAutoRetry,adminUrlSettings:e=>e.adminUrlSettings,storeUploadFolder:e=>e.uploadFolder||localStorage.getItem("uploadFolder")||"",useDarkMode:e=>e.useDarkMode,cusDarkMode:e=>e.cusDarkMode,storeAutoReUpload:e=>e.autoReUpload},mutations:{setUserConfig(e,a){e.userConfig=a},setBingWallPapers(e,a){e.bingWallPapers=a},setCredentials(e,a){e.adminLoggedIn=null!==a&&void 0!==a},setAdminLoggedIn(e,a){e.adminLoggedIn=a},setUserLoggedIn(e,a){e.userLoggedIn=a},setUploadMethod(e,a){e.uploadMethod=a},setUploadCopyUrlForm(e,a){e.uploadCopyUrlForm=a},setCompressConfig(e,{key:a,value:t}){e.compressConfig[a]=t},setStoreUploadChannel(e,a){e.storeUploadChannel=a},setStoreChannelName(e,a){e.storeChannelName=a},setStoreUploadNameType(e,a){e.storeUploadNameType=a},setCustomUrlSettings(e,{key:a,value:t}){e.customUrlSettings[a]=t},setStoreAutoRetry(e,a){e.storeAutoRetry=a},setAdminUrlSettings(e,{key:a,value:t}){e.adminUrlSettings[a]=t},setUseDarkMode(e,a){e.useDarkMode=a},setCusDarkMode(e,a){e.cusDarkMode=a},setStoreUploadFolder(e,a){e.uploadFolder=a,localStorage.setItem("uploadFolder",a)},setStoreAutoReUpload(e,a){e.autoReUpload=a}},actions:{async fetchUserConfig({commit:e}){try{const a=await n.A.get("/api/userConfig");e("setUserConfig",a.data)}catch(a){console.log(a)}},async fetchBingWallPapers({commit:e}){try{const a=await n.A.get("/api/bing/wallpaper"),t=a.data.data,o=t.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(o.map(e=>new Promise((a,t)=>{const o=new Image;o.onload=a,o.onerror=t,o.src=e.url}))),e("setBingWallPapers",o)}catch(a){console.log(a)}}},modules:{},plugins:[(0,l.A)({paths:["userConfig","uploadMethod","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode"]})]})},46638:function(e,a,t){t.d(a,{Ay:function(){return c},xS:function(){return d}});var o=t(85384),n=JSON.parse('{"login":{"title":"登录到 {owner} 图床","adminTitle":"管理端登录","password":"密码","username":"用户名","passwordPlaceholder":"请输入认证码","usernamePlaceholder":"请输入用户名","adminPasswordPlaceholder":"请输入密码","submit":"登录","success":"登录成功","failed":"登录失败,请检查密码是否正确","adminFailed":"用户名或密码错误","serverError":"服务器错误","systemError":"系统错误","authRequired":"请先认证!","authFailed":"认证失败!"},"upload":{"folderPlaceholder":"上传目录","pasteUpload":"粘贴上传","fileUpload":"文件上传","dragUploadText":"拖拽 点击Ctrl + V 粘贴上传","pasteUrlPlaceholder":"粘贴外链上传,多个外链用换行分隔","pasteUploadBtn":"上 传","pasteSave":"转存","pasteExternal":"外链","history":"上传记录","announcement":"查看公告","noAnnouncement":"暂无公告","announcementTitle":"公告","announcementAck":"我已知晓!","settings":"上传设置","linkFormat":"链接格式","manage":"系统管理","logout":"退出登录","logoutSuccess":"已退出登录","viewDocs":"查看文档","switchUploadMethod":"切换上传方式","copyAll":"整体复制","retryFailed":"失败重试","clearList":"清空列表","clearAll":"清空全部","clearUploaded":"清空已上传"},"uploadForm":{"deleted":"{name}已删除","uploadSuccess":"{name}上传成功","uploadFailed":"{name}上传失败","compressFailedCannotUpload":"{name}压缩失败,无法上传!","fileTooLarge":"{name}文件过大,无法上传!","compressedFileTooLarge":"{name}压缩后文件过大,无法上传!","copySuccess":"复制成功","copyFailed":"复制失败","copyAllSuccess":"整体复制成功","fileNotUploaded":"文件未上传成功,无法复制链接","fileListCleared":"文件列表已清空","fileListEmpty":"文件列表为空","successFilesCleared":"成功上传文件已清空","successFilesEmpty":"成功上传文件为空","noFailedFiles":"无上传失败文件","autoRetryOn":"自动重试已开启","autoRetryOff":"自动重试已关闭","autoRetry":"自动重试","maxRetryReached":"{name} 已达到最大重试次数({max}),停止重试","urlRequestFailed":"粘贴板中的URL地址请求失败","chunkMerging":"分块上传完成,正在合并文件,请耐心等待...","fileSizeTooLarge":"文件过大","chunkInitFailed":"初始化分块上传失败","uploadError":"上传过程中发生错误","imageLoadFailed":"图片加载失败"},"uploadSettings":{"title":"上传设置","uploadChannel":"上传渠道","channelType":"渠道类型","channelName":"渠道名称","channelNameTooltip":"选择具体的渠道名称,不选择则使用负载均衡或默认渠道","autoSelect":"自动选择","uploadDirectory":"上传目录","uploadDirectoryPlaceholder":"请输入上传目录路径","autoSwitch":"自动切换","autoSwitchTooltip":"对于非分块上传文件,上传失败自动切换到其他渠道上传","fileNaming":"文件命名方式","namingDefault":"默认","namingIndex":"仅前缀","namingOrigin":"仅原名","namingShort":"短链接","filePreprocess":"文件预处理","filePreprocessTooltip":"上传前在本地进行格式转换和压缩,仅对图片文件生效","convertToWebp":"转换为WebP","convertToWebpTooltip":"上传前将图片转换为WebP格式,可有效减小文件体积。转换失败时保持原格式上传","fileCompress":"文件压缩","compressThreshold":"压缩阈值","compressThresholdTooltip":"设置图片大小阈值,超过此值将自动压缩,单位MB","expectedSize":"期望大小","expectedSizeTooltip":"设置压缩后图片大小期望值,单位MB","serverCompress":"服务端压缩","serverCompressTooltip":"1. 在 Telegram 端进行压缩,仅对上传渠道为 Telegram 的图片文件生效
      2. 若图片大小(本地压缩后大小)大于10MB,本设置自动失效
      3. 若上传分辨率过大、透明背景等图片,建议关闭服务端压缩,否则可能出现未知问题","enableCompress":"开启压缩","confirm":"确定"},"uploadHistory":{"title":"历史记录","totalRecords":"共 {count} 条","switchView":"切换视图","clearRecords":"清空记录","loading":"加载中...","pullToLoadMore":"下拉加载更多","noMoreRecords":"没有更多记录了","emptyHistory":"暂无上传记录","linkCopied":"链接已复制","copyFailed":"复制失败","clearConfirmTitle":"提示","clearConfirmMessage":"确定要清空所有上传记录吗?","clearConfirmOk":"确定","clearConfirmCancel":"取消","recordsCleared":"记录已清空","deleteConfirmMessage":"确定要删除这条记录吗?","recordDeleted":"记录已删除"},"settings":{"linkFormatTitle":"链接格式设置","defaultCopyLink":"默认复制链接","rawLink":"原始链接","customLink":"自定义链接","customLinkTooltip":"默认链接为https://your.domain/file/xxx.jpg
      如果启用自定义链接格式,只保留xxx.jpg部分,其他部分请自行输入","enableCustom":"启用自定义","customPrefix":"自定义前缀","customPrefixPlaceholder":"请输入自定义链接前缀","confirm":"确定","s3Link":"S3链接"},"dashboard":{"searchPlaceholder":"搜索:#标签 -#排除标签","sortByDateDesc":"按时间倒序","sortByNameAsc":"按名称升序","selectedItems":"项已选","clearSelection":"清除选择","copy":"复制","delete":"删除","download":"下载","move":"移动","tagManagement":"标签管理","addToBlacklist":"加入黑名单","addToWhitelist":"加入白名单","linkFormat":"链接格式","listView":"列表视图","cardView":"卡片视图","logout":"退出登录","rootDirectory":"根目录","totalFiles":"共 {count} 个文件","noMatchingFiles":"未找到匹配的文件或文件夹","currentDirEmpty":"当前目录为空","adjustSearchHint":"尝试调整搜索条件或筛选器","uploadHint":"上传文件后将显示在这里","loadMore":"加载更多","totalPages":"共 {count} 页","jumpTo":"跳至","preview":"预览","fileName":"文件名","tags":"标签","channelType":"渠道类型","channelNameCol":"渠道名称","uploadAddress":"上传地址","fileSize":"大小","uploadTime":"上传时间","actions":"操作","externalTag":"外链","unknownTag":"未知","detail":"详情","copyLink":"复制链接","moveFile":"移动","downloadFile":"下载","loadFailed":"加载失败","copySuccess":"复制成功","copyFailed":"复制失败","deleteConfirm":"此操作将永久删除该文件, 是否继续?","deleteConfirmTitle":"提示","deleteConfirmOk":"确定","deleteConfirmCancel":"取消","deleteSuccess":"删除成功","deleteFailed":"删除失败","blockConfirm":"此操作将把该文件加入黑名单, 是否继续?","blockSuccess":"加入黑名单成功","blockFailed":"加入黑名单失败","whiteConfirm":"此操作将把该文件加入白名单, 是否继续?","whiteSuccess":"加入白名单成功","whiteFailed":"加入白名单失败","deleteFolderConfirm":"此操作将永久删除文件夹, 是否继续?","deleteFileConfirm":"此操作将永久删除该文件, 是否继续?","batchDeleteConfirm":"此操作将永久删除选中的文件及文件夹, 是否继续?","batchDeleteSuccess":"批量删除成功","batchDeleteFailed":"批量删除失败","batchBlockConfirm":"此操作将把选中的文件加入黑名单, 是否继续?","batchBlockSuccess":"批量加入黑名单成功","batchBlockFailed":"批量加入黑名单失败","batchWhiteConfirm":"此操作将把选中的文件加入白名单, 是否继续?","batchWhiteSuccess":"批量加入白名单成功","batchWhiteFailed":"批量加入白名单失败","noLinksAvailable":"没有可复制的链接","batchCopySuccess":"批量复制 {count} 个链接成功","batchCopyFailed":"批量复制链接失败,请重试","batchCopyLinksSuccess":"批量复制链接成功","copyFileLinkSuccess":"复制文件链接成功","fileListMemoryCacheWarning":"文件列表较大,已切换为内存缓存;刷新页面后需要重新加载列表。","indexingWarning":"索引构建中,当前搜索和排序结果可能不准确,请稍后再试。","loadMoreFailed":"加载更多文件失败,请检查网络连接","moveSuccess":"移动成功","moveFailed":"移动失败","moveTargetSameAsCurrent":"目标文件夹不能是当前文件夹","invalidPageNumber":"请输入有效的页码","pageExceedsMax":"页码不能超过 {max}","loadingData":"正在加载数据,请稍候...","loadDataFailed":"加载数据失败,请检查网络连接","fetchFileListFailed":"获取文件列表失败","refreshFailed":"刷新失败,请重试","selectFilesFirst":"请先选择文件","syncDataError":"同步数据时出错,请检查网络连接","fetchingFileList":"正在获取文件列表...","folderEmptyNoLinks":"文件夹为空,没有可复制的链接","copiedFileLinks":"已复制 {count} 个文件链接","copyFolderLinksFailed":"复制文件夹链接失败,请重试"},"dashboardTabs":{"fileManagement":"文件管理","userManagement":"用户管理","systemSettings":"系统设置","fileUpload":"文件上传"},"fileDetail":{"title":"文件详情","download":"下载","tags":"标签","blacklist":"黑名单","whitelist":"白名单","deleteBtn":"删除","edit":"编辑","rename":"重命名","save":"保存","cancel":"取消","originUrl":"原始链接","fileNameLabel":"文件名","fileNamePlaceholder":"请输入文件名","fileType":"文件类型","fileTypePlaceholder":"如 image/jpeg","fileSizeLabel":"文件大小","imageDimensions":"图片尺寸","noDimensions":"无","uploadTimeLabel":"上传时间","channelTypeAndName":"渠道类型/名称","accessStatusAndReview":"访问状态/审查","uploadIP":"上传IP","uploadAddressLabel":"上传地址","fileTags":"文件标签","noTags":"暂无标签","unknown":"未知","accessNormal":"正常","accessNormalWhitelist":"正常(白名单)","accessBlockedBlacklist":"已屏蔽(黑名单)","accessBlockedReview":"已屏蔽(审查不通过)","orientationLandscape":"横","orientationPortrait":"竖","orientationSquare":"方","linkCopied":"链接已复制","metadataSaved":"元数据保存成功","metadataSaveFailed":"保存元数据失败","renameTitle":"重命名 File ID","renameLabel":"新 File ID","renamePlaceholder":"请输入新的 File ID","renameCancel":"取消","renameConfirm":"确认重命名","renameSuccess":"文件重命名成功","renameConflict":"目标文件名已存在","renameFailed":"重命名失败"},"filter":{"accessStatus":"访问状态","normal":"正常","blocked":"已屏蔽","blackWhiteList":"黑白名单","whiteList":"白名单","blackList":"黑名单","notSet":"未设置","reviewResult":"审查结果","teenContent":"12+内容","adultContent":"成人内容","fileType":"文件类型","image":"图片","video":"视频","audio":"音频","other":"其他","channelType":"渠道类型","externalLink":"外链","channelName":"渠道名称","clearFilters":"清除筛选"},"moveFile":{"title":"移动文件","batchTitle":"批量移动文件","targetDirectory":"目标目录","targetPlaceholder":"请输入目标目录路径","hint":"提示:路径以 / 开头表示根目录,如 /photos/2024/","hintMobile":"提示:路径以 / 开头表示根目录","selectDirectory":"选择目录","cancel":"取消","confirm":"确定","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadTreeFailed":"加载目录树失败,请检查网络连接"},"batchTag":{"title":"批量标签管理","addTab":"添加","removeTab":"移除","clearTab":"清空","addDescription":"为选中的 {count} 个文件添加标签","inputPlaceholder":"输入标签名称","pendingTags":"待添加的标签","noPendingTags":"暂无待添加标签","addToAllFiles":"添加到所有文件","removeDescription":"移除选中文件的共有标签","commonTags":"共有标签","noCommonTags":"选中的文件没有共有标签","clearDescription":"清空选中的 {count} 个文件的所有标签","clearWarningTitle":"⚠️警告","clearWarningDesc":"此操作将清空所有选中文件的标签,且不可恢复","confirmClearAll":"确认清空所有标签","tagAlreadyInList":"标签已在列表中","pleaseAddTags":"请先添加要批量添加的标签","addSuccess":"成功为 {count} 个文件添加标签","addFailed":"批量添加标签失败","removeSuccess":"成功从 {count} 个文件中移除标签","removeFailed":"移除标签失败","clearConfirmMessage":"确定要清空选中的 {count} 个文件的所有标签吗?此操作不可恢复。","clearConfirmTitle":"确认清空","clearConfirmOk":"确定","clearConfirmCancel":"取消","clearCancelled":"已取消清空操作","clearSuccess":"成功清空 {count} 个文件的标签","clearFailed":"清空标签失败","loadCommonTagsFailed":"加载共有标签失败"},"tagManagement":{"title":"标签管理","inputPlaceholder":"输入标签名称","currentTags":"当前标签","noTags":"暂无标签","popularTags":"常用标签","loading":"加载中...","noPopularTags":"暂无常用标签","close":"关闭","tagExists":"标签已存在","addSuccess":"标签添加成功","addFailed":"添加标签失败","removeSuccess":"标签删除成功","removeFailed":"删除标签失败","loadFailed":"加载标签失败"},"mobileAction":{"viewDetail":"查看详情","copyLink":"复制链接","downloadFile":"下载文件","moveFile":"移动文件","tagManagement":"标签管理","moveFolder":"移动文件夹","deleteFile":"删除文件","deleteFolder":"删除文件夹"},"mobileDirectory":{"title":"目录导航","rootDirectory":"根目录","goBack":"返回上一级"},"sysConfig":{"logout":"退出登录"},"sysConfigTabs":{"systemStatus":"系统状态","uploadSettings":"上传设置","securitySettings":"安全设置","pageSettings":"网页设置","otherSettings":"其他设置"},"dateRangeCalendar":{"previousMonth":"上个月","nextMonth":"下个月","startDate":"起始日期","endDate":"结束日期","rangeSeparator":"至","monthTitle":"{year}-{month}","weekdaySun":"日","weekdayMon":"一","weekdayTue":"二","weekdayWed":"三","weekdayThu":"四","weekdayFri":"五","weekdaySat":"六"},"sysStatus":{"totalFiles":"文件总数","clickToRefresh":"点击刷新","indexUpdateTime":"索引更新时间","systemVersion":"系统版本","clickToViewChangelog":"点击查看更新日志","channelDistribution":"上传渠道分布","fileStatusDistribution":"文件状态分布","uploadTrend":"上传趋势","uploadTrendGroupBy":"上传趋势分组方式","totalUploads":"上传总数","byChannelType":"渠道类型","byChannelName":"渠道名称","selectDateRange":"选择日期范围","otherChannels":"其他","uploadsUnit":"次","noData":"暂无数据","totalFilesLabel":"文件总数","statusTypes":"状态类型","systemMaintenance":"系统维护","rebuildIndex":"重建索引","rebuilding":"重建中...","rebuildTooltip":"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复","backupData":"备份数据","backingUp":"备份中...","backupTooltip":"备份所有文件元数据和系统设置到JSON文件","restoreData":"恢复数据","restoring":"恢复中...","restoreTooltip":"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置","cancelOperation":"取消操作","retry":"重试","close":"关闭","records":"条记录","aboutToComplete":"即将完成","seconds":"约 {count} 秒","minutes":"约 {count} 分钟","hoursMinutes":"约 {hours} 小时 {minutes} 分钟","phaseFetching":"正在获取数据","phaseSorting":"正在排序","phaseUploading":"正在上传","phaseFinalizing":"正在完成","phaseBuilding":"正在构建备份","phaseDownloading":"正在生成下载","phaseRestoringFiles":"正在恢复文件","phaseRestoringSettings":"正在恢复设置","phaseCompleted":"已完成","phaseRetrying":"正在重试","rebuildSuccess":"索引重建完成!共处理 {count} 个文件","backupSuccess":"备份完成!共备份 {count} 个文件","backupSuccessWithSettings":"备份完成!共备份 {fileCount} 个文件,{settingsCount} 个设置项","operationInProgress":"已有操作正在进行中","selectJsonFile":"请选择JSON格式的备份文件","restoreConfirmMessage":"恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","restoreConfirmTitle":"确认恢复","restoreConfirmOk":"确定恢复","restoreConfirmCancel":"取消","invalidBackupFile":"备份文件格式无效,请选择有效的 JSON 文件","restoreSuccess":"恢复完成!已恢复 {files} 个文件和 {settings} 个设置项,正在重建索引...","restoreFailed":"恢复数据失败","fetchIndexFailed":"获取索引信息失败","unknown":"未知","blocked":"已屏蔽","normalStatus":"正常","latestUpload":"最近上传","earliestUpload":"最早上传","daysAgo":"{count}天前","hoursAgo":"{count}小时前","minutesAgo":"{count}分钟前","justNow":"刚刚","cancellingRebuild":"正在取消索引重建..."},"sysUpload":{"title":"上传渠道管理","titleTooltip":"管理所有上传渠道的配置,点击卡片查看详情或编辑","filterPlaceholder":"筛选渠道类型","addChannel":"添加渠道","loadBalance":"负载均衡","unnamedChannel":"未命名渠道","envVariable":"环境变量","noChannels":"暂无 {type} 渠道","detail":"详情","editBtn":"编辑","deleteBtn":"删除","addDialogTitle":"添加新渠道","channelTypeLabel":"渠道类型","channelTypePlaceholder":"请选择渠道类型","channelNameLabel":"渠道名称","channelNamePlaceholder":"请输入渠道名称","channelNameImmutableTip":"添加后将作为文件关联渠道的唯一标识,不支持修改","channelNameEditDisabledTip":"渠道名称用于关联已上传文件,不支持修改","botTokenLabel":"Bot Token","botTokenPlaceholder":"请输入 Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"请输入 Chat ID","proxyDomain":"代理域名","proxyDomainPlaceholder":"可选,例如: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"例如: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN 域名","cdnDomainPlaceholder":"可选,请填写完整 CDN 访问地址前缀,例如:https://cdn.example.com","cdnDomainTip":"可选配置。可用于生成和展示文件访问链接,服务端读取文件内容时也会优先尝试通过 CDN 读取。","bucketName":"存储桶名称","bucketNamePlaceholder":"请输入存储桶名称","bucketRegion":"存储桶区域","bucketRegionPlaceholder":"默认填写 auto","accessKeyId":"访问密钥 ID","accessKeyIdPlaceholder":"请输入访问密钥 ID","secretAccessKey":"机密访问密钥","secretAccessKeyPlaceholder":"请输入机密访问密钥","pathStyle":"路径风格","pathStyleTip":"使用 OpenList 等不兼容主机风格服务时需开启","quotaLimit":"容量限制","quotaLimitGB":"容量上限 (GB)","quotaThreshold":"停用阈值 (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"请输入 Channel ID","nitroMember":"Nitro 会员","nitroTip":"会员单文件限制 25MB,否则为 10MB","discordWarning":"Discord 有接口频率限制,不建议将其用作大规模并发场景","repoName":"仓库名","repoNamePlaceholder":"格式: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"请输入 Access Token","privateRepo":"私有仓库","privateRepoTip":"私有仓库限制 100GB","webdavBaseUrl":"WebDAV 基础地址","webdavBaseUrlPlaceholder":"例如: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"用户名","webdavUsernamePlaceholder":"可选用户名","webdavPassword":"密码","webdavPasswordPlaceholder":"可选密码","webdavPublicUrlPlaceholder":"可选,请填写完整公开访问地址前缀,例如:https://cdn.example.com/imgbed","webdavPublicUrlTip":"可选配置。服务端读取文件内容时会优先尝试通过该公开地址读取,失败后回退 WebDAV API。","webdavHeaders":"自定义请求头","webdavHeadersPlaceholder":"可选 JSON 对象,例如: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"自定义请求头必须是有效的 JSON 对象","webdavCreateDirectory":"自动创建目录","webdavCreateDirectoryTip":"上传文件前自动创建父级目录","cancel":"取消","confirmAdd":"确认添加","detailDialogTitle":"渠道详情 - {name}","channelNameDetail":"渠道名称","channelTypeDetail":"渠道类型","statusLabel":"状态","enabled":"已启用","disabled":"已禁用","configSource":"配置来源","publicUrl":"公开访问链接","notSet":"未设置","isPathStyle":"是","isNotPathStyle":"否","currentUsage":"当前用量","closeBtn":"关闭","editDialogTitle":"编辑渠道 - {name}","enableChannel":"启用渠道","saveChanges":"保存修改","r2ConfigNote":"请按照 配置 R2 渠道 文档说明添加 R2 渠道","reservedName":"该名称为系统保留名称,请使用其他名称","duplicateName":"该类型下已存在同名渠道,请使用其他名称","fixedChannelCannotDelete":"环境变量配置的渠道无法删除","deleteChannelConfirm":"确定要删除该渠道吗?删除后,仍关联该渠道的文件可能无法访问。","quotaInitConfirm":"首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","quotaInitTitle":"初始化容量统计","quotaInitConfirmBtn":"立即统计","quotaInitCancelBtn":"稍后手动统计","quotaInitLater":"您可以稍后点击刷新按钮手动统计","quotaCalculating":"正在统计容量,请稍候...","quotaCalculateSuccess":"容量统计完成","quotaCalculateFailed":"统计失败","quotaCalculateError":"统计失败: "},"sysSecurity":{"authManagement":"认证管理","userAuth":"用户端认证","adminAuth":"管理端认证","uploadPassword":"上传密码","confirmPassword":"确认密码","adminUsername":"用户名","adminPassword":"密码","apiTokenManagement":"API Token 管理","imageReview":"图像审查","imageReviewTooltip":"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道","enableReview":"开启审查","reviewChannel":"审查渠道","reviewChannelPlaceholder":"请选择审查渠道","apiKey":"API Key","apiPath":"API 路径","ipQuery":"IP 归属地查询","ipQueryTooltip":"上传时按配置调用自定义 API 查询上传 IP 归属地,参数值支持 {\'{ip}\'} 占位符","enableIpQuery":"开启查询","ipQueryChannel":"查询渠道","ipQueryChannelPlaceholder":"请选择查询渠道","customApi":"自定义 API","queryParams":"查询参数","paramNamePlaceholder":"参数名","paramValuePlaceholder":"参数值,如 {\'{ip}\'}","addQueryParam":"添加参数","responseFields":"响应字段","responseFieldsTip":"最终显示内容会按照字段顺序拼接","responseFieldPathPlaceholder":"JSON 路径,如 country.name","addResponseField":"添加字段","uploadManagement":"上传管理","accessManagement":"访问管理","domainFilter":"域名过滤","allowedDomains":"放行域名","allowedDomainsTooltip":"1.针对访问域名设置权限
      2.留空默认全部放行,多个域名请用英文逗号分隔","whiteListMode":"白名单模式","enableWhiteList":"是否开启","enableWhiteListTooltip":"1.针对文件设置权限
      2.开启后,仅被加入白名单的文件可被访问","settingsSaved":"设置已保存","tokenName":"名称","tokenValue":"Token","permissions":"权限","createdAt":"创建时间","status":"状态","expiresAt":"过期时间","operation":"操作","editBtn":"编辑","deleteBtn":"删除","permUpload":"上传","permDelete":"删除","permList":"列出","permManage":"管理","createTokenTitle":"创建新 API Token","tokenNameLabel":"Token 名称","tokenNamePlaceholder":"请输入Token名称","permissionsLabel":"权限","neverExpire":"永不过期","validPeriod":"有效期","autoDeleteOnExpire":"过期自动删除","createBtn":"创建","editTokenTitle":"编辑 API Token","updateBtn":"更新","tokenCreatedTitle":"Token 创建成功","tokenCreatedWarning":"请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token!","fullToken":"完整Token","copyBtn":"复制","savedBtn":"我已保存","tokenCopied":"Token已复制到剪贴板","copyFailed":"复制失败,请手动复制","tokenCreateSuccess":"Token创建成功","tokenCreateFailed":"Token创建失败","tokenUpdateSuccess":"Token更新成功","tokenUpdateFailed":"Token更新失败","tokenDeleteConfirm":"此操作将永久删除该Token,是否继续?","tokenDeleteConfirmTitle":"提示","tokenDeleteConfirmOk":"确定","tokenDeleteConfirmCancel":"取消","tokenDeleteSuccess":"Token删除成功","tokenDeleteFailed":"Token删除失败","tokenListFailed":"获取Token列表失败","passwordUrlReserved":"密码不能包含部分URL保留字符: % & ? # /","confirmUploadPassword":"请再次输入上传密码","confirmAdminPassword":"请再次输入管理密码","passwordMismatch":"两次输入密码不一致","passwordUnchanged":"未修改(留空保持原密码)","adminPasswordChangedRelogin":"管理端密码已修改,即将跳转到登录页","clearPassword":"清除认证信息","tokenNameRequired":"请输入Token名称","permissionsRequired":"请选择权限","validPeriodRequired":"有效期数值必须大于 0","timeUnitSeconds":"秒","timeUnitMinutes":"分钟","timeUnitHours":"小时","timeUnitDays":"天","timeUnitMonths":"月","timeUnitYears":"年","sessionSecurityPolicy":"会话安全策略","secureMode":"Secure 模式","secureModeTooltip":"开启后,Cookie 仅通过 HTTPS 连接传输,请确保您的站点已启用 HTTPS","userSessionMaxAge":"用户端会话有效期","adminSessionMaxAge":"管理端会话有效期","sessionMaxAgeUnit":"天","sessionMaxAgeInvalid":"会话有效期必须为 1-3650 的正整数"},"sysPage":{"settingsSaved":"设置已保存","otherSettings":"其他设置","channelSelectPlaceholder":"请先选择上传渠道"},"sysOthers":{"remoteTelemetry":"远端遥测","remoteTelemetryTooltip":"便于问题查找和定位,建议开启","enable":"启用","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
      建议设置,设置方式请查阅文档","zoneId":"区域ID","accountEmail":"账户邮箱","randomImageApi":"随机图像API","randomImageApiTooltip":"API具体用法请查阅文档","directory":"目录","directoryTooltip":"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
      2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问","publicBrowse":"访客图库","publicBrowseTooltip":"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)","openDirectory":"开放目录","openDirectoryTooltip":"

      允许公开浏览的目录,多个目录用逗号分隔

      示例:wallpaper,photos,album

      支持子目录:2026/lucky,2026/rich

      访问链接:https://你的域名/browse/2026/lucky

      ","webdav":"WebDAV","webdavTooltip":"启用后,可以通过WebDAV协议访问和管理图片","webdavUsername":"用户名","webdavPassword":"密码","webdavUploadChannel":"上传渠道","webdavDefaultChannel":"默认渠道","webdavChannelName":"指定渠道名","settingsSaved":"设置已保存"},"customerConfig":{"uploadFileList":"上传文件列表","fileNameCol":"文件名","filePreview":"文件预览","uploadTimeCol":"上传时间","ipAddress":"IP地址","address":"地址","uploadCount":"上传次数","allowUpload":"允许上传","allow":"允许","deny":"禁止","loadMore":"加载更多","loadError":"加载更多数据时出错,请检查网络连接","syncError":"同步数据时出错,请检查网络连接"},"publicBrowse":{"searchPlaceholder":"搜索文件名 或 #页码","fileCount":"{count} 个文件","loading":"加载中...","retry":"重试","creditText":"该图库由林酱贡献代码","loadingMore":"加载中...","allLoaded":"已加载全部","creditLink":"林酱贡献","browseDisabled":"公开浏览功能未启用","directoryNotAllowed":"该目录不允许公开访问","accessDenied":"访问被拒绝","loadFailed":"加载失败,请重试","rootDirectory":"根目录","copyLink":"复制链接","copied":"已复制","downloadBtn":"下载","swipeHint":"← 滑动切换 →","rotate90":"旋转90°"},"transformMedia":{"download":"下载","playbackSpeed":"播放速度","normalSpeed":"正常","playMode":"播放模式","stopAfterPlay":"播完停止","sequentialPlay":"顺序播放","loopSingle":"单曲循环","more":"更多"},"directoryTree":{"selectDirectory":"选择目录","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadFailed":"加载目录树失败,请检查网络连接"},"floatingSave":{"saving":"保存中","save":"保存"},"theme":{"lightMode":"浅色模式","darkMode":"深色模式","autoMode":"自动模式"},"common":{"confirm":"确定","cancel":"取消","close":"关闭","save":"保存","delete":"删除","edit":"编辑","copy":"复制","download":"下载","retry":"重试","loading":"加载中...","success":"成功","failed":"失败","warning":"警告","info":"提示","yes":"是","no":"否","all":"全部类型","select":"请选择"},"validation":{"pathMustStartWithSlash":"目标目录必须以 \\"/\\" 开头","pathTraversalNotAllowed":"目标目录不能包含路径穿越字符 \\"..\\"","singleDotNotAllowed":"目标目录不能包含单独的 \\".\\" 路径段","consecutiveSlashNotAllowed":"目标目录不能包含连续的斜杠","invalidCharacters":"目标目录包含非法字符,请使用合法的路径格式","uploadDirReplace":"上传目录"},"language":{"switchTo":"中/En","switchLanguage":"切换语言"},"whitelist":{"title":"白名单模式已启用","description":"抱歉,当前已开启白名单模式,上传的图片需要审核通过后才能展示,请等待审核通过后再进行访问。","goHome":"返回首页","goBack":"返回上页","helpText":"您可以尝试:","uploadImage":"图片上传","refreshPage":"刷新页面"}}'),l=JSON.parse('{"login":{"title":"Login to {owner} ImgHub","adminTitle":"Admin Login","password":"Password","username":"Username","passwordPlaceholder":"Enter auth code","usernamePlaceholder":"Enter username","adminPasswordPlaceholder":"Enter password","submit":"Login","success":"Login successful","failed":"Login failed, please check your password","adminFailed":"Invalid username or password","serverError":"Server error","systemError":"System error","authRequired":"Please authenticate first!","authFailed":"Authentication failed!"},"upload":{"folderPlaceholder":"Upload directory","pasteUpload":"Paste Upload","fileUpload":"File Upload","dragUploadText":"Drag Click or Ctrl + V to paste upload","pasteUrlPlaceholder":"Paste external links, separate multiple links with line breaks","pasteUploadBtn":"Upload","pasteSave":"Save","pasteExternal":"External","history":"Upload History","announcement":"Announcements","noAnnouncement":"No announcements","announcementTitle":"Announcement","announcementAck":"Got it!","settings":"Upload Settings","linkFormat":"Link Format","manage":"Management","logout":"Logout","logoutSuccess":"Logged out","viewDocs":"Documentation","switchUploadMethod":"Switch Upload Method","copyAll":"Copy All","retryFailed":"Retry Failed","clearList":"Clear List","clearAll":"Clear All","clearUploaded":"Clear Uploaded"},"uploadForm":{"deleted":"{name} deleted","uploadSuccess":"{name} uploaded successfully","uploadFailed":"{name} upload failed","compressFailedCannotUpload":"{name} compression failed, cannot upload!","fileTooLarge":"{name} file too large, cannot upload!","compressedFileTooLarge":"{name} still too large after compression, cannot upload!","copySuccess":"Copied successfully","copyFailed":"Copy failed","copyAllSuccess":"All copied successfully","fileNotUploaded":"File not uploaded, cannot copy link","fileListCleared":"File list cleared","fileListEmpty":"File list is empty","successFilesCleared":"Uploaded files cleared","successFilesEmpty":"No uploaded files","noFailedFiles":"No failed files","autoRetryOn":"Auto retry enabled","autoRetryOff":"Auto retry disabled","autoRetry":"Auto Retry","maxRetryReached":"{name} reached max retry limit ({max}), stopping","urlRequestFailed":"URL request from clipboard failed","chunkMerging":"Chunk upload complete, merging file, please wait...","fileSizeTooLarge":"File too large","chunkInitFailed":"Failed to init chunked upload","uploadError":"Upload error occurred","imageLoadFailed":"Image load failed"},"uploadSettings":{"title":"Upload Settings","uploadChannel":"Upload Channel","channelType":"Channel Type","channelName":"Channel Name","channelNameTooltip":"Select a specific channel name. If not selected, load balancing or default channel will be used","autoSelect":"Auto Select","uploadDirectory":"Upload Directory","uploadDirectoryPlaceholder":"Enter upload directory path","autoSwitch":"Auto Switch","autoSwitchTooltip":"For non-chunked uploads, automatically switch to another channel on failure","fileNaming":"File Naming","namingDefault":"Default","namingIndex":"Prefix Only","namingOrigin":"Original Name","namingShort":"Short Link","filePreprocess":"File Preprocessing","filePreprocessTooltip":"Convert format and compress locally before upload, only applies to image files","convertToWebp":"Convert to WebP","convertToWebpTooltip":"Convert images to WebP format before upload to reduce file size. Falls back to original format on failure","fileCompress":"File Compression","compressThreshold":"Compression Threshold","compressThresholdTooltip":"Set image size threshold, files exceeding this will be auto-compressed (MB)","expectedSize":"Expected Size","expectedSizeTooltip":"Set expected image size after compression (MB)","serverCompress":"Server-side Compression","serverCompressTooltip":"1. Compress on Telegram side, only applies to image files uploaded via Telegram channel
      2. If image size (after local compression) exceeds 10MB, this setting is ignored
      3. For high-resolution, transparent background images, it\'s recommended to disable server compression to avoid issues","enableCompress":"Enable Compression","confirm":"OK"},"uploadHistory":{"title":"History","totalRecords":"{count} records","switchView":"Switch View","clearRecords":"Clear Records","loading":"Loading...","pullToLoadMore":"Pull to load more","noMoreRecords":"No more records","emptyHistory":"No upload history","linkCopied":"Link copied","copyFailed":"Copy failed","clearConfirmTitle":"Notice","clearConfirmMessage":"Are you sure you want to clear all upload records?","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","recordsCleared":"Records cleared","deleteConfirmMessage":"Are you sure you want to delete this record?","recordDeleted":"Record deleted"},"settings":{"linkFormatTitle":"Link Format Settings","defaultCopyLink":"Default Copy Format","rawLink":"Raw Link","customLink":"Custom Link","customLinkTooltip":"Default link is https://your.domain/file/xxx.jpg
      If custom link format is enabled, only the xxx.jpg part is kept, please enter the rest manually","enableCustom":"Enable Custom","customPrefix":"Custom Prefix","customPrefixPlaceholder":"Enter custom link prefix","confirm":"OK","s3Link":"S3 Link"},"dashboard":{"searchPlaceholder":"Search: #tag -#exclude","sortByDateDesc":"Sort by date (newest)","sortByNameAsc":"Sort by name (A-Z)","selectedItems":"selected","clearSelection":"Clear selection","copy":"Copy","delete":"Delete","download":"Download","move":"Move","tagManagement":"Tag Management","addToBlacklist":"Add to Blacklist","addToWhitelist":"Add to Whitelist","linkFormat":"Link Format","listView":"List View","cardView":"Card View","logout":"Logout","rootDirectory":"Root","totalFiles":"{count} files","noMatchingFiles":"No matching files or folders found","currentDirEmpty":"Current directory is empty","adjustSearchHint":"Try adjusting search criteria or filters","uploadHint":"Uploaded files will appear here","loadMore":"Load More","totalPages":"{count} pages","jumpTo":"Go to","preview":"Preview","fileName":"File Name","tags":"Tags","channelType":"Channel Type","channelNameCol":"Channel Name","uploadAddress":"Upload Address","fileSize":"Size","uploadTime":"Upload Time","actions":"Actions","externalTag":"External","unknownTag":"Unknown","detail":"Detail","copyLink":"Copy Link","moveFile":"Move","downloadFile":"Download","loadFailed":"Load failed","copySuccess":"Copied successfully","copyFailed":"Copy failed","deleteConfirm":"This will permanently delete this file. Continue?","deleteConfirmTitle":"Notice","deleteConfirmOk":"OK","deleteConfirmCancel":"Cancel","deleteSuccess":"Deleted successfully","deleteFailed":"Delete failed","blockConfirm":"This will add the file to blacklist. Continue?","blockSuccess":"Added to blacklist successfully","blockFailed":"Failed to add to blacklist","whiteConfirm":"This will add the file to whitelist. Continue?","whiteSuccess":"Added to whitelist successfully","whiteFailed":"Failed to add to whitelist","deleteFolderConfirm":"This will permanently delete this folder. Continue?","deleteFileConfirm":"This will permanently delete this file. Continue?","batchDeleteConfirm":"This will permanently delete selected files and folders. Continue?","batchDeleteSuccess":"Batch delete successful","batchDeleteFailed":"Batch delete failed","batchBlockConfirm":"This will add selected files to blacklist. Continue?","batchBlockSuccess":"Batch blacklist successful","batchBlockFailed":"Batch blacklist failed","batchWhiteConfirm":"This will add selected files to whitelist. Continue?","batchWhiteSuccess":"Batch whitelist successful","batchWhiteFailed":"Batch whitelist failed","noLinksAvailable":"No links to copy","batchCopySuccess":"Copied {count} links successfully","batchCopyFailed":"Batch copy failed, please retry","batchCopyLinksSuccess":"Batch copy successful","copyFileLinkSuccess":"File link copied","fileListMemoryCacheWarning":"The file list is large, so it is being kept in memory. Refreshing the page will require loading it again.","indexingWarning":"The index is still building, so current search and sort results may be inaccurate. Please try again later.","loadMoreFailed":"Failed to load more files, please check network","moveSuccess":"Moved successfully","moveFailed":"Move failed","moveTargetSameAsCurrent":"Target folder cannot be the current folder","invalidPageNumber":"Please enter a valid page number","pageExceedsMax":"Page number cannot exceed {max}","loadingData":"Loading data, please wait...","loadDataFailed":"Failed to load data, please check network","fetchFileListFailed":"Failed to fetch file list","refreshFailed":"Refresh failed, please retry","selectFilesFirst":"Please select files first","syncDataError":"Error syncing data, please check network","fetchingFileList":"Fetching file list...","folderEmptyNoLinks":"Folder is empty, no links to copy","copiedFileLinks":"Copied {count} file links","copyFolderLinksFailed":"Failed to copy folder links, please retry"},"dashboardTabs":{"fileManagement":"File Management","userManagement":"User Management","systemSettings":"System Settings","fileUpload":"File Upload"},"fileDetail":{"title":"File Details","download":"Download","tags":"Tags","blacklist":"Blacklist","whitelist":"Whitelist","deleteBtn":"Delete","edit":"Edit","rename":"Rename","save":"Save","cancel":"Cancel","originUrl":"Original Link","fileNameLabel":"File Name","fileNamePlaceholder":"Enter file name","fileType":"File Type","fileTypePlaceholder":"e.g. image/jpeg","fileSizeLabel":"File Size","imageDimensions":"Dimensions","noDimensions":"N/A","uploadTimeLabel":"Upload Time","channelTypeAndName":"Channel Type/Name","accessStatusAndReview":"Access Status/Review","uploadIP":"Upload IP","uploadAddressLabel":"Upload Address","fileTags":"File Tags","noTags":"No tags","unknown":"Unknown","accessNormal":"Normal","accessNormalWhitelist":"Normal (Whitelisted)","accessBlockedBlacklist":"Blocked (Blacklisted)","accessBlockedReview":"Blocked (Review rejected)","orientationLandscape":"Landscape","orientationPortrait":"Portrait","orientationSquare":"Square","linkCopied":"Link copied","metadataSaved":"Metadata saved successfully","metadataSaveFailed":"Failed to save metadata","renameTitle":"Rename File ID","renameLabel":"New File ID","renamePlaceholder":"Enter new File ID","renameCancel":"Cancel","renameConfirm":"Confirm Rename","renameSuccess":"File renamed successfully","renameConflict":"Target file name already exists","renameFailed":"Rename failed"},"filter":{"accessStatus":"Access Status","normal":"Normal","blocked":"Blocked","blackWhiteList":"Black/White List","whiteList":"Whitelist","blackList":"Blacklist","notSet":"Not Set","reviewResult":"Review Result","teenContent":"12+ Content","adultContent":"Adult Content","fileType":"File Type","image":"Image","video":"Video","audio":"Audio","other":"Other","channelType":"Channel Type","externalLink":"External Link","channelName":"Channel Name","clearFilters":"Clear Filters"},"moveFile":{"title":"Move File","batchTitle":"Batch Move Files","targetDirectory":"Target Directory","targetPlaceholder":"Enter target directory path","hint":"Tip: Paths starting with / indicate root directory, e.g. /photos/2024/","hintMobile":"Tip: Paths starting with / indicate root directory","selectDirectory":"Select Directory","cancel":"Cancel","confirm":"OK","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadTreeFailed":"Failed to load directory tree, please check network connection"},"batchTag":{"title":"Batch Tag Management","addTab":"Add","removeTab":"Remove","clearTab":"Clear","addDescription":"Add tags to {count} selected files","inputPlaceholder":"Enter tag name","pendingTags":"Tags to add","noPendingTags":"No tags to add","addToAllFiles":"Add to all files","removeDescription":"Remove common tags from selected files","commonTags":"Common Tags","noCommonTags":"Selected files have no common tags","clearDescription":"Clear all tags from {count} selected files","clearWarningTitle":"⚠️Warning","clearWarningDesc":"This will clear all tags from selected files and cannot be undone","confirmClearAll":"Confirm clear all tags","tagAlreadyInList":"Tag already in list","pleaseAddTags":"Please add tags first","addSuccess":"Tags added to {count} files successfully","addFailed":"Batch tag addition failed","removeSuccess":"Tags removed from {count} files successfully","removeFailed":"Tag removal failed","clearConfirmMessage":"Are you sure you want to clear all tags from {count} selected files? This cannot be undone.","clearConfirmTitle":"Confirm Clear","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","clearCancelled":"Clear operation cancelled","clearSuccess":"Tags cleared from {count} files successfully","clearFailed":"Failed to clear tags","loadCommonTagsFailed":"Failed to load common tags"},"tagManagement":{"title":"Tag Management","inputPlaceholder":"Enter tag name","currentTags":"Current Tags","noTags":"No tags","popularTags":"Popular Tags","loading":"Loading...","noPopularTags":"No popular tags","close":"Close","tagExists":"Tag already exists","addSuccess":"Tag added successfully","addFailed":"Failed to add tag","removeSuccess":"Tag removed successfully","removeFailed":"Failed to remove tag","loadFailed":"Failed to load tags"},"mobileAction":{"viewDetail":"View Details","copyLink":"Copy Link","downloadFile":"Download File","moveFile":"Move File","tagManagement":"Tag Management","moveFolder":"Move Folder","deleteFile":"Delete File","deleteFolder":"Delete Folder"},"mobileDirectory":{"title":"Directory Navigation","rootDirectory":"Root","goBack":"Go Back"},"sysConfig":{"logout":"Logout"},"sysConfigTabs":{"systemStatus":"System Status","uploadSettings":"Upload Settings","securitySettings":"Security Settings","pageSettings":"Page Settings","otherSettings":"Other Settings"},"dateRangeCalendar":{"previousMonth":"Previous month","nextMonth":"Next month","startDate":"Start date","endDate":"End date","rangeSeparator":"to","monthTitle":"{year}-{month}","weekdaySun":"Sun","weekdayMon":"Mon","weekdayTue":"Tue","weekdayWed":"Wed","weekdayThu":"Thu","weekdayFri":"Fri","weekdaySat":"Sat"},"sysStatus":{"totalFiles":"Total Files","clickToRefresh":"Click to refresh","indexUpdateTime":"Index Update Time","systemVersion":"System Version","clickToViewChangelog":"Click to view changelog","channelDistribution":"Upload Channel Distribution","fileStatusDistribution":"File Status Distribution","uploadTrend":"Upload Trend","uploadTrendGroupBy":"Upload trend group by","totalUploads":"Total Uploads","byChannelType":"Channel Type","byChannelName":"Channel Name","selectDateRange":"Select date range","otherChannels":"Other","uploadsUnit":"uploads","noData":"No data","totalFilesLabel":"Total Files","statusTypes":"Status Types","systemMaintenance":"System Maintenance","rebuildIndex":"Rebuild Index","rebuilding":"Rebuilding...","rebuildTooltip":"Rescan all files and update index data, useful for fixing data inconsistencies","backupData":"Backup Data","backingUp":"Backing up...","backupTooltip":"Backup all file metadata and system settings to a JSON file","restoreData":"Restore Data","restoring":"Restoring...","restoreTooltip":"Restore data from a backup file, this will overwrite existing file metadata and system settings","cancelOperation":"Cancel Operation","retry":"Retry","close":"Close","records":"records","aboutToComplete":"Almost done","seconds":"~{count} seconds","minutes":"~{count} minutes","hoursMinutes":"~{hours} hours {minutes} minutes","phaseFetching":"Fetching data","phaseSorting":"Sorting","phaseUploading":"Uploading","phaseFinalizing":"Finalizing","phaseBuilding":"Building backup","phaseDownloading":"Generating download","phaseRestoringFiles":"Restoring files","phaseRestoringSettings":"Restoring settings","phaseCompleted":"Completed","phaseRetrying":"Retrying","rebuildSuccess":"Index rebuild complete! Processed {count} files","backupSuccess":"Backup complete! Backed up {count} files","backupSuccessWithSettings":"Backup complete! Backed up {fileCount} files and {settingsCount} settings","operationInProgress":"An operation is already in progress","selectJsonFile":"Please select a JSON backup file","restoreConfirmMessage":"Restoring will overwrite existing file metadata and system settings. This cannot be undone. Continue?","restoreConfirmTitle":"Confirm Restore","restoreConfirmOk":"Confirm Restore","restoreConfirmCancel":"Cancel","invalidBackupFile":"Invalid backup file format, please select a valid JSON file","restoreSuccess":"Restore complete! Restored {files} files and {settings} settings, rebuilding index...","restoreFailed":"Failed to restore data","fetchIndexFailed":"Failed to fetch index information","unknown":"Unknown","blocked":"Blocked","normalStatus":"Normal","latestUpload":"Latest Upload","earliestUpload":"Earliest Upload","daysAgo":"{count} days ago","hoursAgo":"{count} hours ago","minutesAgo":"{count} minutes ago","justNow":"Just now","cancellingRebuild":"Cancelling index rebuild..."},"sysUpload":{"title":"Upload Channel Management","titleTooltip":"Manage all upload channel configurations. Click a card to view details or edit","filterPlaceholder":"Filter channel type","addChannel":"Add Channel","loadBalance":"Load Balance","unnamedChannel":"Unnamed Channel","envVariable":"Environment Variable","noChannels":"No {type} channels","detail":"Detail","editBtn":"Edit","deleteBtn":"Delete","addDialogTitle":"Add New Channel","channelTypeLabel":"Channel Type","channelTypePlaceholder":"Select channel type","channelNameLabel":"Channel Name","channelNamePlaceholder":"Enter channel name","channelNameImmutableTip":"After creation, this becomes the unique identifier for files associated with the channel and cannot be changed","channelNameEditDisabledTip":"The channel name links uploaded files to this channel and cannot be changed","botTokenLabel":"Bot Token","botTokenPlaceholder":"Enter Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"Enter Chat ID","proxyDomain":"Proxy Domain","proxyDomainPlaceholder":"Optional, e.g.: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"e.g.: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN Domain","cdnDomainPlaceholder":"Optional. Enter the full CDN URL prefix, e.g. https://cdn.example.com","cdnDomainTip":"Optional. Can be used to generate and display file access links. Server-side file reads also try the CDN first.","bucketName":"Bucket Name","bucketNamePlaceholder":"Enter bucket name","bucketRegion":"Bucket Region","bucketRegionPlaceholder":"Default: auto","accessKeyId":"Access Key ID","accessKeyIdPlaceholder":"Enter Access Key ID","secretAccessKey":"Secret Access Key","secretAccessKeyPlaceholder":"Enter Secret Access Key","pathStyle":"Path Style","pathStyleTip":"Enable when using services incompatible with host-style like OpenList","quotaLimit":"Quota Limit","quotaLimitGB":"Quota Limit (GB)","quotaThreshold":"Disable Threshold (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"Enter Channel ID","nitroMember":"Nitro Member","nitroTip":"Nitro members: 25MB per file, otherwise 10MB","discordWarning":"Discord has API rate limits, not recommended for high-concurrency scenarios","repoName":"Repository Name","repoNamePlaceholder":"Format: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"Enter Access Token","privateRepo":"Private Repository","privateRepoTip":"Private repository limit: 100GB","webdavBaseUrl":"WebDAV Base URL","webdavBaseUrlPlaceholder":"e.g.: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"Username","webdavUsernamePlaceholder":"Optional username","webdavPassword":"Password","webdavPasswordPlaceholder":"Optional password","webdavPublicUrlPlaceholder":"Optional. Enter the full public URL prefix, e.g. https://cdn.example.com/imgbed","webdavPublicUrlTip":"Optional. Server-side file reads try this public URL first and fall back to the WebDAV API on failure.","webdavHeaders":"Custom Headers","webdavHeadersPlaceholder":"Optional JSON object, e.g.: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"Custom headers must be a valid JSON object","webdavCreateDirectory":"Auto Create Directories","webdavCreateDirectoryTip":"Create parent directories before uploading files","cancel":"Cancel","confirmAdd":"Confirm Add","detailDialogTitle":"Channel Details - {name}","channelNameDetail":"Channel Name","channelTypeDetail":"Channel Type","statusLabel":"Status","enabled":"Enabled","disabled":"Disabled","configSource":"Config Source","publicUrl":"Public Access URL","notSet":"Not Set","isPathStyle":"Yes","isNotPathStyle":"No","currentUsage":"Current Usage","closeBtn":"Close","editDialogTitle":"Edit Channel - {name}","enableChannel":"Enable Channel","saveChanges":"Save Changes","r2ConfigNote":"Please follow the R2 Channel Configuration documentation to add R2 channels","reservedName":"This name is reserved by the system, please use another name","duplicateName":"A channel with this name already exists, please use another name","fixedChannelCannotDelete":"Channels configured via environment variables cannot be deleted","deleteChannelConfirm":"Are you sure you want to delete this channel? Files still associated with it may become inaccessible.","quotaInitConfirm":"First time enabling quota requires calculating existing file sizes, this may take some time. Calculate now?","quotaInitTitle":"Initialize Quota Statistics","quotaInitConfirmBtn":"Calculate Now","quotaInitCancelBtn":"Calculate Later","quotaInitLater":"You can click the refresh button to calculate later","quotaCalculating":"Calculating quota, please wait...","quotaCalculateSuccess":"Quota calculation complete","quotaCalculateFailed":"Calculation failed","quotaCalculateError":"Calculation failed: "},"sysSecurity":{"authManagement":"Authentication Management","userAuth":"User Authentication","adminAuth":"Admin Authentication","uploadPassword":"Upload Password","confirmPassword":"Confirm Password","adminUsername":"Username","adminPassword":"Password","apiTokenManagement":"API Token Management","imageReview":"Image Review","imageReviewTooltip":"Only applies to non-chunked uploads, supports nsfwjs and moderatecontent.com channels","enableReview":"Enable Review","reviewChannel":"Review Channel","reviewChannelPlaceholder":"Select review channel","apiKey":"API Key","apiPath":"API Path","ipQuery":"IP Geolocation Query","ipQueryTooltip":"Calls a custom API during upload to query the upload IP location. Parameter values support the {\'{ip}\'} placeholder","enableIpQuery":"Enable Query","ipQueryChannel":"Query Channel","ipQueryChannelPlaceholder":"Select query channel","customApi":"Custom API","queryParams":"Query Parameters","paramNamePlaceholder":"Parameter name","paramValuePlaceholder":"Parameter value, e.g. {\'{ip}\'}","addQueryParam":"Add Parameter","responseFields":"Response Fields","responseFieldsTip":"The final display text is joined in field order","responseFieldPathPlaceholder":"JSON path, e.g. country.name","addResponseField":"Add Field","uploadManagement":"Upload Management","accessManagement":"Access Management","domainFilter":"Domain Filter","allowedDomains":"Allowed Domains","allowedDomainsTooltip":"1. Set permissions based on access domain
      2. Leave empty to allow all, separate multiple domains with commas","whiteListMode":"Whitelist Mode","enableWhiteList":"Enable","enableWhiteListTooltip":"1. Set permissions based on files
      2. When enabled, only whitelisted files can be accessed","settingsSaved":"Settings saved","tokenName":"Name","tokenValue":"Token","permissions":"Permissions","createdAt":"Created At","status":"Status","expiresAt":"Expires At","operation":"Actions","editBtn":"Edit","deleteBtn":"Delete","permUpload":"Upload","permDelete":"Delete","permList":"List","permManage":"Manage","createTokenTitle":"Create New API Token","tokenNameLabel":"Token Name","tokenNamePlaceholder":"Enter token name","permissionsLabel":"Permissions","neverExpire":"Never Expire","validPeriod":"Valid Period","autoDeleteOnExpire":"Auto-delete on expiry","createBtn":"Create","editTokenTitle":"Edit API Token","updateBtn":"Update","tokenCreatedTitle":"Token Created Successfully","tokenCreatedWarning":"Please save the following token. You won\'t be able to view the full token after closing this dialog!","fullToken":"Full Token","copyBtn":"Copy","savedBtn":"I\'ve Saved It","tokenCopied":"Token copied to clipboard","copyFailed":"Copy failed, please copy manually","tokenCreateSuccess":"Token created successfully","tokenCreateFailed":"Failed to create token","tokenUpdateSuccess":"Token updated successfully","tokenUpdateFailed":"Failed to update token","tokenDeleteConfirm":"This will permanently delete this token. Continue?","tokenDeleteConfirmTitle":"Notice","tokenDeleteConfirmOk":"OK","tokenDeleteConfirmCancel":"Cancel","tokenDeleteSuccess":"Token deleted successfully","tokenDeleteFailed":"Failed to delete token","tokenListFailed":"Failed to fetch token list","passwordUrlReserved":"Password cannot contain URL reserved characters: % & ? # /","confirmUploadPassword":"Please re-enter upload password","confirmAdminPassword":"Please re-enter admin password","passwordMismatch":"Passwords do not match","passwordUnchanged":"Unchanged (leave empty to keep current password)","adminPasswordChangedRelogin":"Admin password changed, redirecting to login page","clearPassword":"Clear authentication info","tokenNameRequired":"Please enter token name","permissionsRequired":"Please select permissions","validPeriodRequired":"Valid period must be greater than 0","timeUnitSeconds":"seconds","timeUnitMinutes":"minutes","timeUnitHours":"hours","timeUnitDays":"days","timeUnitMonths":"months","timeUnitYears":"years","sessionSecurityPolicy":"Session Security Policy","secureMode":"Secure Mode","secureModeTooltip":"When enabled, cookies are only transmitted over HTTPS. Make sure your site has HTTPS enabled","userSessionMaxAge":"User Session Max Age","adminSessionMaxAge":"Admin Session Max Age","sessionMaxAgeUnit":"days","sessionMaxAgeInvalid":"Session max age must be an integer from 1 to 3650"},"sysPage":{"settingsSaved":"Settings saved","otherSettings":"Other Settings","channelSelectPlaceholder":"Please select upload channel first"},"sysOthers":{"remoteTelemetry":"Remote Telemetry","remoteTelemetryTooltip":"Helps with issue tracking and debugging, recommended to enable","enable":"Enable","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"When set, backend operations like blocking and deleting won\'t be affected by CDN cache
      Recommended, see documentation for setup","zoneId":"Zone ID","accountEmail":"Account Email","randomImageApi":"Random Image API","randomImageApiTooltip":"See documentation for API usage details","directory":"Directory","directoryTooltip":"1. Directories with random image access, defaults to root. Separate multiple directories with commas
      2. All directories use absolute paths, e.g. /img/cover, meaning files in this directory and all subdirectories can be accessed by the random image API","publicBrowse":"Public Gallery","publicBrowseTooltip":"When enabled, visitors can browse images in specified directories via /browse path (read-only, no delete/move)","openDirectory":"Open Directory","openDirectoryTooltip":"

      Directories open for public browsing, separate multiple with commas

      Example: wallpaper,photos,album

      Supports subdirectories: 2026/lucky,2026/rich

      Access URL: https://your.domain/browse/2026/lucky

      ","webdav":"WebDAV","webdavTooltip":"When enabled, images can be accessed and managed via WebDAV protocol","webdavUsername":"Username","webdavPassword":"Password","webdavUploadChannel":"Upload Channel","webdavDefaultChannel":"Default Channel","webdavChannelName":"Specified Channel","settingsSaved":"Settings saved"},"customerConfig":{"uploadFileList":"Upload File List","fileNameCol":"File Name","filePreview":"File Preview","uploadTimeCol":"Upload Time","ipAddress":"IP Address","address":"Address","uploadCount":"Upload Count","allowUpload":"Allow Upload","allow":"Allow","deny":"Deny","loadMore":"Load More","loadError":"Error loading more data, please check network connection","syncError":"Error syncing data, please check network connection"},"publicBrowse":{"searchPlaceholder":"Search file name or #page","fileCount":"{count} files","loading":"Loading...","retry":"Retry","creditText":"Gallery code contributed by LinJiang","loadingMore":"Loading...","allLoaded":"All loaded","creditLink":"LinJiang","browseDisabled":"Public browsing is not enabled","directoryNotAllowed":"This directory is not open for public access","accessDenied":"Access denied","loadFailed":"Load failed, please retry","rootDirectory":"Root","copyLink":"Copy Link","copied":"Copied","downloadBtn":"Download","swipeHint":"← Swipe to navigate →","rotate90":"Rotate 90°"},"transformMedia":{"download":"Download","playbackSpeed":"Playback Speed","normalSpeed":"Normal","playMode":"Play Mode","stopAfterPlay":"Stop After Play","sequentialPlay":"Sequential Play","loopSingle":"Loop Single","more":"More"},"directoryTree":{"selectDirectory":"Select Directory","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadFailed":"Failed to load directory tree, please check network connection"},"floatingSave":{"saving":"Saving","save":"Save"},"theme":{"lightMode":"Light Mode","darkMode":"Dark Mode","autoMode":"Auto Mode"},"common":{"confirm":"OK","cancel":"Cancel","close":"Close","save":"Save","delete":"Delete","edit":"Edit","copy":"Copy","download":"Download","retry":"Retry","loading":"Loading...","success":"Success","failed":"Failed","warning":"Warning","info":"Notice","yes":"Yes","no":"No","all":"All Types","select":"Select"},"validation":{"pathMustStartWithSlash":"Path must start with \\"/\\"","pathTraversalNotAllowed":"Path cannot contain \\"..\\"","singleDotNotAllowed":"Path cannot contain standalone \\".\\"","consecutiveSlashNotAllowed":"Path cannot contain consecutive slashes","invalidCharacters":"Path contains invalid characters, please use a valid path format","uploadDirReplace":"Upload directory"},"language":{"switchTo":"中/En","switchLanguage":"Switch Language"},"whitelist":{"title":"Whitelist Mode Enabled","description":"Sorry, the whitelist mode is currently enabled. Uploaded images need to be approved before they can be displayed. Please wait for approval.","goHome":"Go Home","goBack":"Go Back","helpText":"You can try:","uploadImage":"Upload Image","refreshPage":"Refresh Page"}}');const i="app-locale";function r(){const e=localStorage.getItem(i);return"zh-CN"===e||"en"===e?e:"zh-CN"}const s=(0,o.hU)({legacy:!0,locale:r(),fallbackLocale:"zh-CN",messages:{"zh-CN":n,en:l}});function d(e){s.global.locale=e,localStorage.setItem(i,e),document.documentElement.lang="zh-CN"===e?"zh-CN":"en"}var c=s},81525:function(e,a,t){t(18111),t(7588);var o=t(45130),n=t(73888),l=t(18642),i=(t(15412),t(30372),t(98950)),r=t(30292),s=t(47984),d=t(79262),c=t(70193),u=t(55363),m=t(31050),p=t(22909),h=t(10220),g=t(74036),f=t(90389),y=t(81828),b=t(27483),C=t(66806),k=t(61536),T=t(3263),w=t(57038),v=t(63416),S=t(63027),P=t(19223),F=t(93422),A=t(16249),D=t(34335),L=t(14722),U=t(16829),N=t(53916),M=t(48749),I=t(2511),R=t(12375),x=t(97619),B=t(84310),E=t(14552),O=t(79919),W=t(10767),q=t(20491),V=t(18422),j=t(17214),H=t(44845),z=t(55319),K=t(71669),Q=t(38557),J=t(15925),_=t(10798),G=t(39329),Y=t(59708),X=t(41165),$=t(50230),Z=t(99288),ee=t(67992),ae=t(37538),te=t(13118),oe=t(36050),ne=t(69721),le=t(75192),ie=t(50672),re=t(3149),se=t(11221),de=t(73585),ce=t(63236),ue=t(1860),me=t(13110),pe=t(6246),he=t(42302),ge=t(75504),fe=t(40587),ye=t(5299),be=t(81775),Ce=t(13127),ke=t(18742),Te=t(97579),we=t(56746),ve=t(58422),Se=t(20444),Pe=t(88502),Fe=t(21872),Ae=t(64795),De=t(82262),Le=t(88921),Ue=t(39916),Ne=t(18579),Me=t(80500),Ie=t(58428),Re=t(87849),xe=t(78034),Be=t(59413),Ee=t(58869),Oe=t(79102),We=t(78337),qe=t(38870),Ve=t(70577),je=t(93212),He=t(40275),ze=t(52995),Ke=t(38410),Qe=t(167),Je=t(53223),_e=t(97447),Ge=t(67830),Ye=[u.rC,m.UH,p.B0,h.Ce,g.IN,s.xK,f.Df,y.ck,b.LB,C.e4,k.ok,T.$F,w.gK,v.e6,S.rQ,P.Jt,F.Wz,A.Xk,D.B2,L.a$,U.jB,d.ZD,N.wF,M.rO,I.jT,R.Xb,x.dB,B.Ub,E.q9,O.rM,W.jP,q.he,c._2,V.cb,j.MT,H.vH,z.v,K.bx,Q.tU,J.zp,_.A,G.pS,Y.A4,X.h8,$.o1,Z.UD,ee.mR,ae.ao,te.Uj,oe.gD,ne.Bw,le.CY,ie.In,re.v0,se.lS,de.jb,ce.yv,ue.Up,me.iW,pe.CQ,he.IT,ge.EZ,fe.xb,ye.PJ,be.X,Ce.ji,ke.is,Te.R9,we.QL,ve.wR,Se.oE,Pe.ye,Fe.UB,Ae.hS,De.Mj,Le.D6,Ue.QO,Ne.V2,Me.im,Ie.Gx,Re.H9,xe.Yp,Be.z1,Ee.Nf,Oe.oM,We.VN,qe.Ot,Ve.xi,je._2,He.DX,ze.l9,Ke.GR,Qe.ns,Je.Be,_e.Jm,Ge.Mc],Xe=t(97722),$e=(t(85331),t(10961),t(56768));function Ze(e,a,t,o,n,l){const i=(0,$e.g2)("router-view"),r=Xe.H6;return(0,$e.uX)(),(0,$e.Wv)(r,{locale:l.elementLocale},{default:(0,$e.k6)(()=>[(0,$e.bF)(i)]),_:1},8,["locale"])}var ea=t(60782),aa=t(6166),ta=t(55186),oa=t(54791),na={data(){return{osInstance:null,imageViewerObserver:null}},computed:{...(0,ea.L8)(["userConfig","useDarkMode"]),elementLocale(){return"zh-CN"===this.$i18n.locale?ta.A:oa.A}},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars(),this.setupImageViewerObserver()})},beforeUnmount(){this.imageViewerObserver&&this.imageViewerObserver.disconnect()},watch:{},methods:{initOverlayScrollbars(){try{if(aa.ae.valid(document.body))return void(this.osInstance=(0,aa.ae)(document.body));this.osInstance=(0,aa.ae)(document.body,{scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"scroll",autoHideDelay:600,dragScroll:!0,clickScroll:!0},overflow:{x:"hidden",y:"scroll"}}),console.log("OverlayScrollbars initialized successfully")}catch(e){console.error("Failed to initialize OverlayScrollbars:",e)}},setupImageViewerObserver(){this.imageViewerObserver=new MutationObserver(e=>{const a=document.querySelector(".el-image-viewer__wrapper");a?this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"hidden"}}):this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"scroll"}})}),this.imageViewerObserver.observe(document.body,{childList:!0,subtree:!0})}}},la=t(71241);const ia=(0,la.A)(na,[["render",Ze]]);var ra=ia,sa=t(16915),da=t(25507),ca=t(46638),ua=t(57477);t(21862),t(50635);i.Yv.add(...Ye);const ma=(0,o.Ef)(ra),pa=(0,n.Zf)();ma.component("font-awesome-icon",r.gc);for(const[ba,Ca]of Object.entries(ua))ma.component(ba,Ca);const ha=()=>{const e=document.documentElement;let a;if(da.A.state.cusDarkMode&&null!==da.A.state.useDarkMode)a=da.A.state.useDarkMode;else{if(a=window.matchMedia("(prefers-color-scheme: dark)").matches,!a){const e=new Date,t=e.getHours();a=t>=22||t<6}da.A.commit("setUseDarkMode",a)}a?e.classList.add("dark"):e.classList.remove("dark")},ga=e=>{const a=document.documentElement;e?a.classList.add("dark"):a.classList.remove("dark")},fa=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},ya=(e,a)=>{const t=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');t.forEach(e=>e.remove());const o=document.createElement("link"),n=document.createElement("link"),l=document.createElement("link");o.rel="icon",n.rel="apple-touch-icon",l.rel="mask-icon",e?(o.href=a?.siteIcon||"/static/media/logo-dark.png",n.href=a?.siteIcon||"/static/media/logo-dark.png",l.href=a?.siteIcon||"/static/media/logo-dark.png"):(o.href=a?.siteIcon||"/static/media/logo.png",n.href=a?.siteIcon||"/static/media/logo.png",l.href=a?.siteIcon||"/static/media/logo.png"),document.head.appendChild(o),document.head.appendChild(n),document.head.appendChild(l)};da.A.dispatch("fetchUserConfig").then(()=>{ha(),fa(da.A.getters.userConfig),ya(da.A.state.useDarkMode,da.A.getters.userConfig),da.A.subscribe((e,a)=>{"setUseDarkMode"===e.type&&da.A.state.cusDarkMode&&(ga(a.useDarkMode),ya(a.useDarkMode,da.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(ha(),ya(da.A.state.useDarkMode,da.A.getters.userConfig))}),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).use(pa).mount("#app")})}},a={};function t(o){var n=a[o];if(void 0!==n)return n.exports;var l=a[o]={exports:{}};return e[o].call(l.exports,l,l.exports,t),l.exports}t.m=e,function(){var e=[];t.O=function(a,o,n,l){if(!o){var i=1/0;for(c=0;c=l)&&Object.keys(t.O).every(function(e){return t.O[e](o[s])})?o.splice(s--,1):(r=!1,l0&&e[c-1][2]>l;c--)e[c]=e[c-1];e[c]=[o,n,l]}}(),function(){t.n=function(e){var a=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(a,{a:a}),a}}(),function(){t.d=function(e,a){for(var o in a)t.o(a,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:a[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce(function(a,o){return t.f[o](e,a),a},[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{51:"6e7bf298",226:"ec43855c",309:"b7dca603",396:"226339af",528:"f7e99a9f",529:"e05f38bd",600:"08192622",604:"a1f7358f",718:"27080555",728:"3968461e",770:"865557c0",917:"b77a6783"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{51:"1dd65d6c",226:"6548e7b4",396:"3a3d9729",428:"8044ed41",528:"4c6718b2",529:"6c0a8231",604:"1353235b",718:"d0974d1c",728:"1353235b",740:"a94dbb46",770:"37d2e9e0",833:"95983fa6",917:"8529ad1e"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)}}(),function(){var e={},a="sanyue_imghub:";t.l=function(o,n,l,i){if(e[o])e[o].push(n);else{var r,s;if(void 0!==l)for(var d=document.getElementsByTagName("script"),c=0;c{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.adminRequired)return l.A.commit("setAdminLoggedIn",!0),t();if(o.valid&&"admin"===o.authType)return l.A.commit("setAdminLoggedIn",!0),t();const i=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()}).catch(()=>{const a=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()})},d=(e,a,t)=>{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.userRequired)return l.A.commit("setUserLoggedIn",!0),t();if(o.valid)return l.A.commit("setUserLoggedIn",!0),t();const i=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()}).catch(()=>{const a=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()})},c=[{path:"/",name:"home",component:()=>Promise.all([t.e(385),t.e(600),t.e(451),t.e(528)]).then(t.bind(t,74828)),beforeEnter:d},{path:"/login",name:"login",component:()=>Promise.all([t.e(600),t.e(604)]).then(t.bind(t,61880))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([t.e(385),t.e(142),t.e(451),t.e(997)]).then(t.bind(t,20174)),beforeEnter:s},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([t.e(385),t.e(142),t.e(915),t.e(396)]).then(t.bind(t,59396)),beforeEnter:s},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([t.e(385),t.e(142),t.e(915),t.e(529)]).then(t.bind(t,31529)),beforeEnter:s},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([t.e(600),t.e(728)]).then(t.bind(t,16556))},{path:"/blockimg",name:"blockimg",component:()=>t.e(917).then(t.bind(t,74917))},{path:"/whiteliston",name:"whiteliston",component:()=>t.e(51).then(t.bind(t,31051))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>t.e(718).then(t.bind(t,49718))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>t.e(226).then(t.bind(t,68226))}],u=(0,o.aE)({history:(0,o.LA)("/"),routes:c});a.A=u},25507:function(e,a,t){t(18111),t(61701);var o=t(60782),n=t(457),l=t(55131);a.A=(0,o.y$)({state:{userConfig:null,bingWallPapers:[],adminLoggedIn:!1,userLoggedIn:!1,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:void 0,compressQuality:void 0,compressBar:void 0,serverCompress:void 0,convertToWebp:void 0},storeUploadChannel:"",storeChannelName:null,storeAutoRetry:!0,storeUploadNameType:"",uploadFolder:"",customUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},adminUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},autoReUpload:!0,useDarkMode:null,cusDarkMode:!1},getters:{userConfig:e=>e.userConfig,bingWallPapers:e=>e.bingWallPapers,credentials:e=>e.adminLoggedIn?"__session__":null,adminLoggedIn:e=>e.adminLoggedIn,userLoggedIn:e=>e.userLoggedIn,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeChannelName:e=>e.storeChannelName,storeUploadNameType:e=>e.storeUploadNameType,customUrlSettings:e=>e.customUrlSettings,storeAutoRetry:e=>e.storeAutoRetry,adminUrlSettings:e=>e.adminUrlSettings,storeUploadFolder:e=>e.uploadFolder||localStorage.getItem("uploadFolder")||"",useDarkMode:e=>e.useDarkMode,cusDarkMode:e=>e.cusDarkMode,storeAutoReUpload:e=>e.autoReUpload},mutations:{setUserConfig(e,a){e.userConfig=a},setBingWallPapers(e,a){e.bingWallPapers=a},setCredentials(e,a){e.adminLoggedIn=null!==a&&void 0!==a},setAdminLoggedIn(e,a){e.adminLoggedIn=a},setUserLoggedIn(e,a){e.userLoggedIn=a},setUploadMethod(e,a){e.uploadMethod=a},setUploadCopyUrlForm(e,a){e.uploadCopyUrlForm=a},setCompressConfig(e,{key:a,value:t}){e.compressConfig[a]=t},setStoreUploadChannel(e,a){e.storeUploadChannel=a},setStoreChannelName(e,a){e.storeChannelName=a},setStoreUploadNameType(e,a){e.storeUploadNameType=a},setCustomUrlSettings(e,{key:a,value:t}){e.customUrlSettings[a]=t},setStoreAutoRetry(e,a){e.storeAutoRetry=a},setAdminUrlSettings(e,{key:a,value:t}){e.adminUrlSettings[a]=t},setUseDarkMode(e,a){e.useDarkMode=a},setCusDarkMode(e,a){e.cusDarkMode=a},setStoreUploadFolder(e,a){e.uploadFolder=a,localStorage.setItem("uploadFolder",a)},setStoreAutoReUpload(e,a){e.autoReUpload=a}},actions:{async fetchUserConfig({commit:e}){try{const a=await n.A.get("/api/userConfig");e("setUserConfig",a.data)}catch(a){console.log(a)}},async fetchBingWallPapers({commit:e}){try{const a=await n.A.get("/api/bing/wallpaper"),t=a.data.data,o=t.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(o.map(e=>new Promise((a,t)=>{const o=new Image;o.onload=a,o.onerror=t,o.src=e.url}))),e("setBingWallPapers",o)}catch(a){console.log(a)}}},modules:{},plugins:[(0,l.A)({paths:["userConfig","uploadMethod","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode"]})]})},46638:function(e,a,t){t.d(a,{Ay:function(){return c},xS:function(){return d}});var o=t(85384),n=JSON.parse('{"login":{"title":"登录到 {owner} 图床","adminTitle":"管理端登录","password":"密码","username":"用户名","passwordPlaceholder":"请输入认证码","usernamePlaceholder":"请输入用户名","adminPasswordPlaceholder":"请输入密码","submit":"登录","success":"登录成功","failed":"登录失败,请检查密码是否正确","adminFailed":"用户名或密码错误","serverError":"服务器错误","systemError":"系统错误","authRequired":"请先认证!","authFailed":"认证失败!"},"upload":{"folderPlaceholder":"上传目录","pasteUpload":"粘贴上传","fileUpload":"文件上传","dragUploadText":"拖拽 点击Ctrl + V 粘贴上传","pasteUrlPlaceholder":"粘贴外链上传,多个外链用换行分隔","pasteUploadBtn":"上 传","pasteSave":"转存","pasteExternal":"外链","history":"上传记录","announcement":"查看公告","noAnnouncement":"暂无公告","announcementTitle":"公告","announcementAck":"我已知晓!","settings":"上传设置","linkFormat":"链接格式","manage":"系统管理","logout":"退出登录","logoutSuccess":"已退出登录","viewDocs":"查看文档","switchUploadMethod":"切换上传方式","copyAll":"整体复制","retryFailed":"失败重试","clearList":"清空列表","clearAll":"清空全部","clearUploaded":"清空已上传"},"uploadForm":{"deleted":"{name}已删除","uploadSuccess":"{name}上传成功","uploadFailed":"{name}上传失败","compressFailedCannotUpload":"{name}压缩失败,无法上传!","fileTooLarge":"{name}文件过大,无法上传!","compressedFileTooLarge":"{name}压缩后文件过大,无法上传!","copySuccess":"复制成功","copyFailed":"复制失败","copyAllSuccess":"整体复制成功","fileNotUploaded":"文件未上传成功,无法复制链接","fileListCleared":"文件列表已清空","fileListEmpty":"文件列表为空","successFilesCleared":"成功上传文件已清空","successFilesEmpty":"成功上传文件为空","noFailedFiles":"无上传失败文件","autoRetryOn":"自动重试已开启","autoRetryOff":"自动重试已关闭","autoRetry":"自动重试","maxRetryReached":"{name} 已达到最大重试次数({max}),停止重试","urlRequestFailed":"粘贴板中的URL地址请求失败","chunkMerging":"分块上传完成,正在合并文件,请耐心等待...","fileSizeTooLarge":"文件过大","chunkInitFailed":"初始化分块上传失败","uploadError":"上传过程中发生错误","imageLoadFailed":"图片加载失败"},"uploadSettings":{"title":"上传设置","uploadChannel":"上传渠道","channelType":"渠道类型","channelName":"渠道名称","channelNameTooltip":"选择具体的渠道名称,不选择则使用负载均衡或默认渠道","autoSelect":"自动选择","uploadDirectory":"上传目录","uploadDirectoryPlaceholder":"请输入上传目录路径","autoSwitch":"自动切换","autoSwitchTooltip":"对于非分块上传文件,上传失败自动切换到其他渠道上传","fileNaming":"文件命名方式","namingDefault":"默认","namingIndex":"仅前缀","namingOrigin":"仅原名","namingShort":"短链接","filePreprocess":"文件预处理","filePreprocessTooltip":"上传前在本地进行格式转换和压缩,仅对图片文件生效","convertToWebp":"转换为WebP","convertToWebpTooltip":"上传前将图片转换为WebP格式,可有效减小文件体积。转换失败时保持原格式上传","fileCompress":"文件压缩","compressThreshold":"压缩阈值","compressThresholdTooltip":"设置图片大小阈值,超过此值将自动压缩,单位MB","expectedSize":"期望大小","expectedSizeTooltip":"设置压缩后图片大小期望值,单位MB","serverCompress":"服务端压缩","serverCompressTooltip":"1. 在 Telegram 端进行压缩,仅对上传渠道为 Telegram 的图片文件生效
      2. 若图片大小(本地压缩后大小)大于10MB,本设置自动失效
      3. 若上传分辨率过大、透明背景等图片,建议关闭服务端压缩,否则可能出现未知问题","enableCompress":"开启压缩","confirm":"确定"},"uploadHistory":{"title":"历史记录","totalRecords":"共 {count} 条","switchView":"切换视图","clearRecords":"清空记录","loading":"加载中...","pullToLoadMore":"下拉加载更多","noMoreRecords":"没有更多记录了","emptyHistory":"暂无上传记录","linkCopied":"链接已复制","copyFailed":"复制失败","clearConfirmTitle":"提示","clearConfirmMessage":"确定要清空所有上传记录吗?","clearConfirmOk":"确定","clearConfirmCancel":"取消","recordsCleared":"记录已清空","deleteConfirmMessage":"确定要删除这条记录吗?","recordDeleted":"记录已删除"},"settings":{"linkFormatTitle":"链接格式设置","defaultCopyLink":"默认复制链接","rawLink":"原始链接","customLink":"自定义链接","customLinkTooltip":"默认链接为https://your.domain/file/xxx.jpg
      如果启用自定义链接格式,只保留xxx.jpg部分,其他部分请自行输入","enableCustom":"启用自定义","customPrefix":"自定义前缀","customPrefixPlaceholder":"请输入自定义链接前缀","confirm":"确定","s3Link":"S3链接"},"dashboard":{"searchPlaceholder":"搜索:#标签 -#排除标签","sortByDateDesc":"按时间倒序","sortByNameAsc":"按名称升序","selectedItems":"项已选","clearSelection":"清除选择","copy":"复制","delete":"删除","download":"下载","move":"移动","tagManagement":"标签管理","addToBlacklist":"加入黑名单","addToWhitelist":"加入白名单","linkFormat":"链接格式","listView":"列表视图","cardView":"卡片视图","logout":"退出登录","rootDirectory":"根目录","totalFiles":"共 {count} 个文件","noMatchingFiles":"未找到匹配的文件或文件夹","currentDirEmpty":"当前目录为空","adjustSearchHint":"尝试调整搜索条件或筛选器","uploadHint":"上传文件后将显示在这里","loadMore":"加载更多","totalPages":"共 {count} 页","jumpTo":"跳至","preview":"预览","fileName":"文件名","tags":"标签","channelType":"渠道类型","channelNameCol":"渠道名称","uploadAddress":"上传地址","fileSize":"大小","uploadTime":"上传时间","actions":"操作","externalTag":"外链","unknownTag":"未知","detail":"详情","copyLink":"复制链接","moveFile":"移动","downloadFile":"下载","loadFailed":"加载失败","copySuccess":"复制成功","copyFailed":"复制失败","deleteConfirm":"此操作将永久删除该文件, 是否继续?","deleteConfirmTitle":"提示","deleteConfirmOk":"确定","deleteConfirmCancel":"取消","deleteSuccess":"删除成功","deleteFailed":"删除失败","blockConfirm":"此操作将把该文件加入黑名单, 是否继续?","blockSuccess":"加入黑名单成功","blockFailed":"加入黑名单失败","whiteConfirm":"此操作将把该文件加入白名单, 是否继续?","whiteSuccess":"加入白名单成功","whiteFailed":"加入白名单失败","deleteFolderConfirm":"此操作将永久删除文件夹, 是否继续?","deleteFileConfirm":"此操作将永久删除该文件, 是否继续?","batchDeleteConfirm":"此操作将永久删除选中的文件及文件夹, 是否继续?","batchDeleteSuccess":"批量删除成功","batchDeleteFailed":"批量删除失败","batchBlockConfirm":"此操作将把选中的文件加入黑名单, 是否继续?","batchBlockSuccess":"批量加入黑名单成功","batchBlockFailed":"批量加入黑名单失败","batchWhiteConfirm":"此操作将把选中的文件加入白名单, 是否继续?","batchWhiteSuccess":"批量加入白名单成功","batchWhiteFailed":"批量加入白名单失败","noLinksAvailable":"没有可复制的链接","batchCopySuccess":"批量复制 {count} 个链接成功","batchCopyFailed":"批量复制链接失败,请重试","batchCopyLinksSuccess":"批量复制链接成功","copyFileLinkSuccess":"复制文件链接成功","fileListMemoryCacheWarning":"文件列表较大,已切换为内存缓存;刷新页面后需要重新加载列表。","indexingWarning":"索引构建中,当前搜索和排序结果可能不准确,请稍后再试。","loadMoreFailed":"加载更多文件失败,请检查网络连接","moveSuccess":"移动成功","moveFailed":"移动失败","moveTargetSameAsCurrent":"目标文件夹不能是当前文件夹","invalidPageNumber":"请输入有效的页码","pageExceedsMax":"页码不能超过 {max}","loadingData":"正在加载数据,请稍候...","loadDataFailed":"加载数据失败,请检查网络连接","fetchFileListFailed":"获取文件列表失败","refreshFailed":"刷新失败,请重试","selectFilesFirst":"请先选择文件","syncDataError":"同步数据时出错,请检查网络连接","fetchingFileList":"正在获取文件列表...","folderEmptyNoLinks":"文件夹为空,没有可复制的链接","copiedFileLinks":"已复制 {count} 个文件链接","copyFolderLinksFailed":"复制文件夹链接失败,请重试"},"dashboardTabs":{"fileManagement":"文件管理","userManagement":"用户管理","systemSettings":"系统设置","fileUpload":"文件上传"},"fileDetail":{"title":"文件详情","download":"下载","tags":"标签","blacklist":"黑名单","whitelist":"白名单","deleteBtn":"删除","edit":"编辑","rename":"重命名","save":"保存","cancel":"取消","originUrl":"原始链接","fileNameLabel":"文件名","fileNamePlaceholder":"请输入文件名","fileType":"文件类型","fileTypePlaceholder":"如 image/jpeg","fileSizeLabel":"文件大小","imageDimensions":"图片尺寸","noDimensions":"无","uploadTimeLabel":"上传时间","channelTypeAndName":"渠道类型/名称","accessStatusAndReview":"访问状态/审查","uploadIP":"上传IP","uploadAddressLabel":"上传地址","fileTags":"文件标签","noTags":"暂无标签","unknown":"未知","accessNormal":"正常","accessNormalWhitelist":"正常(白名单)","accessBlockedBlacklist":"已屏蔽(黑名单)","accessBlockedReview":"已屏蔽(审查不通过)","orientationLandscape":"横","orientationPortrait":"竖","orientationSquare":"方","linkCopied":"链接已复制","metadataSaved":"元数据保存成功","metadataSaveFailed":"保存元数据失败","renameTitle":"重命名 File ID","renameLabel":"新 File ID","renamePlaceholder":"请输入新的 File ID","renameCancel":"取消","renameConfirm":"确认重命名","renameSuccess":"文件重命名成功","renameConflict":"目标文件名已存在","renameFailed":"重命名失败"},"filter":{"accessStatus":"访问状态","normal":"正常","blocked":"已屏蔽","blackWhiteList":"黑白名单","whiteList":"白名单","blackList":"黑名单","notSet":"未设置","reviewResult":"审查结果","teenContent":"12+内容","adultContent":"成人内容","fileType":"文件类型","image":"图片","video":"视频","audio":"音频","other":"其他","channelType":"渠道类型","externalLink":"外链","channelName":"渠道名称","clearFilters":"清除筛选"},"moveFile":{"title":"移动文件","batchTitle":"批量移动文件","targetDirectory":"目标目录","targetPlaceholder":"请输入目标目录路径","hint":"提示:路径以 / 开头表示根目录,如 /photos/2024/","hintMobile":"提示:路径以 / 开头表示根目录","selectDirectory":"选择目录","cancel":"取消","confirm":"确定","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadTreeFailed":"加载目录树失败,请检查网络连接"},"batchTag":{"title":"批量标签管理","addTab":"添加","removeTab":"移除","clearTab":"清空","addDescription":"为选中的 {count} 个文件添加标签","inputPlaceholder":"输入标签名称","pendingTags":"待添加的标签","noPendingTags":"暂无待添加标签","addToAllFiles":"添加到所有文件","removeDescription":"移除选中文件的共有标签","commonTags":"共有标签","noCommonTags":"选中的文件没有共有标签","clearDescription":"清空选中的 {count} 个文件的所有标签","clearWarningTitle":"⚠️警告","clearWarningDesc":"此操作将清空所有选中文件的标签,且不可恢复","confirmClearAll":"确认清空所有标签","tagAlreadyInList":"标签已在列表中","pleaseAddTags":"请先添加要批量添加的标签","addSuccess":"成功为 {count} 个文件添加标签","addFailed":"批量添加标签失败","removeSuccess":"成功从 {count} 个文件中移除标签","removeFailed":"移除标签失败","clearConfirmMessage":"确定要清空选中的 {count} 个文件的所有标签吗?此操作不可恢复。","clearConfirmTitle":"确认清空","clearConfirmOk":"确定","clearConfirmCancel":"取消","clearCancelled":"已取消清空操作","clearSuccess":"成功清空 {count} 个文件的标签","clearFailed":"清空标签失败","loadCommonTagsFailed":"加载共有标签失败"},"tagManagement":{"title":"标签管理","inputPlaceholder":"输入标签名称","currentTags":"当前标签","noTags":"暂无标签","popularTags":"常用标签","loading":"加载中...","noPopularTags":"暂无常用标签","close":"关闭","tagExists":"标签已存在","addSuccess":"标签添加成功","addFailed":"添加标签失败","removeSuccess":"标签删除成功","removeFailed":"删除标签失败","loadFailed":"加载标签失败"},"mobileAction":{"viewDetail":"查看详情","copyLink":"复制链接","downloadFile":"下载文件","moveFile":"移动文件","tagManagement":"标签管理","moveFolder":"移动文件夹","deleteFile":"删除文件","deleteFolder":"删除文件夹"},"mobileDirectory":{"title":"目录导航","rootDirectory":"根目录","goBack":"返回上一级"},"sysConfig":{"logout":"退出登录"},"sysConfigTabs":{"systemStatus":"系统状态","uploadSettings":"上传设置","securitySettings":"安全设置","pageSettings":"网页设置","otherSettings":"其他设置"},"dateRangeCalendar":{"previousMonth":"上个月","nextMonth":"下个月","startDate":"起始日期","endDate":"结束日期","rangeSeparator":"至","monthTitle":"{year}-{month}","weekdaySun":"日","weekdayMon":"一","weekdayTue":"二","weekdayWed":"三","weekdayThu":"四","weekdayFri":"五","weekdaySat":"六"},"sysStatus":{"totalFiles":"文件总数","clickToRefresh":"点击刷新","indexUpdateTime":"索引更新时间","systemVersion":"系统版本","clickToViewChangelog":"点击查看更新日志","channelDistribution":"上传渠道分布","fileStatusDistribution":"文件状态分布","uploadTrend":"上传趋势","uploadTrendGroupBy":"上传趋势分组方式","totalUploads":"上传总数","byChannelType":"渠道类型","byChannelName":"渠道名称","selectDateRange":"选择日期范围","otherChannels":"其他","uploadsUnit":"次","noData":"暂无数据","totalFilesLabel":"文件总数","statusTypes":"状态类型","systemMaintenance":"系统维护","rebuildIndex":"重建索引","rebuilding":"重建中...","rebuildTooltip":"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复","backupData":"备份数据","backingUp":"备份中...","backupTooltip":"备份所有文件元数据和系统设置到JSON文件","restoreData":"恢复数据","restoring":"恢复中...","restoreTooltip":"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置","cancelOperation":"取消操作","retry":"重试","close":"关闭","records":"条记录","aboutToComplete":"即将完成","seconds":"约 {count} 秒","minutes":"约 {count} 分钟","hoursMinutes":"约 {hours} 小时 {minutes} 分钟","phaseFetching":"正在获取数据","phaseSorting":"正在排序","phaseUploading":"正在上传","phaseFinalizing":"正在完成","phaseBuilding":"正在构建备份","phaseDownloading":"正在生成下载","phaseRestoringFiles":"正在恢复文件","phaseRestoringSettings":"正在恢复设置","phaseCompleted":"已完成","phaseRetrying":"正在重试","rebuildSuccess":"索引重建完成!共处理 {count} 个文件","backupSuccess":"备份完成!共备份 {count} 个文件","backupSuccessWithSettings":"备份完成!共备份 {fileCount} 个文件,{settingsCount} 个设置项","operationInProgress":"已有操作正在进行中","selectJsonFile":"请选择JSON格式的备份文件","restoreConfirmMessage":"恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","restoreConfirmTitle":"确认恢复","restoreConfirmOk":"确定恢复","restoreConfirmCancel":"取消","invalidBackupFile":"备份文件格式无效,请选择有效的 JSON 文件","restoreSuccess":"恢复完成!已恢复 {files} 个文件和 {settings} 个设置项,正在重建索引...","restoreFailed":"恢复数据失败","fetchIndexFailed":"获取索引信息失败","unknown":"未知","blocked":"已屏蔽","normalStatus":"正常","latestUpload":"最近上传","earliestUpload":"最早上传","daysAgo":"{count}天前","hoursAgo":"{count}小时前","minutesAgo":"{count}分钟前","justNow":"刚刚","cancellingRebuild":"正在取消索引重建..."},"sysUpload":{"title":"上传渠道管理","titleTooltip":"管理所有上传渠道的配置,点击卡片查看详情或编辑","filterPlaceholder":"筛选渠道类型","addChannel":"添加渠道","loadBalance":"负载均衡","unnamedChannel":"未命名渠道","envVariable":"环境变量","noChannels":"暂无 {type} 渠道","detail":"详情","editBtn":"编辑","deleteBtn":"删除","addDialogTitle":"添加新渠道","channelTypeLabel":"渠道类型","channelTypePlaceholder":"请选择渠道类型","channelNameLabel":"渠道名称","channelNamePlaceholder":"请输入渠道名称","channelNameImmutableTip":"添加后将作为文件关联渠道的唯一标识,不支持修改","channelNameEditDisabledTip":"渠道名称用于关联已上传文件,不支持修改","botTokenLabel":"Bot Token","botTokenPlaceholder":"请输入 Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"请输入 Chat ID","proxyDomain":"代理域名","proxyDomainPlaceholder":"可选,例如: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"例如: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN 域名","cdnDomainPlaceholder":"可选,请填写完整 CDN 访问地址前缀,例如:https://cdn.example.com","cdnDomainTip":"可选配置。可用于生成和展示文件访问链接,服务端读取文件内容时也会优先尝试通过 CDN 读取。","bucketName":"存储桶名称","bucketNamePlaceholder":"请输入存储桶名称","bucketRegion":"存储桶区域","bucketRegionPlaceholder":"默认填写 auto","accessKeyId":"访问密钥 ID","accessKeyIdPlaceholder":"请输入访问密钥 ID","secretAccessKey":"机密访问密钥","secretAccessKeyPlaceholder":"请输入机密访问密钥","pathStyle":"路径风格","pathStyleTip":"使用 OpenList 等不兼容主机风格服务时需开启","quotaLimit":"容量限制","quotaLimitGB":"容量上限 (GB)","quotaThreshold":"停用阈值 (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"请输入 Channel ID","nitroMember":"Nitro 会员","nitroTip":"会员单文件限制 25MB,否则为 10MB","discordWarning":"Discord 有接口频率限制,不建议将其用作大规模并发场景","repoName":"仓库名","repoNamePlaceholder":"格式: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"请输入 Access Token","privateRepo":"私有仓库","privateRepoTip":"私有仓库限制 100GB","webdavBaseUrl":"WebDAV 基础地址","webdavBaseUrlPlaceholder":"例如: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"用户名","webdavUsernamePlaceholder":"可选用户名","webdavPassword":"密码","webdavPasswordPlaceholder":"可选密码","webdavPublicUrlPlaceholder":"可选,请填写完整公开访问地址前缀,例如:https://cdn.example.com/imgbed","webdavPublicUrlTip":"可选配置。服务端读取文件内容时会优先尝试通过该公开地址读取,失败后回退 WebDAV API。","webdavHeaders":"自定义请求头","webdavHeadersPlaceholder":"可选 JSON 对象,例如: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"自定义请求头必须是有效的 JSON 对象","webdavCreateDirectory":"自动创建目录","webdavCreateDirectoryTip":"上传文件前自动创建父级目录","cancel":"取消","confirmAdd":"确认添加","detailDialogTitle":"渠道详情 - {name}","channelNameDetail":"渠道名称","channelTypeDetail":"渠道类型","statusLabel":"状态","enabled":"已启用","disabled":"已禁用","configSource":"配置来源","publicUrl":"公开访问链接","notSet":"未设置","isPathStyle":"是","isNotPathStyle":"否","currentUsage":"当前用量","closeBtn":"关闭","editDialogTitle":"编辑渠道 - {name}","enableChannel":"启用渠道","saveChanges":"保存修改","r2ConfigNote":"请按照 配置 R2 渠道 文档说明添加 R2 渠道","reservedName":"该名称为系统保留名称,请使用其他名称","duplicateName":"该类型下已存在同名渠道,请使用其他名称","fixedChannelCannotDelete":"环境变量配置的渠道无法删除","deleteChannelConfirm":"确定要删除该渠道吗?删除后,仍关联该渠道的文件可能无法访问。","quotaInitConfirm":"首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","quotaInitTitle":"初始化容量统计","quotaInitConfirmBtn":"立即统计","quotaInitCancelBtn":"稍后手动统计","quotaInitLater":"您可以稍后点击刷新按钮手动统计","quotaCalculating":"正在统计容量,请稍候...","quotaCalculateSuccess":"容量统计完成","quotaCalculateFailed":"统计失败","quotaCalculateError":"统计失败: "},"sysSecurity":{"authManagement":"认证管理","userAuth":"用户端认证","adminAuth":"管理端认证","uploadPassword":"上传密码","confirmPassword":"确认密码","adminUsername":"用户名","adminPassword":"密码","apiTokenManagement":"API Token 管理","imageReview":"图像审查","imageReviewTooltip":"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道","enableReview":"开启审查","reviewChannel":"审查渠道","reviewChannelPlaceholder":"请选择审查渠道","apiKey":"API Key","apiPath":"API 路径","ipQuery":"IP 归属地查询","ipQueryTooltip":"上传时按配置调用自定义 API 查询上传 IP 归属地,参数值支持 {\'{ip}\'} 占位符","enableIpQuery":"开启查询","ipQueryChannel":"查询渠道","ipQueryChannelPlaceholder":"请选择查询渠道","customApi":"自定义 API","queryParams":"查询参数","paramNamePlaceholder":"参数名","paramValuePlaceholder":"参数值,如 {\'{ip}\'}","addQueryParam":"添加参数","responseFields":"响应字段","responseFieldsTip":"最终显示内容会按照字段顺序拼接","responseFieldPathPlaceholder":"JSON 路径,如 country.name","addResponseField":"添加字段","uploadManagement":"上传管理","accessManagement":"访问管理","domainFilter":"域名过滤","allowedDomains":"放行域名","allowedDomainsTooltip":"1.针对访问域名设置权限
      2.留空默认全部放行,多个域名请用英文逗号分隔","whiteListMode":"白名单模式","enableWhiteList":"是否开启","enableWhiteListTooltip":"1.针对文件设置权限
      2.开启后,仅被加入白名单的文件可被访问","settingsSaved":"设置已保存","tokenName":"名称","tokenValue":"Token","permissions":"权限","createdAt":"创建时间","status":"状态","expiresAt":"过期时间","operation":"操作","editBtn":"编辑","deleteBtn":"删除","permUpload":"上传","permDelete":"删除","permList":"列出","permManage":"管理","createTokenTitle":"创建新 API Token","tokenNameLabel":"Token 名称","tokenNamePlaceholder":"请输入Token名称","permissionsLabel":"权限","neverExpire":"永不过期","validPeriod":"有效期","autoDeleteOnExpire":"过期自动删除","createBtn":"创建","editTokenTitle":"编辑 API Token","updateBtn":"更新","tokenCreatedTitle":"Token 创建成功","tokenCreatedWarning":"请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token!","fullToken":"完整Token","copyBtn":"复制","savedBtn":"我已保存","tokenCopied":"Token已复制到剪贴板","copyFailed":"复制失败,请手动复制","tokenCreateSuccess":"Token创建成功","tokenCreateFailed":"Token创建失败","tokenUpdateSuccess":"Token更新成功","tokenUpdateFailed":"Token更新失败","tokenDeleteConfirm":"此操作将永久删除该Token,是否继续?","tokenDeleteConfirmTitle":"提示","tokenDeleteConfirmOk":"确定","tokenDeleteConfirmCancel":"取消","tokenDeleteSuccess":"Token删除成功","tokenDeleteFailed":"Token删除失败","tokenListFailed":"获取Token列表失败","passwordUrlReserved":"密码不能包含部分URL保留字符: % & ? # /","confirmUploadPassword":"请再次输入上传密码","confirmAdminPassword":"请再次输入管理密码","passwordMismatch":"两次输入密码不一致","passwordUnchanged":"未修改(留空保持原密码)","adminPasswordChangedRelogin":"管理端密码已修改,即将跳转到登录页","clearPassword":"清除认证信息","tokenNameRequired":"请输入Token名称","permissionsRequired":"请选择权限","validPeriodRequired":"有效期数值必须大于 0","timeUnitSeconds":"秒","timeUnitMinutes":"分钟","timeUnitHours":"小时","timeUnitDays":"天","timeUnitMonths":"月","timeUnitYears":"年","sessionSecurityPolicy":"会话安全策略","secureMode":"Secure 模式","secureModeTooltip":"开启后,Cookie 仅通过 HTTPS 连接传输,请确保您的站点已启用 HTTPS","userSessionMaxAge":"用户端会话有效期","adminSessionMaxAge":"管理端会话有效期","sessionMaxAgeUnit":"天","sessionMaxAgeInvalid":"会话有效期必须为 1-3650 的正整数"},"sysPage":{"settingsSaved":"设置已保存","otherSettings":"其他设置","channelSelectPlaceholder":"请先选择上传渠道"},"sysOthers":{"remoteTelemetry":"远端遥测","remoteTelemetryTooltip":"便于问题查找和定位,建议开启","enable":"启用","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
      建议设置,设置方式请查阅文档","zoneId":"区域ID","accountEmail":"账户邮箱","randomImageApi":"随机图像API","randomImageApiTooltip":"API具体用法请查阅文档","directory":"目录","directoryTooltip":"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
      2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问","publicBrowse":"访客图库","publicBrowseTooltip":"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)","openDirectory":"开放目录","openDirectoryTooltip":"

      允许公开浏览的目录,多个目录用逗号分隔

      示例:wallpaper,photos,album

      支持子目录:2026/lucky,2026/rich

      访问链接:https://你的域名/browse/2026/lucky

      ","webdav":"WebDAV","webdavTooltip":"启用后,可以通过WebDAV协议访问和管理图片","webdavUsername":"用户名","webdavPassword":"密码","webdavUploadChannel":"上传渠道","webdavDefaultChannel":"默认渠道","webdavChannelName":"指定渠道名","settingsSaved":"设置已保存"},"customerConfig":{"uploadFileList":"上传文件列表","fileNameCol":"文件名","filePreview":"文件预览","uploadTimeCol":"上传时间","ipAddress":"IP地址","address":"地址","uploadCount":"上传次数","allowUpload":"允许上传","allow":"允许","deny":"禁止","loadMore":"加载更多","loadError":"加载更多数据时出错,请检查网络连接","syncError":"同步数据时出错,请检查网络连接"},"publicBrowse":{"searchPlaceholder":"搜索文件名 或 #页码","fileCount":"{count} 个文件","loading":"加载中...","retry":"重试","creditText":"该图库由林酱贡献代码","loadingMore":"加载中...","allLoaded":"已加载全部","creditLink":"林酱贡献","browseDisabled":"公开浏览功能未启用","directoryNotAllowed":"该目录不允许公开访问","accessDenied":"访问被拒绝","loadFailed":"加载失败,请重试","rootDirectory":"根目录","copyLink":"复制链接","copied":"已复制","downloadBtn":"下载","swipeHint":"← 滑动切换 →","rotate90":"旋转90°"},"transformMedia":{"download":"下载","playbackSpeed":"播放速度","normalSpeed":"正常","playMode":"播放模式","stopAfterPlay":"播完停止","sequentialPlay":"顺序播放","loopSingle":"单曲循环","more":"更多"},"directoryTree":{"selectDirectory":"选择目录","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadFailed":"加载目录树失败,请检查网络连接"},"floatingSave":{"saving":"保存中","save":"保存"},"theme":{"lightMode":"浅色模式","darkMode":"深色模式","autoMode":"自动模式"},"common":{"confirm":"确定","cancel":"取消","close":"关闭","save":"保存","delete":"删除","edit":"编辑","copy":"复制","download":"下载","retry":"重试","loading":"加载中...","success":"成功","failed":"失败","warning":"警告","info":"提示","yes":"是","no":"否","all":"全部类型","select":"请选择"},"validation":{"pathMustStartWithSlash":"目标目录必须以 \\"/\\" 开头","pathTraversalNotAllowed":"目标目录不能包含路径穿越字符 \\"..\\"","singleDotNotAllowed":"目标目录不能包含单独的 \\".\\" 路径段","consecutiveSlashNotAllowed":"目标目录不能包含连续的斜杠","invalidCharacters":"目标目录包含非法字符,请使用合法的路径格式","uploadDirReplace":"上传目录"},"language":{"switchTo":"中/En","switchLanguage":"切换语言"},"whitelist":{"title":"白名单模式已启用","description":"抱歉,当前已开启白名单模式,上传的图片需要审核通过后才能展示,请等待审核通过后再进行访问。","goHome":"返回首页","goBack":"返回上页","helpText":"您可以尝试:","uploadImage":"图片上传","refreshPage":"刷新页面"}}'),l=JSON.parse('{"login":{"title":"Login to {owner} ImgHub","adminTitle":"Admin Login","password":"Password","username":"Username","passwordPlaceholder":"Enter auth code","usernamePlaceholder":"Enter username","adminPasswordPlaceholder":"Enter password","submit":"Login","success":"Login successful","failed":"Login failed, please check your password","adminFailed":"Invalid username or password","serverError":"Server error","systemError":"System error","authRequired":"Please authenticate first!","authFailed":"Authentication failed!"},"upload":{"folderPlaceholder":"Upload directory","pasteUpload":"Paste Upload","fileUpload":"File Upload","dragUploadText":"Drag Click or Ctrl + V to paste upload","pasteUrlPlaceholder":"Paste external links, separate multiple links with line breaks","pasteUploadBtn":"Upload","pasteSave":"Save","pasteExternal":"External","history":"Upload History","announcement":"Announcements","noAnnouncement":"No announcements","announcementTitle":"Announcement","announcementAck":"Got it!","settings":"Upload Settings","linkFormat":"Link Format","manage":"Management","logout":"Logout","logoutSuccess":"Logged out","viewDocs":"Documentation","switchUploadMethod":"Switch Upload Method","copyAll":"Copy All","retryFailed":"Retry Failed","clearList":"Clear List","clearAll":"Clear All","clearUploaded":"Clear Uploaded"},"uploadForm":{"deleted":"{name} deleted","uploadSuccess":"{name} uploaded successfully","uploadFailed":"{name} upload failed","compressFailedCannotUpload":"{name} compression failed, cannot upload!","fileTooLarge":"{name} file too large, cannot upload!","compressedFileTooLarge":"{name} still too large after compression, cannot upload!","copySuccess":"Copied successfully","copyFailed":"Copy failed","copyAllSuccess":"All copied successfully","fileNotUploaded":"File not uploaded, cannot copy link","fileListCleared":"File list cleared","fileListEmpty":"File list is empty","successFilesCleared":"Uploaded files cleared","successFilesEmpty":"No uploaded files","noFailedFiles":"No failed files","autoRetryOn":"Auto retry enabled","autoRetryOff":"Auto retry disabled","autoRetry":"Auto Retry","maxRetryReached":"{name} reached max retry limit ({max}), stopping","urlRequestFailed":"URL request from clipboard failed","chunkMerging":"Chunk upload complete, merging file, please wait...","fileSizeTooLarge":"File too large","chunkInitFailed":"Failed to init chunked upload","uploadError":"Upload error occurred","imageLoadFailed":"Image load failed"},"uploadSettings":{"title":"Upload Settings","uploadChannel":"Upload Channel","channelType":"Channel Type","channelName":"Channel Name","channelNameTooltip":"Select a specific channel name. If not selected, load balancing or default channel will be used","autoSelect":"Auto Select","uploadDirectory":"Upload Directory","uploadDirectoryPlaceholder":"Enter upload directory path","autoSwitch":"Auto Switch","autoSwitchTooltip":"For non-chunked uploads, automatically switch to another channel on failure","fileNaming":"File Naming","namingDefault":"Default","namingIndex":"Prefix Only","namingOrigin":"Original Name","namingShort":"Short Link","filePreprocess":"File Preprocessing","filePreprocessTooltip":"Convert format and compress locally before upload, only applies to image files","convertToWebp":"Convert to WebP","convertToWebpTooltip":"Convert images to WebP format before upload to reduce file size. Falls back to original format on failure","fileCompress":"File Compression","compressThreshold":"Compression Threshold","compressThresholdTooltip":"Set image size threshold, files exceeding this will be auto-compressed (MB)","expectedSize":"Expected Size","expectedSizeTooltip":"Set expected image size after compression (MB)","serverCompress":"Server-side Compression","serverCompressTooltip":"1. Compress on Telegram side, only applies to image files uploaded via Telegram channel
      2. If image size (after local compression) exceeds 10MB, this setting is ignored
      3. For high-resolution, transparent background images, it\'s recommended to disable server compression to avoid issues","enableCompress":"Enable Compression","confirm":"OK"},"uploadHistory":{"title":"History","totalRecords":"{count} records","switchView":"Switch View","clearRecords":"Clear Records","loading":"Loading...","pullToLoadMore":"Pull to load more","noMoreRecords":"No more records","emptyHistory":"No upload history","linkCopied":"Link copied","copyFailed":"Copy failed","clearConfirmTitle":"Notice","clearConfirmMessage":"Are you sure you want to clear all upload records?","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","recordsCleared":"Records cleared","deleteConfirmMessage":"Are you sure you want to delete this record?","recordDeleted":"Record deleted"},"settings":{"linkFormatTitle":"Link Format Settings","defaultCopyLink":"Default Copy Format","rawLink":"Raw Link","customLink":"Custom Link","customLinkTooltip":"Default link is https://your.domain/file/xxx.jpg
      If custom link format is enabled, only the xxx.jpg part is kept, please enter the rest manually","enableCustom":"Enable Custom","customPrefix":"Custom Prefix","customPrefixPlaceholder":"Enter custom link prefix","confirm":"OK","s3Link":"S3 Link"},"dashboard":{"searchPlaceholder":"Search: #tag -#exclude","sortByDateDesc":"Sort by date (newest)","sortByNameAsc":"Sort by name (A-Z)","selectedItems":"selected","clearSelection":"Clear selection","copy":"Copy","delete":"Delete","download":"Download","move":"Move","tagManagement":"Tag Management","addToBlacklist":"Add to Blacklist","addToWhitelist":"Add to Whitelist","linkFormat":"Link Format","listView":"List View","cardView":"Card View","logout":"Logout","rootDirectory":"Root","totalFiles":"{count} files","noMatchingFiles":"No matching files or folders found","currentDirEmpty":"Current directory is empty","adjustSearchHint":"Try adjusting search criteria or filters","uploadHint":"Uploaded files will appear here","loadMore":"Load More","totalPages":"{count} pages","jumpTo":"Go to","preview":"Preview","fileName":"File Name","tags":"Tags","channelType":"Channel Type","channelNameCol":"Channel Name","uploadAddress":"Upload Address","fileSize":"Size","uploadTime":"Upload Time","actions":"Actions","externalTag":"External","unknownTag":"Unknown","detail":"Detail","copyLink":"Copy Link","moveFile":"Move","downloadFile":"Download","loadFailed":"Load failed","copySuccess":"Copied successfully","copyFailed":"Copy failed","deleteConfirm":"This will permanently delete this file. Continue?","deleteConfirmTitle":"Notice","deleteConfirmOk":"OK","deleteConfirmCancel":"Cancel","deleteSuccess":"Deleted successfully","deleteFailed":"Delete failed","blockConfirm":"This will add the file to blacklist. Continue?","blockSuccess":"Added to blacklist successfully","blockFailed":"Failed to add to blacklist","whiteConfirm":"This will add the file to whitelist. Continue?","whiteSuccess":"Added to whitelist successfully","whiteFailed":"Failed to add to whitelist","deleteFolderConfirm":"This will permanently delete this folder. Continue?","deleteFileConfirm":"This will permanently delete this file. Continue?","batchDeleteConfirm":"This will permanently delete selected files and folders. Continue?","batchDeleteSuccess":"Batch delete successful","batchDeleteFailed":"Batch delete failed","batchBlockConfirm":"This will add selected files to blacklist. Continue?","batchBlockSuccess":"Batch blacklist successful","batchBlockFailed":"Batch blacklist failed","batchWhiteConfirm":"This will add selected files to whitelist. Continue?","batchWhiteSuccess":"Batch whitelist successful","batchWhiteFailed":"Batch whitelist failed","noLinksAvailable":"No links to copy","batchCopySuccess":"Copied {count} links successfully","batchCopyFailed":"Batch copy failed, please retry","batchCopyLinksSuccess":"Batch copy successful","copyFileLinkSuccess":"File link copied","fileListMemoryCacheWarning":"The file list is large, so it is being kept in memory. Refreshing the page will require loading it again.","indexingWarning":"The index is still building, so current search and sort results may be inaccurate. Please try again later.","loadMoreFailed":"Failed to load more files, please check network","moveSuccess":"Moved successfully","moveFailed":"Move failed","moveTargetSameAsCurrent":"Target folder cannot be the current folder","invalidPageNumber":"Please enter a valid page number","pageExceedsMax":"Page number cannot exceed {max}","loadingData":"Loading data, please wait...","loadDataFailed":"Failed to load data, please check network","fetchFileListFailed":"Failed to fetch file list","refreshFailed":"Refresh failed, please retry","selectFilesFirst":"Please select files first","syncDataError":"Error syncing data, please check network","fetchingFileList":"Fetching file list...","folderEmptyNoLinks":"Folder is empty, no links to copy","copiedFileLinks":"Copied {count} file links","copyFolderLinksFailed":"Failed to copy folder links, please retry"},"dashboardTabs":{"fileManagement":"File Management","userManagement":"User Management","systemSettings":"System Settings","fileUpload":"File Upload"},"fileDetail":{"title":"File Details","download":"Download","tags":"Tags","blacklist":"Blacklist","whitelist":"Whitelist","deleteBtn":"Delete","edit":"Edit","rename":"Rename","save":"Save","cancel":"Cancel","originUrl":"Original Link","fileNameLabel":"File Name","fileNamePlaceholder":"Enter file name","fileType":"File Type","fileTypePlaceholder":"e.g. image/jpeg","fileSizeLabel":"File Size","imageDimensions":"Dimensions","noDimensions":"N/A","uploadTimeLabel":"Upload Time","channelTypeAndName":"Channel Type/Name","accessStatusAndReview":"Access Status/Review","uploadIP":"Upload IP","uploadAddressLabel":"Upload Address","fileTags":"File Tags","noTags":"No tags","unknown":"Unknown","accessNormal":"Normal","accessNormalWhitelist":"Normal (Whitelisted)","accessBlockedBlacklist":"Blocked (Blacklisted)","accessBlockedReview":"Blocked (Review rejected)","orientationLandscape":"Landscape","orientationPortrait":"Portrait","orientationSquare":"Square","linkCopied":"Link copied","metadataSaved":"Metadata saved successfully","metadataSaveFailed":"Failed to save metadata","renameTitle":"Rename File ID","renameLabel":"New File ID","renamePlaceholder":"Enter new File ID","renameCancel":"Cancel","renameConfirm":"Confirm Rename","renameSuccess":"File renamed successfully","renameConflict":"Target file name already exists","renameFailed":"Rename failed"},"filter":{"accessStatus":"Access Status","normal":"Normal","blocked":"Blocked","blackWhiteList":"Black/White List","whiteList":"Whitelist","blackList":"Blacklist","notSet":"Not Set","reviewResult":"Review Result","teenContent":"12+ Content","adultContent":"Adult Content","fileType":"File Type","image":"Image","video":"Video","audio":"Audio","other":"Other","channelType":"Channel Type","externalLink":"External Link","channelName":"Channel Name","clearFilters":"Clear Filters"},"moveFile":{"title":"Move File","batchTitle":"Batch Move Files","targetDirectory":"Target Directory","targetPlaceholder":"Enter target directory path","hint":"Tip: Paths starting with / indicate root directory, e.g. /photos/2024/","hintMobile":"Tip: Paths starting with / indicate root directory","selectDirectory":"Select Directory","cancel":"Cancel","confirm":"OK","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadTreeFailed":"Failed to load directory tree, please check network connection"},"batchTag":{"title":"Batch Tag Management","addTab":"Add","removeTab":"Remove","clearTab":"Clear","addDescription":"Add tags to {count} selected files","inputPlaceholder":"Enter tag name","pendingTags":"Tags to add","noPendingTags":"No tags to add","addToAllFiles":"Add to all files","removeDescription":"Remove common tags from selected files","commonTags":"Common Tags","noCommonTags":"Selected files have no common tags","clearDescription":"Clear all tags from {count} selected files","clearWarningTitle":"⚠️Warning","clearWarningDesc":"This will clear all tags from selected files and cannot be undone","confirmClearAll":"Confirm clear all tags","tagAlreadyInList":"Tag already in list","pleaseAddTags":"Please add tags first","addSuccess":"Tags added to {count} files successfully","addFailed":"Batch tag addition failed","removeSuccess":"Tags removed from {count} files successfully","removeFailed":"Tag removal failed","clearConfirmMessage":"Are you sure you want to clear all tags from {count} selected files? This cannot be undone.","clearConfirmTitle":"Confirm Clear","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","clearCancelled":"Clear operation cancelled","clearSuccess":"Tags cleared from {count} files successfully","clearFailed":"Failed to clear tags","loadCommonTagsFailed":"Failed to load common tags"},"tagManagement":{"title":"Tag Management","inputPlaceholder":"Enter tag name","currentTags":"Current Tags","noTags":"No tags","popularTags":"Popular Tags","loading":"Loading...","noPopularTags":"No popular tags","close":"Close","tagExists":"Tag already exists","addSuccess":"Tag added successfully","addFailed":"Failed to add tag","removeSuccess":"Tag removed successfully","removeFailed":"Failed to remove tag","loadFailed":"Failed to load tags"},"mobileAction":{"viewDetail":"View Details","copyLink":"Copy Link","downloadFile":"Download File","moveFile":"Move File","tagManagement":"Tag Management","moveFolder":"Move Folder","deleteFile":"Delete File","deleteFolder":"Delete Folder"},"mobileDirectory":{"title":"Directory Navigation","rootDirectory":"Root","goBack":"Go Back"},"sysConfig":{"logout":"Logout"},"sysConfigTabs":{"systemStatus":"System Status","uploadSettings":"Upload Settings","securitySettings":"Security Settings","pageSettings":"Page Settings","otherSettings":"Other Settings"},"dateRangeCalendar":{"previousMonth":"Previous month","nextMonth":"Next month","startDate":"Start date","endDate":"End date","rangeSeparator":"to","monthTitle":"{year}-{month}","weekdaySun":"Sun","weekdayMon":"Mon","weekdayTue":"Tue","weekdayWed":"Wed","weekdayThu":"Thu","weekdayFri":"Fri","weekdaySat":"Sat"},"sysStatus":{"totalFiles":"Total Files","clickToRefresh":"Click to refresh","indexUpdateTime":"Index Update Time","systemVersion":"System Version","clickToViewChangelog":"Click to view changelog","channelDistribution":"Upload Channel Distribution","fileStatusDistribution":"File Status Distribution","uploadTrend":"Upload Trend","uploadTrendGroupBy":"Upload trend group by","totalUploads":"Total Uploads","byChannelType":"Channel Type","byChannelName":"Channel Name","selectDateRange":"Select date range","otherChannels":"Other","uploadsUnit":"uploads","noData":"No data","totalFilesLabel":"Total Files","statusTypes":"Status Types","systemMaintenance":"System Maintenance","rebuildIndex":"Rebuild Index","rebuilding":"Rebuilding...","rebuildTooltip":"Rescan all files and update index data, useful for fixing data inconsistencies","backupData":"Backup Data","backingUp":"Backing up...","backupTooltip":"Backup all file metadata and system settings to a JSON file","restoreData":"Restore Data","restoring":"Restoring...","restoreTooltip":"Restore data from a backup file, this will overwrite existing file metadata and system settings","cancelOperation":"Cancel Operation","retry":"Retry","close":"Close","records":"records","aboutToComplete":"Almost done","seconds":"~{count} seconds","minutes":"~{count} minutes","hoursMinutes":"~{hours} hours {minutes} minutes","phaseFetching":"Fetching data","phaseSorting":"Sorting","phaseUploading":"Uploading","phaseFinalizing":"Finalizing","phaseBuilding":"Building backup","phaseDownloading":"Generating download","phaseRestoringFiles":"Restoring files","phaseRestoringSettings":"Restoring settings","phaseCompleted":"Completed","phaseRetrying":"Retrying","rebuildSuccess":"Index rebuild complete! Processed {count} files","backupSuccess":"Backup complete! Backed up {count} files","backupSuccessWithSettings":"Backup complete! Backed up {fileCount} files and {settingsCount} settings","operationInProgress":"An operation is already in progress","selectJsonFile":"Please select a JSON backup file","restoreConfirmMessage":"Restoring will overwrite existing file metadata and system settings. This cannot be undone. Continue?","restoreConfirmTitle":"Confirm Restore","restoreConfirmOk":"Confirm Restore","restoreConfirmCancel":"Cancel","invalidBackupFile":"Invalid backup file format, please select a valid JSON file","restoreSuccess":"Restore complete! Restored {files} files and {settings} settings, rebuilding index...","restoreFailed":"Failed to restore data","fetchIndexFailed":"Failed to fetch index information","unknown":"Unknown","blocked":"Blocked","normalStatus":"Normal","latestUpload":"Latest Upload","earliestUpload":"Earliest Upload","daysAgo":"{count} days ago","hoursAgo":"{count} hours ago","minutesAgo":"{count} minutes ago","justNow":"Just now","cancellingRebuild":"Cancelling index rebuild..."},"sysUpload":{"title":"Upload Channel Management","titleTooltip":"Manage all upload channel configurations. Click a card to view details or edit","filterPlaceholder":"Filter channel type","addChannel":"Add Channel","loadBalance":"Load Balance","unnamedChannel":"Unnamed Channel","envVariable":"Environment Variable","noChannels":"No {type} channels","detail":"Detail","editBtn":"Edit","deleteBtn":"Delete","addDialogTitle":"Add New Channel","channelTypeLabel":"Channel Type","channelTypePlaceholder":"Select channel type","channelNameLabel":"Channel Name","channelNamePlaceholder":"Enter channel name","channelNameImmutableTip":"After creation, this becomes the unique identifier for files associated with the channel and cannot be changed","channelNameEditDisabledTip":"The channel name links uploaded files to this channel and cannot be changed","botTokenLabel":"Bot Token","botTokenPlaceholder":"Enter Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"Enter Chat ID","proxyDomain":"Proxy Domain","proxyDomainPlaceholder":"Optional, e.g.: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"e.g.: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN Domain","cdnDomainPlaceholder":"Optional. Enter the full CDN URL prefix, e.g. https://cdn.example.com","cdnDomainTip":"Optional. Can be used to generate and display file access links. Server-side file reads also try the CDN first.","bucketName":"Bucket Name","bucketNamePlaceholder":"Enter bucket name","bucketRegion":"Bucket Region","bucketRegionPlaceholder":"Default: auto","accessKeyId":"Access Key ID","accessKeyIdPlaceholder":"Enter Access Key ID","secretAccessKey":"Secret Access Key","secretAccessKeyPlaceholder":"Enter Secret Access Key","pathStyle":"Path Style","pathStyleTip":"Enable when using services incompatible with host-style like OpenList","quotaLimit":"Quota Limit","quotaLimitGB":"Quota Limit (GB)","quotaThreshold":"Disable Threshold (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"Enter Channel ID","nitroMember":"Nitro Member","nitroTip":"Nitro members: 25MB per file, otherwise 10MB","discordWarning":"Discord has API rate limits, not recommended for high-concurrency scenarios","repoName":"Repository Name","repoNamePlaceholder":"Format: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"Enter Access Token","privateRepo":"Private Repository","privateRepoTip":"Private repository limit: 100GB","webdavBaseUrl":"WebDAV Base URL","webdavBaseUrlPlaceholder":"e.g.: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"Username","webdavUsernamePlaceholder":"Optional username","webdavPassword":"Password","webdavPasswordPlaceholder":"Optional password","webdavPublicUrlPlaceholder":"Optional. Enter the full public URL prefix, e.g. https://cdn.example.com/imgbed","webdavPublicUrlTip":"Optional. Server-side file reads try this public URL first and fall back to the WebDAV API on failure.","webdavHeaders":"Custom Headers","webdavHeadersPlaceholder":"Optional JSON object, e.g.: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"Custom headers must be a valid JSON object","webdavCreateDirectory":"Auto Create Directories","webdavCreateDirectoryTip":"Create parent directories before uploading files","cancel":"Cancel","confirmAdd":"Confirm Add","detailDialogTitle":"Channel Details - {name}","channelNameDetail":"Channel Name","channelTypeDetail":"Channel Type","statusLabel":"Status","enabled":"Enabled","disabled":"Disabled","configSource":"Config Source","publicUrl":"Public Access URL","notSet":"Not Set","isPathStyle":"Yes","isNotPathStyle":"No","currentUsage":"Current Usage","closeBtn":"Close","editDialogTitle":"Edit Channel - {name}","enableChannel":"Enable Channel","saveChanges":"Save Changes","r2ConfigNote":"Please follow the R2 Channel Configuration documentation to add R2 channels","reservedName":"This name is reserved by the system, please use another name","duplicateName":"A channel with this name already exists, please use another name","fixedChannelCannotDelete":"Channels configured via environment variables cannot be deleted","deleteChannelConfirm":"Are you sure you want to delete this channel? Files still associated with it may become inaccessible.","quotaInitConfirm":"First time enabling quota requires calculating existing file sizes, this may take some time. Calculate now?","quotaInitTitle":"Initialize Quota Statistics","quotaInitConfirmBtn":"Calculate Now","quotaInitCancelBtn":"Calculate Later","quotaInitLater":"You can click the refresh button to calculate later","quotaCalculating":"Calculating quota, please wait...","quotaCalculateSuccess":"Quota calculation complete","quotaCalculateFailed":"Calculation failed","quotaCalculateError":"Calculation failed: "},"sysSecurity":{"authManagement":"Authentication Management","userAuth":"User Authentication","adminAuth":"Admin Authentication","uploadPassword":"Upload Password","confirmPassword":"Confirm Password","adminUsername":"Username","adminPassword":"Password","apiTokenManagement":"API Token Management","imageReview":"Image Review","imageReviewTooltip":"Only applies to non-chunked uploads, supports nsfwjs and moderatecontent.com channels","enableReview":"Enable Review","reviewChannel":"Review Channel","reviewChannelPlaceholder":"Select review channel","apiKey":"API Key","apiPath":"API Path","ipQuery":"IP Geolocation Query","ipQueryTooltip":"Calls a custom API during upload to query the upload IP location. Parameter values support the {\'{ip}\'} placeholder","enableIpQuery":"Enable Query","ipQueryChannel":"Query Channel","ipQueryChannelPlaceholder":"Select query channel","customApi":"Custom API","queryParams":"Query Parameters","paramNamePlaceholder":"Parameter name","paramValuePlaceholder":"Parameter value, e.g. {\'{ip}\'}","addQueryParam":"Add Parameter","responseFields":"Response Fields","responseFieldsTip":"The final display text is joined in field order","responseFieldPathPlaceholder":"JSON path, e.g. country.name","addResponseField":"Add Field","uploadManagement":"Upload Management","accessManagement":"Access Management","domainFilter":"Domain Filter","allowedDomains":"Allowed Domains","allowedDomainsTooltip":"1. Set permissions based on access domain
      2. Leave empty to allow all, separate multiple domains with commas","whiteListMode":"Whitelist Mode","enableWhiteList":"Enable","enableWhiteListTooltip":"1. Set permissions based on files
      2. When enabled, only whitelisted files can be accessed","settingsSaved":"Settings saved","tokenName":"Name","tokenValue":"Token","permissions":"Permissions","createdAt":"Created At","status":"Status","expiresAt":"Expires At","operation":"Actions","editBtn":"Edit","deleteBtn":"Delete","permUpload":"Upload","permDelete":"Delete","permList":"List","permManage":"Manage","createTokenTitle":"Create New API Token","tokenNameLabel":"Token Name","tokenNamePlaceholder":"Enter token name","permissionsLabel":"Permissions","neverExpire":"Never Expire","validPeriod":"Valid Period","autoDeleteOnExpire":"Auto-delete on expiry","createBtn":"Create","editTokenTitle":"Edit API Token","updateBtn":"Update","tokenCreatedTitle":"Token Created Successfully","tokenCreatedWarning":"Please save the following token. You won\'t be able to view the full token after closing this dialog!","fullToken":"Full Token","copyBtn":"Copy","savedBtn":"I\'ve Saved It","tokenCopied":"Token copied to clipboard","copyFailed":"Copy failed, please copy manually","tokenCreateSuccess":"Token created successfully","tokenCreateFailed":"Failed to create token","tokenUpdateSuccess":"Token updated successfully","tokenUpdateFailed":"Failed to update token","tokenDeleteConfirm":"This will permanently delete this token. Continue?","tokenDeleteConfirmTitle":"Notice","tokenDeleteConfirmOk":"OK","tokenDeleteConfirmCancel":"Cancel","tokenDeleteSuccess":"Token deleted successfully","tokenDeleteFailed":"Failed to delete token","tokenListFailed":"Failed to fetch token list","passwordUrlReserved":"Password cannot contain URL reserved characters: % & ? # /","confirmUploadPassword":"Please re-enter upload password","confirmAdminPassword":"Please re-enter admin password","passwordMismatch":"Passwords do not match","passwordUnchanged":"Unchanged (leave empty to keep current password)","adminPasswordChangedRelogin":"Admin password changed, redirecting to login page","clearPassword":"Clear authentication info","tokenNameRequired":"Please enter token name","permissionsRequired":"Please select permissions","validPeriodRequired":"Valid period must be greater than 0","timeUnitSeconds":"seconds","timeUnitMinutes":"minutes","timeUnitHours":"hours","timeUnitDays":"days","timeUnitMonths":"months","timeUnitYears":"years","sessionSecurityPolicy":"Session Security Policy","secureMode":"Secure Mode","secureModeTooltip":"When enabled, cookies are only transmitted over HTTPS. Make sure your site has HTTPS enabled","userSessionMaxAge":"User Session Max Age","adminSessionMaxAge":"Admin Session Max Age","sessionMaxAgeUnit":"days","sessionMaxAgeInvalid":"Session max age must be an integer from 1 to 3650"},"sysPage":{"settingsSaved":"Settings saved","otherSettings":"Other Settings","channelSelectPlaceholder":"Please select upload channel first"},"sysOthers":{"remoteTelemetry":"Remote Telemetry","remoteTelemetryTooltip":"Helps with issue tracking and debugging, recommended to enable","enable":"Enable","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"When set, backend operations like blocking and deleting won\'t be affected by CDN cache
      Recommended, see documentation for setup","zoneId":"Zone ID","accountEmail":"Account Email","randomImageApi":"Random Image API","randomImageApiTooltip":"See documentation for API usage details","directory":"Directory","directoryTooltip":"1. Directories with random image access, defaults to root. Separate multiple directories with commas
      2. All directories use absolute paths, e.g. /img/cover, meaning files in this directory and all subdirectories can be accessed by the random image API","publicBrowse":"Public Gallery","publicBrowseTooltip":"When enabled, visitors can browse images in specified directories via /browse path (read-only, no delete/move)","openDirectory":"Open Directory","openDirectoryTooltip":"

      Directories open for public browsing, separate multiple with commas

      Example: wallpaper,photos,album

      Supports subdirectories: 2026/lucky,2026/rich

      Access URL: https://your.domain/browse/2026/lucky

      ","webdav":"WebDAV","webdavTooltip":"When enabled, images can be accessed and managed via WebDAV protocol","webdavUsername":"Username","webdavPassword":"Password","webdavUploadChannel":"Upload Channel","webdavDefaultChannel":"Default Channel","webdavChannelName":"Specified Channel","settingsSaved":"Settings saved"},"customerConfig":{"uploadFileList":"Upload File List","fileNameCol":"File Name","filePreview":"File Preview","uploadTimeCol":"Upload Time","ipAddress":"IP Address","address":"Address","uploadCount":"Upload Count","allowUpload":"Allow Upload","allow":"Allow","deny":"Deny","loadMore":"Load More","loadError":"Error loading more data, please check network connection","syncError":"Error syncing data, please check network connection"},"publicBrowse":{"searchPlaceholder":"Search file name or #page","fileCount":"{count} files","loading":"Loading...","retry":"Retry","creditText":"Gallery code contributed by LinJiang","loadingMore":"Loading...","allLoaded":"All loaded","creditLink":"LinJiang","browseDisabled":"Public browsing is not enabled","directoryNotAllowed":"This directory is not open for public access","accessDenied":"Access denied","loadFailed":"Load failed, please retry","rootDirectory":"Root","copyLink":"Copy Link","copied":"Copied","downloadBtn":"Download","swipeHint":"← Swipe to navigate →","rotate90":"Rotate 90°"},"transformMedia":{"download":"Download","playbackSpeed":"Playback Speed","normalSpeed":"Normal","playMode":"Play Mode","stopAfterPlay":"Stop After Play","sequentialPlay":"Sequential Play","loopSingle":"Loop Single","more":"More"},"directoryTree":{"selectDirectory":"Select Directory","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadFailed":"Failed to load directory tree, please check network connection"},"floatingSave":{"saving":"Saving","save":"Save"},"theme":{"lightMode":"Light Mode","darkMode":"Dark Mode","autoMode":"Auto Mode"},"common":{"confirm":"OK","cancel":"Cancel","close":"Close","save":"Save","delete":"Delete","edit":"Edit","copy":"Copy","download":"Download","retry":"Retry","loading":"Loading...","success":"Success","failed":"Failed","warning":"Warning","info":"Notice","yes":"Yes","no":"No","all":"All Types","select":"Select"},"validation":{"pathMustStartWithSlash":"Path must start with \\"/\\"","pathTraversalNotAllowed":"Path cannot contain \\"..\\"","singleDotNotAllowed":"Path cannot contain standalone \\".\\"","consecutiveSlashNotAllowed":"Path cannot contain consecutive slashes","invalidCharacters":"Path contains invalid characters, please use a valid path format","uploadDirReplace":"Upload directory"},"language":{"switchTo":"中/En","switchLanguage":"Switch Language"},"whitelist":{"title":"Whitelist Mode Enabled","description":"Sorry, the whitelist mode is currently enabled. Uploaded images need to be approved before they can be displayed. Please wait for approval.","goHome":"Go Home","goBack":"Go Back","helpText":"You can try:","uploadImage":"Upload Image","refreshPage":"Refresh Page"}}');const i="app-locale";function r(){const e=localStorage.getItem(i);return"zh-CN"===e||"en"===e?e:"zh-CN"}const s=(0,o.hU)({legacy:!0,locale:r(),fallbackLocale:"zh-CN",messages:{"zh-CN":n,en:l}});function d(e){s.global.locale=e,localStorage.setItem(i,e),document.documentElement.lang="zh-CN"===e?"zh-CN":"en"}var c=s},81525:function(e,a,t){t(18111),t(7588);var o=t(45130),n=t(73888),l=t(18642),i=(t(15412),t(30372),t(98950)),r=t(30292),s=t(47984),d=t(79262),c=t(70193),u=t(55363),m=t(31050),p=t(22909),h=t(10220),g=t(74036),f=t(90389),y=t(81828),b=t(27483),C=t(66806),k=t(61536),T=t(3263),w=t(57038),v=t(63416),S=t(63027),P=t(19223),F=t(93422),A=t(16249),D=t(34335),L=t(14722),U=t(16829),N=t(53916),M=t(48749),I=t(2511),R=t(12375),x=t(97619),B=t(84310),E=t(14552),O=t(79919),W=t(10767),q=t(20491),V=t(18422),j=t(17214),H=t(44845),z=t(55319),K=t(71669),Q=t(38557),J=t(15925),_=t(10798),G=t(39329),Y=t(59708),X=t(41165),$=t(50230),Z=t(99288),ee=t(67992),ae=t(37538),te=t(13118),oe=t(36050),ne=t(69721),le=t(75192),ie=t(50672),re=t(3149),se=t(11221),de=t(73585),ce=t(63236),ue=t(1860),me=t(13110),pe=t(6246),he=t(42302),ge=t(75504),fe=t(40587),ye=t(5299),be=t(81775),Ce=t(13127),ke=t(18742),Te=t(97579),we=t(56746),ve=t(58422),Se=t(20444),Pe=t(88502),Fe=t(21872),Ae=t(64795),De=t(82262),Le=t(88921),Ue=t(39916),Ne=t(18579),Me=t(80500),Ie=t(58428),Re=t(87849),xe=t(78034),Be=t(59413),Ee=t(58869),Oe=t(79102),We=t(78337),qe=t(38870),Ve=t(70577),je=t(93212),He=t(40275),ze=t(52995),Ke=t(38410),Qe=t(167),Je=t(53223),_e=t(97447),Ge=t(67830),Ye=[u.rC,m.UH,p.B0,h.Ce,g.IN,s.xK,f.Df,y.ck,b.LB,C.e4,k.ok,T.$F,w.gK,v.e6,S.rQ,P.Jt,F.Wz,A.Xk,D.B2,L.a$,U.jB,d.ZD,N.wF,M.rO,I.jT,R.Xb,x.dB,B.Ub,E.q9,O.rM,W.jP,q.he,c._2,V.cb,j.MT,H.vH,z.v,K.bx,Q.tU,J.zp,_.A,G.pS,Y.A4,X.h8,$.o1,Z.UD,ee.mR,ae.ao,te.Uj,oe.gD,ne.Bw,le.CY,ie.In,re.v0,se.lS,de.jb,ce.yv,ue.Up,me.iW,pe.CQ,he.IT,ge.EZ,fe.xb,ye.PJ,be.X,Ce.ji,ke.is,Te.R9,we.QL,ve.wR,Se.oE,Pe.ye,Fe.UB,Ae.hS,De.Mj,Le.D6,Ue.QO,Ne.V2,Me.im,Ie.Gx,Re.H9,xe.Yp,Be.z1,Ee.Nf,Oe.oM,We.VN,qe.Ot,Ve.xi,je._2,He.DX,ze.l9,Ke.GR,Qe.ns,Je.Be,_e.Jm,Ge.Mc],Xe=t(97722),$e=(t(85331),t(10961),t(56768));function Ze(e,a,t,o,n,l){const i=(0,$e.g2)("router-view"),r=Xe.H6;return(0,$e.uX)(),(0,$e.Wv)(r,{locale:l.elementLocale},{default:(0,$e.k6)(()=>[(0,$e.bF)(i)]),_:1},8,["locale"])}var ea=t(60782),aa=t(6166),ta=t(55186),oa=t(54791),na={data(){return{osInstance:null,imageViewerObserver:null}},computed:{...(0,ea.L8)(["userConfig","useDarkMode"]),elementLocale(){return"zh-CN"===this.$i18n.locale?ta.A:oa.A}},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars(),this.setupImageViewerObserver()})},beforeUnmount(){this.imageViewerObserver&&this.imageViewerObserver.disconnect()},watch:{},methods:{initOverlayScrollbars(){try{if(aa.ae.valid(document.body))return void(this.osInstance=(0,aa.ae)(document.body));this.osInstance=(0,aa.ae)(document.body,{scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"scroll",autoHideDelay:600,dragScroll:!0,clickScroll:!0},overflow:{x:"hidden",y:"scroll"}}),console.log("OverlayScrollbars initialized successfully")}catch(e){console.error("Failed to initialize OverlayScrollbars:",e)}},setupImageViewerObserver(){this.imageViewerObserver=new MutationObserver(e=>{const a=document.querySelector(".el-image-viewer__wrapper");a?this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"hidden"}}):this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"scroll"}})}),this.imageViewerObserver.observe(document.body,{childList:!0,subtree:!0})}}},la=t(71241);const ia=(0,la.A)(na,[["render",Ze]]);var ra=ia,sa=t(16915),da=t(25507),ca=t(46638),ua=t(57477);t(21862),t(50635);i.Yv.add(...Ye);const ma=(0,o.Ef)(ra),pa=(0,n.Zf)();ma.component("font-awesome-icon",r.gc);for(const[ba,Ca]of Object.entries(ua))ma.component(ba,Ca);const ha=()=>{const e=document.documentElement;let a;if(da.A.state.cusDarkMode&&null!==da.A.state.useDarkMode)a=da.A.state.useDarkMode;else{if(a=window.matchMedia("(prefers-color-scheme: dark)").matches,!a){const e=new Date,t=e.getHours();a=t>=22||t<6}da.A.commit("setUseDarkMode",a)}a?e.classList.add("dark"):e.classList.remove("dark")},ga=e=>{const a=document.documentElement;e?a.classList.add("dark"):a.classList.remove("dark")},fa=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},ya=(e,a)=>{const t=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');t.forEach(e=>e.remove());const o=document.createElement("link"),n=document.createElement("link"),l=document.createElement("link");o.rel="icon",n.rel="apple-touch-icon",l.rel="mask-icon",e?(o.href=a?.siteIcon||"/static/media/logo-dark.png",n.href=a?.siteIcon||"/static/media/logo-dark.png",l.href=a?.siteIcon||"/static/media/logo-dark.png"):(o.href=a?.siteIcon||"/static/media/logo.png",n.href=a?.siteIcon||"/static/media/logo.png",l.href=a?.siteIcon||"/static/media/logo.png"),document.head.appendChild(o),document.head.appendChild(n),document.head.appendChild(l)};da.A.dispatch("fetchUserConfig").then(()=>{ha(),fa(da.A.getters.userConfig),ya(da.A.state.useDarkMode,da.A.getters.userConfig),da.A.subscribe((e,a)=>{"setUseDarkMode"===e.type&&da.A.state.cusDarkMode&&(ga(a.useDarkMode),ya(a.useDarkMode,da.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(ha(),ya(da.A.state.useDarkMode,da.A.getters.userConfig))}),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).use(pa).mount("#app")})}},a={};function t(o){var n=a[o];if(void 0!==n)return n.exports;var l=a[o]={exports:{}};return e[o].call(l.exports,l,l.exports,t),l.exports}t.m=e,function(){var e=[];t.O=function(a,o,n,l){if(!o){var i=1/0;for(c=0;c=l)&&Object.keys(t.O).every(function(e){return t.O[e](o[s])})?o.splice(s--,1):(r=!1,l0&&e[c-1][2]>l;c--)e[c]=e[c-1];e[c]=[o,n,l]}}(),function(){t.n=function(e){var a=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(a,{a:a}),a}}(),function(){t.d=function(e,a){for(var o in a)t.o(a,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:a[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce(function(a,o){return t.f[o](e,a),a},[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{51:"6e7bf298",142:"fc366b6d",226:"ec43855c",396:"b3b6ae37",528:"f7e99a9f",529:"287c329f",600:"08192622",604:"a1f7358f",718:"27080555",728:"3968461e",917:"b77a6783",997:"7b6c8b5a"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{51:"1dd65d6c",226:"6548e7b4",385:"20c34d33",396:"3a3d9729",451:"7e03bef9",528:"4c6718b2",529:"6c0a8231",604:"1353235b",718:"d0974d1c",728:"1353235b",915:"52b943c1",917:"8529ad1e",997:"87fa4059"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)}}(),function(){var e={},a="sanyue_imghub:";t.l=function(o,n,l,i){if(e[o])e[o].push(n);else{var r,s;if(void 0!==l)for(var d=document.getElementsByTagName("script"),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�J&Q+Aw!QseYyMPt`NDgfRjSU6~-13lq-df%lUhJ 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 F0RV@^$cF#` literal 0 HcmV?d00001 diff --git a/frontend-dist/js/app.5832846c.js.map b/frontend-dist/js/app.4c47588b.js.map similarity index 98% rename from frontend-dist/js/app.5832846c.js.map rename to frontend-dist/js/app.4c47588b.js.map index 8612134c..b889ae2c 100644 --- a/frontend-dist/js/app.5832846c.js.map +++ b/frontend-dist/js/app.4c47588b.js.map @@ -1 +1 @@ -{"version":3,"file":"js/app.5832846c.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/router/index.js","webpack://sanyue_imghub/./src/store/index.js","webpack://sanyue_imghub/./src/locales/index.js","webpack://sanyue_imghub/./src/utils/fontawesomeIcons.js","webpack://sanyue_imghub/./src/App.vue?83ca","webpack://sanyue_imghub/./src/App.vue","webpack://sanyue_imghub/./src/App.vue?a135","webpack://sanyue_imghub/./src/main.js","webpack://sanyue_imghub/webpack/bootstrap","webpack://sanyue_imghub/webpack/runtime/chunk loaded","webpack://sanyue_imghub/webpack/runtime/compat get default export","webpack://sanyue_imghub/webpack/runtime/define property getters","webpack://sanyue_imghub/webpack/runtime/ensure chunk","webpack://sanyue_imghub/webpack/runtime/get javascript chunk filename","webpack://sanyue_imghub/webpack/runtime/get mini-css chunk filename","webpack://sanyue_imghub/webpack/runtime/global","webpack://sanyue_imghub/webpack/runtime/hasOwnProperty shorthand","webpack://sanyue_imghub/webpack/runtime/load script","webpack://sanyue_imghub/webpack/runtime/make namespace object","webpack://sanyue_imghub/webpack/runtime/publicPath","webpack://sanyue_imghub/webpack/runtime/css loading","webpack://sanyue_imghub/webpack/runtime/jsonp chunk loading","webpack://sanyue_imghub/webpack/startup"],"sourcesContent":["import axios from 'axios';\r\n\r\n// 创建axios实例\r\nconst instance = axios.create({\r\n baseURL: process.env.NODE_ENV === 'production' ? '/' : '/api',\r\n withCredentials: true, // 始终携带 Cookie(HttpOnly session cookie)\r\n});\r\n\r\nexport default instance;\r\n","import { createRouter, createWebHistory } from 'vue-router'\r\nimport { ElMessage } from 'element-plus'\r\nimport store from '../store'\r\nimport axios from '@/utils/axios'\r\nimport i18n from '@/locales'\r\n\r\n// 通用的管理员认证守卫\r\nconst adminAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要管理端认证,直接放行\r\n if (!data.adminRequired) {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效的 admin session\r\n if (data.valid && data.authType === 'admin') {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要用户端认证,直接放行\r\n if (!data.userRequired) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效 session(user 或 admin 都可以)\r\n if (data.valid) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('../views/UploadHome.vue'),\r\n beforeEnter: userAuthGuard\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: () => import('../views/Login.vue')\r\n },\r\n {\r\n path: '/dashboard',\r\n name: 'dashboard',\r\n component: () => import('../views/AdminDashBoard.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/customerConfig',\r\n name: 'customerConfig',\r\n component: () => import('../views/CustomerConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/systemConfig',\r\n name: 'systemConfig',\r\n component: () => import('../views/SystemConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/adminLogin',\r\n name: 'adminLogin',\r\n component: () => import('../views/AdminLogin.vue'),\r\n },\r\n {\r\n path: '/blockimg',\r\n name: 'blockimg',\r\n component: () => import('../views/BlockImage.vue'),\r\n },\r\n {\r\n path: '/whiteliston',\r\n name: 'whiteliston',\r\n component: () => import('../views/WhiteListOn.vue'),\r\n },\r\n {\r\n path: '/browse/:dir*',\r\n name: 'publicBrowse',\r\n component: () => import('../views/PublicBrowse.vue'),\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n name: 'notFound',\r\n component: () => import('../views/NotFound.vue'),\r\n },\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","import { createStore } from 'vuex'\r\nimport axios from '@/utils/axios';\r\nimport createPersistedState from 'vuex-persistedstate';\r\n\r\nexport default createStore({\r\n state: {\r\n userConfig: null,\r\n bingWallPapers: [],\r\n // 会话状态标记(不存储密码,实际认证通过 HttpOnly Cookie)\r\n adminLoggedIn: false,\r\n userLoggedIn: false,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: undefined,\r\n compressQuality: undefined,\r\n compressBar: undefined,\r\n serverCompress: undefined,\r\n convertToWebp: undefined,\r\n },\r\n storeUploadChannel: '',\r\n storeChannelName: null, // 指定的渠道名称,null表示从未选择,''表示用户主动清空\r\n storeAutoRetry: true,\r\n storeUploadNameType: '',\r\n uploadFolder: '',\r\n customUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n adminUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n autoReUpload: true,\r\n // 深色模式\r\n useDarkMode: null,\r\n cusDarkMode: false,\r\n },\r\n getters: {\r\n userConfig: state => state.userConfig,\r\n bingWallPapers: state => state.bingWallPapers,\r\n // 保留 credentials getter 以兼容 fetchWithAuth.js 等现有代码\r\n credentials: state => state.adminLoggedIn ? '__session__' : null,\r\n adminLoggedIn: state => state.adminLoggedIn,\r\n userLoggedIn: state => state.userLoggedIn,\r\n storeUploadMethod: state => state.uploadMethod,\r\n uploadCopyUrlForm: state => state.uploadCopyUrlForm,\r\n compressConfig: state => state.compressConfig,\r\n storeUploadChannel: state => state.storeUploadChannel,\r\n storeChannelName: state => state.storeChannelName,\r\n storeUploadNameType: state => state.storeUploadNameType,\r\n customUrlSettings: state => state.customUrlSettings,\r\n storeAutoRetry: state => state.storeAutoRetry,\r\n adminUrlSettings: state => state.adminUrlSettings,\r\n storeUploadFolder: (state) => {\r\n return state.uploadFolder || localStorage.getItem('uploadFolder') || ''\r\n },\r\n useDarkMode: state => state.useDarkMode,\r\n cusDarkMode: state => state.cusDarkMode,\r\n storeAutoReUpload: state => state.autoReUpload,\r\n },\r\n mutations: {\r\n setUserConfig(state, userConfig) {\r\n state.userConfig = userConfig;\r\n },\r\n setBingWallPapers(state, bingWallPapers) {\r\n state.bingWallPapers = bingWallPapers;\r\n },\r\n // 兼容旧代码:setCredentials 映射到 adminLoggedIn\r\n setCredentials(state, credentials) {\r\n state.adminLoggedIn = credentials !== null && credentials !== undefined;\r\n },\r\n setAdminLoggedIn(state, loggedIn) {\r\n state.adminLoggedIn = loggedIn;\r\n },\r\n setUserLoggedIn(state, loggedIn) {\r\n state.userLoggedIn = loggedIn;\r\n },\r\n setUploadMethod(state, uploadMethod) {\r\n state.uploadMethod = uploadMethod;\r\n },\r\n setUploadCopyUrlForm(state, uploadCopyUrlForm) {\r\n state.uploadCopyUrlForm = uploadCopyUrlForm;\r\n },\r\n setCompressConfig(state, { key, value }) {\r\n state.compressConfig[key] = value;\r\n },\r\n setStoreUploadChannel(state, uploadChannel) {\r\n state.storeUploadChannel = uploadChannel;\r\n },\r\n setStoreChannelName(state, channelName) {\r\n state.storeChannelName = channelName;\r\n },\r\n setStoreUploadNameType(state, storeUploadNameType) {\r\n state.storeUploadNameType = storeUploadNameType;\r\n },\r\n setCustomUrlSettings(state, { key, value }) {\r\n state.customUrlSettings[key] = value;\r\n },\r\n setStoreAutoRetry(state, storeAutoRetry) {\r\n state.storeAutoRetry = storeAutoRetry;\r\n },\r\n setAdminUrlSettings(state, { key, value }) {\r\n state.adminUrlSettings[key] = value;\r\n },\r\n setUseDarkMode(state, useDarkMode) {\r\n state.useDarkMode = useDarkMode;\r\n },\r\n setCusDarkMode(state, cusDarkMode) {\r\n state.cusDarkMode = cusDarkMode;\r\n },\r\n setStoreUploadFolder(state, folder) {\r\n state.uploadFolder = folder\r\n localStorage.setItem('uploadFolder', folder)\r\n },\r\n setStoreAutoReUpload(state, autoReUpload) {\r\n state.autoReUpload = autoReUpload;\r\n }\r\n },\r\n actions: {\r\n async fetchUserConfig({ commit }) {\r\n try {\r\n const response = await axios.get('/api/userConfig');\r\n commit('setUserConfig', response.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n async fetchBingWallPapers({ commit }) {\r\n try {\r\n const response = await axios.get('/api/bing/wallpaper');\r\n const wallpapers = response.data.data;\r\n const bingWallPapers = wallpapers.map(wallpaper => {\r\n return {\r\n url: 'https://www.bing.com' + wallpaper.url,\r\n };\r\n }\r\n );\r\n\r\n //预加载图片,阻塞直到图片加载完成\r\n await Promise.all(bingWallPapers.map(wallpaper => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = resolve;\r\n img.onerror = reject;\r\n img.src = wallpaper.url;\r\n });\r\n }));\r\n commit('setBingWallPapers', bingWallPapers);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n },\r\n modules: {\r\n },\r\n plugins: [createPersistedState({\r\n // 只持久化非敏感数据,不持久化认证状态\r\n paths: [\r\n 'userConfig',\r\n 'uploadMethod',\r\n 'uploadCopyUrlForm',\r\n 'compressConfig',\r\n 'storeUploadChannel',\r\n 'storeChannelName',\r\n 'storeAutoRetry',\r\n 'storeUploadNameType',\r\n 'uploadFolder',\r\n 'customUrlSettings',\r\n 'adminUrlSettings',\r\n 'autoReUpload',\r\n 'useDarkMode',\r\n 'cusDarkMode',\r\n ]\r\n })]\r\n})\r\n","import { createI18n } from 'vue-i18n'\r\nimport zhCN from './zh-CN.json'\r\nimport en from './en.json'\r\n\r\nconst LOCALE_KEY = 'app-locale'\r\n\r\nfunction getStoredLocale() {\r\n const stored = localStorage.getItem(LOCALE_KEY)\r\n if (stored === 'zh-CN' || stored === 'en') return stored\r\n return 'zh-CN'\r\n}\r\n\r\nconst i18n = createI18n({\r\n legacy: true,\r\n locale: getStoredLocale(),\r\n fallbackLocale: 'zh-CN',\r\n messages: { 'zh-CN': zhCN, en }\r\n})\r\n\r\nexport function setLocale(locale) {\r\n i18n.global.locale = locale\r\n localStorage.setItem(LOCALE_KEY, locale)\r\n document.documentElement.lang = locale === 'zh-CN' ? 'zh-CN' : 'en'\r\n}\r\n\r\nexport { LOCALE_KEY, getStoredLocale }\r\nexport default i18n\r\n","import { faAws } from '@fortawesome/free-brands-svg-icons/faAws';\r\nimport { faCloudflare } from '@fortawesome/free-brands-svg-icons/faCloudflare';\r\nimport { faDiscord } from '@fortawesome/free-brands-svg-icons/faDiscord';\r\nimport { faAngleDoubleLeft } from '@fortawesome/free-solid-svg-icons/faAngleDoubleLeft';\r\nimport { faAngleDoubleRight } from '@fortawesome/free-solid-svg-icons/faAngleDoubleRight';\r\nimport { faArrowDown } from '@fortawesome/free-solid-svg-icons/faArrowDown';\r\nimport { faArrowLeft } from '@fortawesome/free-solid-svg-icons/faArrowLeft';\r\nimport { faArrowUp } from '@fortawesome/free-solid-svg-icons/faArrowUp';\r\nimport { faBan } from '@fortawesome/free-solid-svg-icons/faBan';\r\nimport { faBars } from '@fortawesome/free-solid-svg-icons/faBars';\r\nimport { faBook } from '@fortawesome/free-solid-svg-icons/faBook';\r\nimport { faBullhorn } from '@fortawesome/free-solid-svg-icons/faBullhorn';\r\nimport { faCalendar } from '@fortawesome/free-solid-svg-icons/faCalendar';\r\nimport { faChartBar } from '@fortawesome/free-solid-svg-icons/faChartBar';\r\nimport { faChartLine } from '@fortawesome/free-solid-svg-icons/faChartLine';\r\nimport { faCheck } from '@fortawesome/free-solid-svg-icons/faCheck';\r\nimport { faCheckSquare } from '@fortawesome/free-solid-svg-icons/faCheckSquare';\r\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown';\r\nimport { faChevronLeft } from '@fortawesome/free-solid-svg-icons/faChevronLeft';\r\nimport { faChevronRight } from '@fortawesome/free-solid-svg-icons/faChevronRight';\r\nimport { faCircleHalfStroke } from '@fortawesome/free-solid-svg-icons/faCircleHalfStroke';\r\nimport { faClock } from '@fortawesome/free-solid-svg-icons/faClock';\r\nimport { faCloud } from '@fortawesome/free-solid-svg-icons/faCloud';\r\nimport { faCloudUpload } from '@fortawesome/free-solid-svg-icons/faCloudUpload';\r\nimport { faCloudUploadAlt } from '@fortawesome/free-solid-svg-icons/faCloudUploadAlt';\r\nimport { faCode } from '@fortawesome/free-solid-svg-icons/faCode';\r\nimport { faCodeBranch } from '@fortawesome/free-solid-svg-icons/faCodeBranch';\r\nimport { faCog } from '@fortawesome/free-solid-svg-icons/faCog';\r\nimport { faCogs } from '@fortawesome/free-solid-svg-icons/faCogs';\r\nimport { faComments } from '@fortawesome/free-solid-svg-icons/faComments';\r\nimport { faCompressAlt } from '@fortawesome/free-solid-svg-icons/faCompressAlt';\r\nimport { faCopy } from '@fortawesome/free-solid-svg-icons/faCopy';\r\nimport { faDatabase } from '@fortawesome/free-solid-svg-icons/faDatabase';\r\nimport { faDownload } from '@fortawesome/free-solid-svg-icons/faDownload';\r\nimport { faEdit } from '@fortawesome/free-solid-svg-icons/faEdit';\r\nimport { faEllipsisH } from '@fortawesome/free-solid-svg-icons/faEllipsisH';\r\nimport { faEllipsisV } from '@fortawesome/free-solid-svg-icons/faEllipsisV';\r\nimport { faExclamation } from '@fortawesome/free-solid-svg-icons/faExclamation';\r\nimport { faExclamationCircle } from '@fortawesome/free-solid-svg-icons/faExclamationCircle';\r\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons/faExclamationTriangle';\r\nimport { faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons/faExternalLinkAlt';\r\nimport { faEye } from '@fortawesome/free-solid-svg-icons/faEye';\r\nimport { faFile } from '@fortawesome/free-solid-svg-icons/faFile';\r\nimport { faFileAlt } from '@fortawesome/free-solid-svg-icons/faFileAlt';\r\nimport { faFileExport } from '@fortawesome/free-solid-svg-icons/faFileExport';\r\nimport { faFileSignature } from '@fortawesome/free-solid-svg-icons/faFileSignature';\r\nimport { faFilter } from '@fortawesome/free-solid-svg-icons/faFilter';\r\nimport { faFolder } from '@fortawesome/free-solid-svg-icons/faFolder';\r\nimport { faFolderOpen } from '@fortawesome/free-solid-svg-icons/faFolderOpen';\r\nimport { faFolderTree } from '@fortawesome/free-solid-svg-icons/faFolderTree';\r\nimport { faGlobe } from '@fortawesome/free-solid-svg-icons/faGlobe';\r\nimport { faHashtag } from '@fortawesome/free-solid-svg-icons/faHashtag';\r\nimport { faHistory } from '@fortawesome/free-solid-svg-icons/faHistory';\r\nimport { faHome } from '@fortawesome/free-solid-svg-icons/faHome';\r\nimport { faICursor } from '@fortawesome/free-solid-svg-icons/faICursor';\r\nimport { faImage } from '@fortawesome/free-solid-svg-icons/faImage';\r\nimport { faImages } from '@fortawesome/free-solid-svg-icons/faImages';\r\nimport { faInbox } from '@fortawesome/free-solid-svg-icons/faInbox';\r\nimport { faInfoCircle } from '@fortawesome/free-solid-svg-icons/faInfoCircle';\r\nimport { faLink } from '@fortawesome/free-solid-svg-icons/faLink';\r\nimport { faList } from '@fortawesome/free-solid-svg-icons/faList';\r\nimport { faMinus } from '@fortawesome/free-solid-svg-icons/faMinus';\r\nimport { faMinusSquare } from '@fortawesome/free-solid-svg-icons/faMinusSquare';\r\nimport { faMoon } from '@fortawesome/free-solid-svg-icons/faMoon';\r\nimport { faMusic } from '@fortawesome/free-solid-svg-icons/faMusic';\r\nimport { faPager } from '@fortawesome/free-solid-svg-icons/faPager';\r\nimport { faPaperPlane } from '@fortawesome/free-solid-svg-icons/faPaperPlane';\r\nimport { faPaste } from '@fortawesome/free-solid-svg-icons/faPaste';\r\nimport { faPlus } from '@fortawesome/free-solid-svg-icons/faPlus';\r\nimport { faQuestionCircle } from '@fortawesome/free-solid-svg-icons/faQuestionCircle';\r\nimport { faQuoteRight } from '@fortawesome/free-solid-svg-icons/faQuoteRight';\r\nimport { faRedo } from '@fortawesome/free-solid-svg-icons/faRedo';\r\nimport { faRobot } from '@fortawesome/free-solid-svg-icons/faRobot';\r\nimport { faSave } from '@fortawesome/free-solid-svg-icons/faSave';\r\nimport { faSearch } from '@fortawesome/free-solid-svg-icons/faSearch';\r\nimport { faServer } from '@fortawesome/free-solid-svg-icons/faServer';\r\nimport { faShareAlt } from '@fortawesome/free-solid-svg-icons/faShareAlt';\r\nimport { faShield } from '@fortawesome/free-solid-svg-icons/faShield';\r\nimport { faShieldAlt } from '@fortawesome/free-solid-svg-icons/faShieldAlt';\r\nimport { faSignOutAlt } from '@fortawesome/free-solid-svg-icons/faSignOutAlt';\r\nimport { faSortAlphaUp } from '@fortawesome/free-solid-svg-icons/faSortAlphaUp';\r\nimport { faSortAmountDown } from '@fortawesome/free-solid-svg-icons/faSortAmountDown';\r\nimport { faSpinner } from '@fortawesome/free-solid-svg-icons/faSpinner';\r\nimport { faSquare } from '@fortawesome/free-solid-svg-icons/faSquare';\r\nimport { faSun } from '@fortawesome/free-solid-svg-icons/faSun';\r\nimport { faSync } from '@fortawesome/free-solid-svg-icons/faSync';\r\nimport { faSyncAlt } from '@fortawesome/free-solid-svg-icons/faSyncAlt';\r\nimport { faTachometerAlt } from '@fortawesome/free-solid-svg-icons/faTachometerAlt';\r\nimport { faTag } from '@fortawesome/free-solid-svg-icons/faTag';\r\nimport { faTags } from '@fortawesome/free-solid-svg-icons/faTags';\r\nimport { faThLarge } from '@fortawesome/free-solid-svg-icons/faThLarge';\r\nimport { faTimes } from '@fortawesome/free-solid-svg-icons/faTimes';\r\nimport { faTools } from '@fortawesome/free-solid-svg-icons/faTools';\r\nimport { faTrashAlt } from '@fortawesome/free-solid-svg-icons/faTrashAlt';\r\nimport { faUpload } from '@fortawesome/free-solid-svg-icons/faUpload';\r\nimport { faUserCog } from '@fortawesome/free-solid-svg-icons/faUserCog';\r\n\r\nexport default [\r\n faAngleDoubleLeft,\r\n faAngleDoubleRight,\r\n faArrowDown,\r\n faArrowLeft,\r\n faArrowUp,\r\n faAws,\r\n faBan,\r\n faBars,\r\n faBook,\r\n faBullhorn,\r\n faCalendar,\r\n faChartBar,\r\n faChartLine,\r\n faCheck,\r\n faCheckSquare,\r\n faChevronDown,\r\n faChevronLeft,\r\n faChevronRight,\r\n faCircleHalfStroke,\r\n faClock,\r\n faCloud,\r\n faCloudflare,\r\n faCloudUpload,\r\n faCloudUploadAlt,\r\n faCode,\r\n faCodeBranch,\r\n faCog,\r\n faCogs,\r\n faComments,\r\n faCompressAlt,\r\n faCopy,\r\n faDatabase,\r\n faDiscord,\r\n faDownload,\r\n faEdit,\r\n faEllipsisH,\r\n faEllipsisV,\r\n faExclamation,\r\n faExclamationCircle,\r\n faExclamationTriangle,\r\n faExternalLinkAlt,\r\n faEye,\r\n faFile,\r\n faFileAlt,\r\n faFileExport,\r\n faFileSignature,\r\n faFilter,\r\n faFolder,\r\n faFolderOpen,\r\n faFolderTree,\r\n faGlobe,\r\n faHashtag,\r\n faHistory,\r\n faHome,\r\n faICursor,\r\n faImage,\r\n faImages,\r\n faInbox,\r\n faInfoCircle,\r\n faLink,\r\n faList,\r\n faMinus,\r\n faMinusSquare,\r\n faMoon,\r\n faMusic,\r\n faPager,\r\n faPaperPlane,\r\n faPaste,\r\n faPlus,\r\n faQuestionCircle,\r\n faQuoteRight,\r\n faRedo,\r\n faRobot,\r\n faSave,\r\n faSearch,\r\n faServer,\r\n faShareAlt,\r\n faShield,\r\n faShieldAlt,\r\n faSignOutAlt,\r\n faSortAlphaUp,\r\n faSortAmountDown,\r\n faSpinner,\r\n faSquare,\r\n faSun,\r\n faSync,\r\n faSyncAlt,\r\n faTachometerAlt,\r\n faTag,\r\n faTags,\r\n faThLarge,\r\n faTimes,\r\n faTools,\r\n faTrashAlt,\r\n faUpload,\r\n faUserCog\r\n];\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_router_view = _resolveComponent(\"router-view\");\n const _component_el_config_provider = _resolveComponent(\"el-config-provider\");\n return _openBlock(), _createBlock(_component_el_config_provider, {\n locale: $options.elementLocale\n }, {\n default: _withCtx(() => [_createVNode(_component_router_view)]),\n _: 1\n }, 8, [\"locale\"]);\n}","import { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nimport zhCnLocale from 'element-plus/es/locale/lang/zh-cn';\nimport enLocale from 'element-plus/es/locale/lang/en';\nexport default {\n data() {\n return {\n osInstance: null,\n imageViewerObserver: null\n };\n },\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode']),\n elementLocale() {\n return this.$i18n.locale === 'zh-CN' ? zhCnLocale : enLocale;\n }\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n this.setupImageViewerObserver();\n });\n },\n beforeUnmount() {\n // 清理 MutationObserver\n if (this.imageViewerObserver) {\n this.imageViewerObserver.disconnect();\n }\n },\n watch: {},\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n this.osInstance = OverlayScrollbars(document.body);\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n this.osInstance = OverlayScrollbars(document.body, {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: 'auto',\n autoHide: 'scroll',\n autoHideDelay: 600,\n dragScroll: true,\n clickScroll: true\n },\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n console.log('OverlayScrollbars initialized successfully');\n } catch (error) {\n console.error('Failed to initialize OverlayScrollbars:', error);\n }\n },\n setupImageViewerObserver() {\n // 监听图片预览器的打开/关闭,动态控制 OverlayScrollbars\n this.imageViewerObserver = new MutationObserver(mutations => {\n const imageViewer = document.querySelector('.el-image-viewer__wrapper');\n if (imageViewer) {\n // 图片预览器打开,禁用滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'hidden'\n }\n });\n }\n } else {\n // 图片预览器关闭,恢复滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n }\n }\n });\n this.imageViewerObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=6633a13d\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\r\nimport { createHead } from '@vueuse/head'; // 导入 createHead\r\nimport ElementPlus from 'element-plus'\r\nimport 'element-plus/es/components/message/style/css'\r\nimport 'element-plus/es/components/message-box/style/css'\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\nimport fontAwesomeIcons from './utils/fontawesomeIcons';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\nimport i18n from './locales'\r\n\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport 'element-plus/theme-chalk/dark/css-vars.css'\r\nimport './styles/global.css'\r\n\r\n// OverlayScrollbars 悬浮滚动条\r\nimport 'overlayscrollbars/overlayscrollbars.css'\r\n\r\n\r\nlibrary.add(...fontAwesomeIcons);\r\n\r\nconst app = createApp(App);\r\nconst head = createHead(); // 创建 head 对象\r\n\r\napp.component('font-awesome-icon', FontAwesomeIcon);\r\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\r\n app.component(key, component)\r\n}\r\n\r\n// 根据 useDarkMode 的值添加或移除 dark 类\r\nconst initDarkModeClass = () => {\r\n const htmlElement = document.documentElement;\r\n let isDarkMode;\r\n\r\n // 判断用户是否是自定义模式\r\n if (store.state.cusDarkMode && store.state.useDarkMode !== null) {\r\n // 用户手动设置了暗色模式\r\n isDarkMode = store.state.useDarkMode;\r\n } else {\r\n // 跟随系统模式或时间\r\n isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n if (!isDarkMode) {\r\n const now = new Date();\r\n const hour = now.getHours();\r\n isDarkMode = hour >= 22 || hour < 6;\r\n }\r\n // 更新 useDarkMode 的值\r\n store.commit('setUseDarkMode', isDarkMode);\r\n }\r\n\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\nconst applyDarkModeClass = (isDarkMode) => {\r\n const htmlElement = document.documentElement;\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\n// 预设网站标题的函数\r\nconst presetSiteTitle = (userConfig) => {\r\n document.title = userConfig?.siteTitle || 'Sanyue ImgHub';\r\n};\r\n\r\n// 预设和更新网站图标的函数\r\nconst presetSiteIcon = (isDarkMode, userConfig) => {\r\n // 同时更改 icon apple-touch-icon 和 mask-icon\r\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\r\n existingIcons.forEach(icon => icon.remove());\r\n\r\n const iconLink = document.createElement('link');\r\n const appleIconLink = document.createElement('link');\r\n const maskIconLink = document.createElement('link');\r\n iconLink.rel = 'icon';\r\n appleIconLink.rel = 'apple-touch-icon';\r\n maskIconLink.rel = 'mask-icon';\r\n\r\n if (isDarkMode) {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n }\r\n\r\n document.head.appendChild(iconLink);\r\n document.head.appendChild(appleIconLink);\r\n document.head.appendChild(maskIconLink);\r\n};\r\n\r\nstore.dispatch('fetchUserConfig').then(() => {\r\n // 初始化时应用 dark 模式\r\n initDarkModeClass();\r\n\r\n // 预设网站标题和图标\r\n presetSiteTitle(store.getters.userConfig);\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n\r\n // 监听 useDarkMode 和 cusDarkMode 的变化\r\n store.subscribe((mutation, state) => {\r\n if (mutation.type === 'setUseDarkMode' && store.state.cusDarkMode) {\r\n applyDarkModeClass(state.useDarkMode);\r\n // 同时更新网站图标\r\n presetSiteIcon(state.useDarkMode, store.getters.userConfig);\r\n }\r\n\r\n // 监听 cusDarkMode 变化,当设置为 false 时重新初始化\r\n if (mutation.type === 'setCusDarkMode' && !mutation.payload) {\r\n // 切换到跟随系统模式,重新初始化\r\n initDarkModeClass();\r\n // 同时更新网站图标\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n }\r\n });\r\n\r\n app.use(store).use(router).use(ElementPlus).use(i18n).mount('#app');\r\n}).catch(error => {\r\n console.error('Failed to load user configuration:', error);\r\n app.use(store).use(router).use(ElementPlus).use(i18n).use(head).mount('#app');\r\n})\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"51\":\"6e7bf298\",\"226\":\"ec43855c\",\"309\":\"b7dca603\",\"396\":\"226339af\",\"528\":\"f7e99a9f\",\"529\":\"e05f38bd\",\"600\":\"08192622\",\"604\":\"a1f7358f\",\"718\":\"27080555\",\"728\":\"3968461e\",\"770\":\"865557c0\",\"917\":\"b77a6783\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"51\":\"1dd65d6c\",\"226\":\"6548e7b4\",\"396\":\"3a3d9729\",\"428\":\"8044ed41\",\"528\":\"4c6718b2\",\"529\":\"6c0a8231\",\"604\":\"1353235b\",\"718\":\"d0974d1c\",\"728\":\"1353235b\",\"740\":\"a94dbb46\",\"770\":\"37d2e9e0\",\"833\":\"95983fa6\",\"917\":\"8529ad1e\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"sanyue_imghub:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"51\":1,\"226\":1,\"396\":1,\"428\":1,\"528\":1,\"529\":1,\"604\":1,\"718\":1,\"728\":1,\"740\":1,\"770\":1,\"833\":1,\"917\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(428|740|833)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunksanyue_imghub\"] = self[\"webpackChunksanyue_imghub\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(81525); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","withCredentials","adminAuthGuard","to","from","next","get","then","res","data","adminRequired","store","commit","valid","authType","wasLoggedIn","state","adminLoggedIn","name","ElMessage","error","i18n","global","t","catch","userAuthGuard","userRequired","userLoggedIn","routes","path","component","beforeEnter","router","createRouter","history","createWebHistory","process","createStore","userConfig","bingWallPapers","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","undefined","compressQuality","compressBar","serverCompress","convertToWebp","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode","getters","credentials","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setCredentials","setAdminLoggedIn","loggedIn","setUserLoggedIn","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","key","value","setStoreUploadChannel","uploadChannel","setStoreChannelName","channelName","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","response","console","log","fetchBingWallPapers","wallpapers","map","wallpaper","url","Promise","all","resolve","reject","img","Image","onload","onerror","src","modules","plugins","createPersistedState","paths","LOCALE_KEY","getStoredLocale","stored","createI18n","legacy","locale","fallbackLocale","messages","zhCN","en","setLocale","document","documentElement","lang","faAngleDoubleLeft","faAngleDoubleRight","faArrowDown","faArrowLeft","faArrowUp","faAws","faBan","faBars","faBook","faBullhorn","faCalendar","faChartBar","faChartLine","faCheck","faCheckSquare","faChevronDown","faChevronLeft","faChevronRight","faCircleHalfStroke","faClock","faCloud","faCloudflare","faCloudUpload","faCloudUploadAlt","faCode","faCodeBranch","faCog","faCogs","faComments","faCompressAlt","faCopy","faDatabase","faDiscord","faDownload","faEdit","faEllipsisH","faEllipsisV","faExclamation","faExclamationCircle","faExclamationTriangle","faExternalLinkAlt","faEye","faFile","faFileAlt","faFileExport","faFileSignature","faFilter","faFolder","faFolderOpen","faFolderTree","faGlobe","faHashtag","faHistory","faHome","faICursor","faImage","faImages","faInbox","faInfoCircle","faLink","faList","faMinus","faMinusSquare","faMoon","faMusic","faPager","faPaperPlane","faPaste","faPlus","faQuestionCircle","faQuoteRight","faRedo","faRobot","faSave","faSearch","faServer","faShareAlt","faShield","faShieldAlt","faSignOutAlt","faSortAlphaUp","faSortAmountDown","faSpinner","faSquare","faSun","faSync","faSyncAlt","faTachometerAlt","faTag","faTags","faThLarge","faTimes","faTools","faTrashAlt","faUpload","faUserCog","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","_component_el_config_provider","elementLocale","default","_","osInstance","imageViewerObserver","computed","this","$i18n","mounted","$nextTick","initOverlayScrollbars","setupImageViewerObserver","beforeUnmount","disconnect","watch","methods","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","MutationObserver","imageViewer","querySelector","options","observe","childList","subtree","__exports__","library","add","fontAwesomeIcons","app","createApp","App","head","createHead","FontAwesomeIcon","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","isDarkMode","window","matchMedia","matches","now","Date","hour","getHours","classList","remove","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","existingIcons","querySelectorAll","forEach","icon","iconLink","createElement","appleIconLink","maskIconLink","rel","href","siteIcon","appendChild","dispatch","subscribe","mutation","type","payload","use","ElementPlus","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","push","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","event","clearTimeout","timeout","doneFns","parentNode","removeChild","setTimeout","bind","target","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","nonce","onLinkComplete","errorType","realHref","err","Error","code","request","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","test","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","__webpack_exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/app.4c47588b.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/router/index.js","webpack://sanyue_imghub/./src/store/index.js","webpack://sanyue_imghub/./src/locales/index.js","webpack://sanyue_imghub/./src/utils/fontawesomeIcons.js","webpack://sanyue_imghub/./src/App.vue?83ca","webpack://sanyue_imghub/./src/App.vue","webpack://sanyue_imghub/./src/App.vue?a135","webpack://sanyue_imghub/./src/main.js","webpack://sanyue_imghub/webpack/bootstrap","webpack://sanyue_imghub/webpack/runtime/chunk loaded","webpack://sanyue_imghub/webpack/runtime/compat get default export","webpack://sanyue_imghub/webpack/runtime/define property getters","webpack://sanyue_imghub/webpack/runtime/ensure chunk","webpack://sanyue_imghub/webpack/runtime/get javascript chunk filename","webpack://sanyue_imghub/webpack/runtime/get mini-css chunk filename","webpack://sanyue_imghub/webpack/runtime/global","webpack://sanyue_imghub/webpack/runtime/hasOwnProperty shorthand","webpack://sanyue_imghub/webpack/runtime/load script","webpack://sanyue_imghub/webpack/runtime/make namespace object","webpack://sanyue_imghub/webpack/runtime/publicPath","webpack://sanyue_imghub/webpack/runtime/css loading","webpack://sanyue_imghub/webpack/runtime/jsonp chunk loading","webpack://sanyue_imghub/webpack/startup"],"sourcesContent":["import axios from 'axios';\r\n\r\n// 创建axios实例\r\nconst instance = axios.create({\r\n baseURL: process.env.NODE_ENV === 'production' ? '/' : '/api',\r\n withCredentials: true, // 始终携带 Cookie(HttpOnly session cookie)\r\n});\r\n\r\nexport default instance;\r\n","import { createRouter, createWebHistory } from 'vue-router'\r\nimport { ElMessage } from 'element-plus'\r\nimport store from '../store'\r\nimport axios from '@/utils/axios'\r\nimport i18n from '@/locales'\r\n\r\n// 通用的管理员认证守卫\r\nconst adminAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要管理端认证,直接放行\r\n if (!data.adminRequired) {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效的 admin session\r\n if (data.valid && data.authType === 'admin') {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要用户端认证,直接放行\r\n if (!data.userRequired) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效 session(user 或 admin 都可以)\r\n if (data.valid) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('../views/UploadHome.vue'),\r\n beforeEnter: userAuthGuard\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: () => import('../views/Login.vue')\r\n },\r\n {\r\n path: '/dashboard',\r\n name: 'dashboard',\r\n component: () => import('../views/AdminDashBoard.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/customerConfig',\r\n name: 'customerConfig',\r\n component: () => import('../views/CustomerConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/systemConfig',\r\n name: 'systemConfig',\r\n component: () => import('../views/SystemConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/adminLogin',\r\n name: 'adminLogin',\r\n component: () => import('../views/AdminLogin.vue'),\r\n },\r\n {\r\n path: '/blockimg',\r\n name: 'blockimg',\r\n component: () => import('../views/BlockImage.vue'),\r\n },\r\n {\r\n path: '/whiteliston',\r\n name: 'whiteliston',\r\n component: () => import('../views/WhiteListOn.vue'),\r\n },\r\n {\r\n path: '/browse/:dir*',\r\n name: 'publicBrowse',\r\n component: () => import('../views/PublicBrowse.vue'),\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n name: 'notFound',\r\n component: () => import('../views/NotFound.vue'),\r\n },\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","import { createStore } from 'vuex'\r\nimport axios from '@/utils/axios';\r\nimport createPersistedState from 'vuex-persistedstate';\r\n\r\nexport default createStore({\r\n state: {\r\n userConfig: null,\r\n bingWallPapers: [],\r\n // 会话状态标记(不存储密码,实际认证通过 HttpOnly Cookie)\r\n adminLoggedIn: false,\r\n userLoggedIn: false,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: undefined,\r\n compressQuality: undefined,\r\n compressBar: undefined,\r\n serverCompress: undefined,\r\n convertToWebp: undefined,\r\n },\r\n storeUploadChannel: '',\r\n storeChannelName: null, // 指定的渠道名称,null表示从未选择,''表示用户主动清空\r\n storeAutoRetry: true,\r\n storeUploadNameType: '',\r\n uploadFolder: '',\r\n customUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n adminUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n autoReUpload: true,\r\n // 深色模式\r\n useDarkMode: null,\r\n cusDarkMode: false,\r\n },\r\n getters: {\r\n userConfig: state => state.userConfig,\r\n bingWallPapers: state => state.bingWallPapers,\r\n // 保留 credentials getter 以兼容 fetchWithAuth.js 等现有代码\r\n credentials: state => state.adminLoggedIn ? '__session__' : null,\r\n adminLoggedIn: state => state.adminLoggedIn,\r\n userLoggedIn: state => state.userLoggedIn,\r\n storeUploadMethod: state => state.uploadMethod,\r\n uploadCopyUrlForm: state => state.uploadCopyUrlForm,\r\n compressConfig: state => state.compressConfig,\r\n storeUploadChannel: state => state.storeUploadChannel,\r\n storeChannelName: state => state.storeChannelName,\r\n storeUploadNameType: state => state.storeUploadNameType,\r\n customUrlSettings: state => state.customUrlSettings,\r\n storeAutoRetry: state => state.storeAutoRetry,\r\n adminUrlSettings: state => state.adminUrlSettings,\r\n storeUploadFolder: (state) => {\r\n return state.uploadFolder || localStorage.getItem('uploadFolder') || ''\r\n },\r\n useDarkMode: state => state.useDarkMode,\r\n cusDarkMode: state => state.cusDarkMode,\r\n storeAutoReUpload: state => state.autoReUpload,\r\n },\r\n mutations: {\r\n setUserConfig(state, userConfig) {\r\n state.userConfig = userConfig;\r\n },\r\n setBingWallPapers(state, bingWallPapers) {\r\n state.bingWallPapers = bingWallPapers;\r\n },\r\n // 兼容旧代码:setCredentials 映射到 adminLoggedIn\r\n setCredentials(state, credentials) {\r\n state.adminLoggedIn = credentials !== null && credentials !== undefined;\r\n },\r\n setAdminLoggedIn(state, loggedIn) {\r\n state.adminLoggedIn = loggedIn;\r\n },\r\n setUserLoggedIn(state, loggedIn) {\r\n state.userLoggedIn = loggedIn;\r\n },\r\n setUploadMethod(state, uploadMethod) {\r\n state.uploadMethod = uploadMethod;\r\n },\r\n setUploadCopyUrlForm(state, uploadCopyUrlForm) {\r\n state.uploadCopyUrlForm = uploadCopyUrlForm;\r\n },\r\n setCompressConfig(state, { key, value }) {\r\n state.compressConfig[key] = value;\r\n },\r\n setStoreUploadChannel(state, uploadChannel) {\r\n state.storeUploadChannel = uploadChannel;\r\n },\r\n setStoreChannelName(state, channelName) {\r\n state.storeChannelName = channelName;\r\n },\r\n setStoreUploadNameType(state, storeUploadNameType) {\r\n state.storeUploadNameType = storeUploadNameType;\r\n },\r\n setCustomUrlSettings(state, { key, value }) {\r\n state.customUrlSettings[key] = value;\r\n },\r\n setStoreAutoRetry(state, storeAutoRetry) {\r\n state.storeAutoRetry = storeAutoRetry;\r\n },\r\n setAdminUrlSettings(state, { key, value }) {\r\n state.adminUrlSettings[key] = value;\r\n },\r\n setUseDarkMode(state, useDarkMode) {\r\n state.useDarkMode = useDarkMode;\r\n },\r\n setCusDarkMode(state, cusDarkMode) {\r\n state.cusDarkMode = cusDarkMode;\r\n },\r\n setStoreUploadFolder(state, folder) {\r\n state.uploadFolder = folder\r\n localStorage.setItem('uploadFolder', folder)\r\n },\r\n setStoreAutoReUpload(state, autoReUpload) {\r\n state.autoReUpload = autoReUpload;\r\n }\r\n },\r\n actions: {\r\n async fetchUserConfig({ commit }) {\r\n try {\r\n const response = await axios.get('/api/userConfig');\r\n commit('setUserConfig', response.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n async fetchBingWallPapers({ commit }) {\r\n try {\r\n const response = await axios.get('/api/bing/wallpaper');\r\n const wallpapers = response.data.data;\r\n const bingWallPapers = wallpapers.map(wallpaper => {\r\n return {\r\n url: 'https://www.bing.com' + wallpaper.url,\r\n };\r\n }\r\n );\r\n\r\n //预加载图片,阻塞直到图片加载完成\r\n await Promise.all(bingWallPapers.map(wallpaper => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = resolve;\r\n img.onerror = reject;\r\n img.src = wallpaper.url;\r\n });\r\n }));\r\n commit('setBingWallPapers', bingWallPapers);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n },\r\n modules: {\r\n },\r\n plugins: [createPersistedState({\r\n // 只持久化非敏感数据,不持久化认证状态\r\n paths: [\r\n 'userConfig',\r\n 'uploadMethod',\r\n 'uploadCopyUrlForm',\r\n 'compressConfig',\r\n 'storeUploadChannel',\r\n 'storeChannelName',\r\n 'storeAutoRetry',\r\n 'storeUploadNameType',\r\n 'uploadFolder',\r\n 'customUrlSettings',\r\n 'adminUrlSettings',\r\n 'autoReUpload',\r\n 'useDarkMode',\r\n 'cusDarkMode',\r\n ]\r\n })]\r\n})\r\n","import { createI18n } from 'vue-i18n'\r\nimport zhCN from './zh-CN.json'\r\nimport en from './en.json'\r\n\r\nconst LOCALE_KEY = 'app-locale'\r\n\r\nfunction getStoredLocale() {\r\n const stored = localStorage.getItem(LOCALE_KEY)\r\n if (stored === 'zh-CN' || stored === 'en') return stored\r\n return 'zh-CN'\r\n}\r\n\r\nconst i18n = createI18n({\r\n legacy: true,\r\n locale: getStoredLocale(),\r\n fallbackLocale: 'zh-CN',\r\n messages: { 'zh-CN': zhCN, en }\r\n})\r\n\r\nexport function setLocale(locale) {\r\n i18n.global.locale = locale\r\n localStorage.setItem(LOCALE_KEY, locale)\r\n document.documentElement.lang = locale === 'zh-CN' ? 'zh-CN' : 'en'\r\n}\r\n\r\nexport { LOCALE_KEY, getStoredLocale }\r\nexport default i18n\r\n","import { faAws } from '@fortawesome/free-brands-svg-icons/faAws';\r\nimport { faCloudflare } from '@fortawesome/free-brands-svg-icons/faCloudflare';\r\nimport { faDiscord } from '@fortawesome/free-brands-svg-icons/faDiscord';\r\nimport { faAngleDoubleLeft } from '@fortawesome/free-solid-svg-icons/faAngleDoubleLeft';\r\nimport { faAngleDoubleRight } from '@fortawesome/free-solid-svg-icons/faAngleDoubleRight';\r\nimport { faArrowDown } from '@fortawesome/free-solid-svg-icons/faArrowDown';\r\nimport { faArrowLeft } from '@fortawesome/free-solid-svg-icons/faArrowLeft';\r\nimport { faArrowUp } from '@fortawesome/free-solid-svg-icons/faArrowUp';\r\nimport { faBan } from '@fortawesome/free-solid-svg-icons/faBan';\r\nimport { faBars } from '@fortawesome/free-solid-svg-icons/faBars';\r\nimport { faBook } from '@fortawesome/free-solid-svg-icons/faBook';\r\nimport { faBullhorn } from '@fortawesome/free-solid-svg-icons/faBullhorn';\r\nimport { faCalendar } from '@fortawesome/free-solid-svg-icons/faCalendar';\r\nimport { faChartBar } from '@fortawesome/free-solid-svg-icons/faChartBar';\r\nimport { faChartLine } from '@fortawesome/free-solid-svg-icons/faChartLine';\r\nimport { faCheck } from '@fortawesome/free-solid-svg-icons/faCheck';\r\nimport { faCheckSquare } from '@fortawesome/free-solid-svg-icons/faCheckSquare';\r\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown';\r\nimport { faChevronLeft } from '@fortawesome/free-solid-svg-icons/faChevronLeft';\r\nimport { faChevronRight } from '@fortawesome/free-solid-svg-icons/faChevronRight';\r\nimport { faCircleHalfStroke } from '@fortawesome/free-solid-svg-icons/faCircleHalfStroke';\r\nimport { faClock } from '@fortawesome/free-solid-svg-icons/faClock';\r\nimport { faCloud } from '@fortawesome/free-solid-svg-icons/faCloud';\r\nimport { faCloudUpload } from '@fortawesome/free-solid-svg-icons/faCloudUpload';\r\nimport { faCloudUploadAlt } from '@fortawesome/free-solid-svg-icons/faCloudUploadAlt';\r\nimport { faCode } from '@fortawesome/free-solid-svg-icons/faCode';\r\nimport { faCodeBranch } from '@fortawesome/free-solid-svg-icons/faCodeBranch';\r\nimport { faCog } from '@fortawesome/free-solid-svg-icons/faCog';\r\nimport { faCogs } from '@fortawesome/free-solid-svg-icons/faCogs';\r\nimport { faComments } from '@fortawesome/free-solid-svg-icons/faComments';\r\nimport { faCompressAlt } from '@fortawesome/free-solid-svg-icons/faCompressAlt';\r\nimport { faCopy } from '@fortawesome/free-solid-svg-icons/faCopy';\r\nimport { faDatabase } from '@fortawesome/free-solid-svg-icons/faDatabase';\r\nimport { faDownload } from '@fortawesome/free-solid-svg-icons/faDownload';\r\nimport { faEdit } from '@fortawesome/free-solid-svg-icons/faEdit';\r\nimport { faEllipsisH } from '@fortawesome/free-solid-svg-icons/faEllipsisH';\r\nimport { faEllipsisV } from '@fortawesome/free-solid-svg-icons/faEllipsisV';\r\nimport { faExclamation } from '@fortawesome/free-solid-svg-icons/faExclamation';\r\nimport { faExclamationCircle } from '@fortawesome/free-solid-svg-icons/faExclamationCircle';\r\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons/faExclamationTriangle';\r\nimport { faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons/faExternalLinkAlt';\r\nimport { faEye } from '@fortawesome/free-solid-svg-icons/faEye';\r\nimport { faFile } from '@fortawesome/free-solid-svg-icons/faFile';\r\nimport { faFileAlt } from '@fortawesome/free-solid-svg-icons/faFileAlt';\r\nimport { faFileExport } from '@fortawesome/free-solid-svg-icons/faFileExport';\r\nimport { faFileSignature } from '@fortawesome/free-solid-svg-icons/faFileSignature';\r\nimport { faFilter } from '@fortawesome/free-solid-svg-icons/faFilter';\r\nimport { faFolder } from '@fortawesome/free-solid-svg-icons/faFolder';\r\nimport { faFolderOpen } from '@fortawesome/free-solid-svg-icons/faFolderOpen';\r\nimport { faFolderTree } from '@fortawesome/free-solid-svg-icons/faFolderTree';\r\nimport { faGlobe } from '@fortawesome/free-solid-svg-icons/faGlobe';\r\nimport { faHashtag } from '@fortawesome/free-solid-svg-icons/faHashtag';\r\nimport { faHistory } from '@fortawesome/free-solid-svg-icons/faHistory';\r\nimport { faHome } from '@fortawesome/free-solid-svg-icons/faHome';\r\nimport { faICursor } from '@fortawesome/free-solid-svg-icons/faICursor';\r\nimport { faImage } from '@fortawesome/free-solid-svg-icons/faImage';\r\nimport { faImages } from '@fortawesome/free-solid-svg-icons/faImages';\r\nimport { faInbox } from '@fortawesome/free-solid-svg-icons/faInbox';\r\nimport { faInfoCircle } from '@fortawesome/free-solid-svg-icons/faInfoCircle';\r\nimport { faLink } from '@fortawesome/free-solid-svg-icons/faLink';\r\nimport { faList } from '@fortawesome/free-solid-svg-icons/faList';\r\nimport { faMinus } from '@fortawesome/free-solid-svg-icons/faMinus';\r\nimport { faMinusSquare } from '@fortawesome/free-solid-svg-icons/faMinusSquare';\r\nimport { faMoon } from '@fortawesome/free-solid-svg-icons/faMoon';\r\nimport { faMusic } from '@fortawesome/free-solid-svg-icons/faMusic';\r\nimport { faPager } from '@fortawesome/free-solid-svg-icons/faPager';\r\nimport { faPaperPlane } from '@fortawesome/free-solid-svg-icons/faPaperPlane';\r\nimport { faPaste } from '@fortawesome/free-solid-svg-icons/faPaste';\r\nimport { faPlus } from '@fortawesome/free-solid-svg-icons/faPlus';\r\nimport { faQuestionCircle } from '@fortawesome/free-solid-svg-icons/faQuestionCircle';\r\nimport { faQuoteRight } from '@fortawesome/free-solid-svg-icons/faQuoteRight';\r\nimport { faRedo } from '@fortawesome/free-solid-svg-icons/faRedo';\r\nimport { faRobot } from '@fortawesome/free-solid-svg-icons/faRobot';\r\nimport { faSave } from '@fortawesome/free-solid-svg-icons/faSave';\r\nimport { faSearch } from '@fortawesome/free-solid-svg-icons/faSearch';\r\nimport { faServer } from '@fortawesome/free-solid-svg-icons/faServer';\r\nimport { faShareAlt } from '@fortawesome/free-solid-svg-icons/faShareAlt';\r\nimport { faShield } from '@fortawesome/free-solid-svg-icons/faShield';\r\nimport { faShieldAlt } from '@fortawesome/free-solid-svg-icons/faShieldAlt';\r\nimport { faSignOutAlt } from '@fortawesome/free-solid-svg-icons/faSignOutAlt';\r\nimport { faSortAlphaUp } from '@fortawesome/free-solid-svg-icons/faSortAlphaUp';\r\nimport { faSortAmountDown } from '@fortawesome/free-solid-svg-icons/faSortAmountDown';\r\nimport { faSpinner } from '@fortawesome/free-solid-svg-icons/faSpinner';\r\nimport { faSquare } from '@fortawesome/free-solid-svg-icons/faSquare';\r\nimport { faSun } from '@fortawesome/free-solid-svg-icons/faSun';\r\nimport { faSync } from '@fortawesome/free-solid-svg-icons/faSync';\r\nimport { faSyncAlt } from '@fortawesome/free-solid-svg-icons/faSyncAlt';\r\nimport { faTachometerAlt } from '@fortawesome/free-solid-svg-icons/faTachometerAlt';\r\nimport { faTag } from '@fortawesome/free-solid-svg-icons/faTag';\r\nimport { faTags } from '@fortawesome/free-solid-svg-icons/faTags';\r\nimport { faThLarge } from '@fortawesome/free-solid-svg-icons/faThLarge';\r\nimport { faTimes } from '@fortawesome/free-solid-svg-icons/faTimes';\r\nimport { faTools } from '@fortawesome/free-solid-svg-icons/faTools';\r\nimport { faTrashAlt } from '@fortawesome/free-solid-svg-icons/faTrashAlt';\r\nimport { faUpload } from '@fortawesome/free-solid-svg-icons/faUpload';\r\nimport { faUserCog } from '@fortawesome/free-solid-svg-icons/faUserCog';\r\n\r\nexport default [\r\n faAngleDoubleLeft,\r\n faAngleDoubleRight,\r\n faArrowDown,\r\n faArrowLeft,\r\n faArrowUp,\r\n faAws,\r\n faBan,\r\n faBars,\r\n faBook,\r\n faBullhorn,\r\n faCalendar,\r\n faChartBar,\r\n faChartLine,\r\n faCheck,\r\n faCheckSquare,\r\n faChevronDown,\r\n faChevronLeft,\r\n faChevronRight,\r\n faCircleHalfStroke,\r\n faClock,\r\n faCloud,\r\n faCloudflare,\r\n faCloudUpload,\r\n faCloudUploadAlt,\r\n faCode,\r\n faCodeBranch,\r\n faCog,\r\n faCogs,\r\n faComments,\r\n faCompressAlt,\r\n faCopy,\r\n faDatabase,\r\n faDiscord,\r\n faDownload,\r\n faEdit,\r\n faEllipsisH,\r\n faEllipsisV,\r\n faExclamation,\r\n faExclamationCircle,\r\n faExclamationTriangle,\r\n faExternalLinkAlt,\r\n faEye,\r\n faFile,\r\n faFileAlt,\r\n faFileExport,\r\n faFileSignature,\r\n faFilter,\r\n faFolder,\r\n faFolderOpen,\r\n faFolderTree,\r\n faGlobe,\r\n faHashtag,\r\n faHistory,\r\n faHome,\r\n faICursor,\r\n faImage,\r\n faImages,\r\n faInbox,\r\n faInfoCircle,\r\n faLink,\r\n faList,\r\n faMinus,\r\n faMinusSquare,\r\n faMoon,\r\n faMusic,\r\n faPager,\r\n faPaperPlane,\r\n faPaste,\r\n faPlus,\r\n faQuestionCircle,\r\n faQuoteRight,\r\n faRedo,\r\n faRobot,\r\n faSave,\r\n faSearch,\r\n faServer,\r\n faShareAlt,\r\n faShield,\r\n faShieldAlt,\r\n faSignOutAlt,\r\n faSortAlphaUp,\r\n faSortAmountDown,\r\n faSpinner,\r\n faSquare,\r\n faSun,\r\n faSync,\r\n faSyncAlt,\r\n faTachometerAlt,\r\n faTag,\r\n faTags,\r\n faThLarge,\r\n faTimes,\r\n faTools,\r\n faTrashAlt,\r\n faUpload,\r\n faUserCog\r\n];\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_router_view = _resolveComponent(\"router-view\");\n const _component_el_config_provider = _resolveComponent(\"el-config-provider\");\n return _openBlock(), _createBlock(_component_el_config_provider, {\n locale: $options.elementLocale\n }, {\n default: _withCtx(() => [_createVNode(_component_router_view)]),\n _: 1\n }, 8, [\"locale\"]);\n}","import { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nimport zhCnLocale from 'element-plus/es/locale/lang/zh-cn';\nimport enLocale from 'element-plus/es/locale/lang/en';\nexport default {\n data() {\n return {\n osInstance: null,\n imageViewerObserver: null\n };\n },\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode']),\n elementLocale() {\n return this.$i18n.locale === 'zh-CN' ? zhCnLocale : enLocale;\n }\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n this.setupImageViewerObserver();\n });\n },\n beforeUnmount() {\n // 清理 MutationObserver\n if (this.imageViewerObserver) {\n this.imageViewerObserver.disconnect();\n }\n },\n watch: {},\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n this.osInstance = OverlayScrollbars(document.body);\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n this.osInstance = OverlayScrollbars(document.body, {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: 'auto',\n autoHide: 'scroll',\n autoHideDelay: 600,\n dragScroll: true,\n clickScroll: true\n },\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n console.log('OverlayScrollbars initialized successfully');\n } catch (error) {\n console.error('Failed to initialize OverlayScrollbars:', error);\n }\n },\n setupImageViewerObserver() {\n // 监听图片预览器的打开/关闭,动态控制 OverlayScrollbars\n this.imageViewerObserver = new MutationObserver(mutations => {\n const imageViewer = document.querySelector('.el-image-viewer__wrapper');\n if (imageViewer) {\n // 图片预览器打开,禁用滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'hidden'\n }\n });\n }\n } else {\n // 图片预览器关闭,恢复滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n }\n }\n });\n this.imageViewerObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=6633a13d\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\r\nimport { createHead } from '@vueuse/head'; // 导入 createHead\r\nimport ElementPlus from 'element-plus'\r\nimport 'element-plus/es/components/message/style/css'\r\nimport 'element-plus/es/components/message-box/style/css'\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\nimport fontAwesomeIcons from './utils/fontawesomeIcons';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\nimport i18n from './locales'\r\n\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport 'element-plus/theme-chalk/dark/css-vars.css'\r\nimport './styles/global.css'\r\n\r\n// OverlayScrollbars 悬浮滚动条\r\nimport 'overlayscrollbars/overlayscrollbars.css'\r\n\r\n\r\nlibrary.add(...fontAwesomeIcons);\r\n\r\nconst app = createApp(App);\r\nconst head = createHead(); // 创建 head 对象\r\n\r\napp.component('font-awesome-icon', FontAwesomeIcon);\r\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\r\n app.component(key, component)\r\n}\r\n\r\n// 根据 useDarkMode 的值添加或移除 dark 类\r\nconst initDarkModeClass = () => {\r\n const htmlElement = document.documentElement;\r\n let isDarkMode;\r\n\r\n // 判断用户是否是自定义模式\r\n if (store.state.cusDarkMode && store.state.useDarkMode !== null) {\r\n // 用户手动设置了暗色模式\r\n isDarkMode = store.state.useDarkMode;\r\n } else {\r\n // 跟随系统模式或时间\r\n isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n if (!isDarkMode) {\r\n const now = new Date();\r\n const hour = now.getHours();\r\n isDarkMode = hour >= 22 || hour < 6;\r\n }\r\n // 更新 useDarkMode 的值\r\n store.commit('setUseDarkMode', isDarkMode);\r\n }\r\n\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\nconst applyDarkModeClass = (isDarkMode) => {\r\n const htmlElement = document.documentElement;\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\n// 预设网站标题的函数\r\nconst presetSiteTitle = (userConfig) => {\r\n document.title = userConfig?.siteTitle || 'Sanyue ImgHub';\r\n};\r\n\r\n// 预设和更新网站图标的函数\r\nconst presetSiteIcon = (isDarkMode, userConfig) => {\r\n // 同时更改 icon apple-touch-icon 和 mask-icon\r\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\r\n existingIcons.forEach(icon => icon.remove());\r\n\r\n const iconLink = document.createElement('link');\r\n const appleIconLink = document.createElement('link');\r\n const maskIconLink = document.createElement('link');\r\n iconLink.rel = 'icon';\r\n appleIconLink.rel = 'apple-touch-icon';\r\n maskIconLink.rel = 'mask-icon';\r\n\r\n if (isDarkMode) {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n }\r\n\r\n document.head.appendChild(iconLink);\r\n document.head.appendChild(appleIconLink);\r\n document.head.appendChild(maskIconLink);\r\n};\r\n\r\nstore.dispatch('fetchUserConfig').then(() => {\r\n // 初始化时应用 dark 模式\r\n initDarkModeClass();\r\n\r\n // 预设网站标题和图标\r\n presetSiteTitle(store.getters.userConfig);\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n\r\n // 监听 useDarkMode 和 cusDarkMode 的变化\r\n store.subscribe((mutation, state) => {\r\n if (mutation.type === 'setUseDarkMode' && store.state.cusDarkMode) {\r\n applyDarkModeClass(state.useDarkMode);\r\n // 同时更新网站图标\r\n presetSiteIcon(state.useDarkMode, store.getters.userConfig);\r\n }\r\n\r\n // 监听 cusDarkMode 变化,当设置为 false 时重新初始化\r\n if (mutation.type === 'setCusDarkMode' && !mutation.payload) {\r\n // 切换到跟随系统模式,重新初始化\r\n initDarkModeClass();\r\n // 同时更新网站图标\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n }\r\n });\r\n\r\n app.use(store).use(router).use(ElementPlus).use(i18n).mount('#app');\r\n}).catch(error => {\r\n console.error('Failed to load user configuration:', error);\r\n app.use(store).use(router).use(ElementPlus).use(i18n).use(head).mount('#app');\r\n})\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"51\":\"6e7bf298\",\"142\":\"fc366b6d\",\"226\":\"ec43855c\",\"396\":\"b3b6ae37\",\"528\":\"f7e99a9f\",\"529\":\"287c329f\",\"600\":\"08192622\",\"604\":\"a1f7358f\",\"718\":\"27080555\",\"728\":\"3968461e\",\"917\":\"b77a6783\",\"997\":\"7b6c8b5a\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"51\":\"1dd65d6c\",\"226\":\"6548e7b4\",\"385\":\"20c34d33\",\"396\":\"3a3d9729\",\"451\":\"7e03bef9\",\"528\":\"4c6718b2\",\"529\":\"6c0a8231\",\"604\":\"1353235b\",\"718\":\"d0974d1c\",\"728\":\"1353235b\",\"915\":\"52b943c1\",\"917\":\"8529ad1e\",\"997\":\"87fa4059\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"sanyue_imghub:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"51\":1,\"226\":1,\"385\":1,\"396\":1,\"451\":1,\"528\":1,\"529\":1,\"604\":1,\"718\":1,\"728\":1,\"915\":1,\"917\":1,\"997\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(385|451|915)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunksanyue_imghub\"] = self[\"webpackChunksanyue_imghub\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(81525); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","withCredentials","adminAuthGuard","to","from","next","get","then","res","data","adminRequired","store","commit","valid","authType","wasLoggedIn","state","adminLoggedIn","name","ElMessage","error","i18n","global","t","catch","userAuthGuard","userRequired","userLoggedIn","routes","path","component","beforeEnter","router","createRouter","history","createWebHistory","process","createStore","userConfig","bingWallPapers","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","undefined","compressQuality","compressBar","serverCompress","convertToWebp","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode","getters","credentials","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setCredentials","setAdminLoggedIn","loggedIn","setUserLoggedIn","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","key","value","setStoreUploadChannel","uploadChannel","setStoreChannelName","channelName","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","response","console","log","fetchBingWallPapers","wallpapers","map","wallpaper","url","Promise","all","resolve","reject","img","Image","onload","onerror","src","modules","plugins","createPersistedState","paths","LOCALE_KEY","getStoredLocale","stored","createI18n","legacy","locale","fallbackLocale","messages","zhCN","en","setLocale","document","documentElement","lang","faAngleDoubleLeft","faAngleDoubleRight","faArrowDown","faArrowLeft","faArrowUp","faAws","faBan","faBars","faBook","faBullhorn","faCalendar","faChartBar","faChartLine","faCheck","faCheckSquare","faChevronDown","faChevronLeft","faChevronRight","faCircleHalfStroke","faClock","faCloud","faCloudflare","faCloudUpload","faCloudUploadAlt","faCode","faCodeBranch","faCog","faCogs","faComments","faCompressAlt","faCopy","faDatabase","faDiscord","faDownload","faEdit","faEllipsisH","faEllipsisV","faExclamation","faExclamationCircle","faExclamationTriangle","faExternalLinkAlt","faEye","faFile","faFileAlt","faFileExport","faFileSignature","faFilter","faFolder","faFolderOpen","faFolderTree","faGlobe","faHashtag","faHistory","faHome","faICursor","faImage","faImages","faInbox","faInfoCircle","faLink","faList","faMinus","faMinusSquare","faMoon","faMusic","faPager","faPaperPlane","faPaste","faPlus","faQuestionCircle","faQuoteRight","faRedo","faRobot","faSave","faSearch","faServer","faShareAlt","faShield","faShieldAlt","faSignOutAlt","faSortAlphaUp","faSortAmountDown","faSpinner","faSquare","faSun","faSync","faSyncAlt","faTachometerAlt","faTag","faTags","faThLarge","faTimes","faTools","faTrashAlt","faUpload","faUserCog","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","_component_el_config_provider","elementLocale","default","_","osInstance","imageViewerObserver","computed","this","$i18n","mounted","$nextTick","initOverlayScrollbars","setupImageViewerObserver","beforeUnmount","disconnect","watch","methods","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","MutationObserver","imageViewer","querySelector","options","observe","childList","subtree","__exports__","library","add","fontAwesomeIcons","app","createApp","App","head","createHead","FontAwesomeIcon","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","isDarkMode","window","matchMedia","matches","now","Date","hour","getHours","classList","remove","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","existingIcons","querySelectorAll","forEach","icon","iconLink","createElement","appleIconLink","maskIconLink","rel","href","siteIcon","appendChild","dispatch","subscribe","mutation","type","payload","use","ElementPlus","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","push","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","event","clearTimeout","timeout","doneFns","parentNode","removeChild","setTimeout","bind","target","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","nonce","onLinkComplete","errorType","realHref","err","Error","code","request","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","test","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","__webpack_exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/app.4c47588b.js.map.gz b/frontend-dist/js/app.4c47588b.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..6ff544af932fbb82502d8f40b8f599e1a1558d0d GIT binary patch literal 18560 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�u-ZZL4`Xl=z5MYo?86*NkVGAhd=P6Xg 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 LXxbsVV*vpGJh?$D